`
tntxia
  • 浏览: 1510804 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于地图显示的一些知识

 
阅读更多

 

1. 墨卡托(Mercator)投影

 

 墨卡托(Mercator)投影,是一种"等角正切圆柱投影”,荷兰地图学家墨卡托(Gerhardus Mercator 1512-1594)在1569年拟定,假设地球被围在一中空的圆柱里,其标准纬线与圆柱相切接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅选定标准纬线上的“墨卡托投影”绘制出的地图。墨卡托投影没有角度变形,由每一点向各方向的长度比相等,它的经纬线都是平行直线,且相交成直角,经线间隔相等,纬线间隔从标准纬线向两极逐渐增大。墨卡托投影的地图上长度和面积变形明显,但标准纬线无变形,从标准纬线向两极变形逐渐增大,但因为它具有各个方向均等扩大的特性,保持了方向和相互位置关系的正确。在地图上保持方向和角度的正确是墨卡托投影的优点,墨卡托投影地图常用作航海图和航空图,如果循着墨卡托投影图上两点间的直线航行,方向不变可以一直到达目的地,因此它对船舰在航行中定位、确定航向都具有有利条件,给航海者带来很大方便。“海底地形图编绘规范”(GB/T 17834-1999,海军航保部起草)中规定1:25万及更小比例尺的海图采用墨卡托投影,其中基本比例尺海底地形图(1:5万,1:25万,1:100万)采用统一基准纬线30°,非基本比例尺图以制图区域中纬为基准纬线。基准纬线取至整度或整分。

 

 

墨卡托投影坐标系取零子午线或自定义原点经线(L0)与赤道交点的投影为原点,零子午线或自定义原点经线的投影为纵坐标X轴,赤道的投影为横坐标Y轴,构成墨卡托平面直角坐标系。

 

背景介绍
墨卡托投影思想是GIS的基石,GPS设备采集的数据是标准的wgs84坐标,各家地图从数据提供商拿到的经纬度数据经过国测局gcj02加密的结果。地球的纬度不可能取到+-90,范围在-85-85。
地图数据处理、渲染都需要转化成平面的笛卡尔坐标系。而墨卡托投影则定义了如何从球面坐标系投影到二维的平面。二维的单位是米,也可以是像素。

 

 

反畸变处理

魔卡托投影最最精妙地地方是y值的处理:用一个奇妙的函数替换了常规的tan函数

替换后结果为

 

 

F(Φ) = ln[ tan(π/4 +Φ/2 ) ]  与T(Φ) =  tan(Φ)的函数曲线如下:

 

 

绿色为T函数,蓝色为F函数,对比发现,当原点附近F函数与y=x函数曲线非常接近,当Φ无限趋近正负π/2时候,tan函数已经趋于无穷,而F函数值仍然处于设定值范围内。F函数趋向无穷的条件值被推迟。
Φ的取值范围为-π/2,π/2,即[-1.57,1.57],地球经纬度近似-85,85,所以最终Φ的取值为-1.5,1.5,即上图中黑色粗线指向的区间。此时F函数值正好位于-π,π。
通过F函数,处理后的纬度值跟经度值范围一致。
从上图可以看出F(Φ) = ln( tan(π/4 + Φ/2) ) 也是关于原点对称的,F(Φ) = -F(-Φ)。通过三角函数可以证明。

 

 

projection: "EPSG:900913", //投影为 900913,google 墨卡托投影 units: "m", //屏幕坐标以米为单位
maxResolution: 156543.0339, //最大比例下的每像素屏幕地图单位值 maxExtent: new OpenLayers.Bounds(-20037508, -20037508,20037508, 20037508.34), numZoomLevels: 17。 这是openlayer中的说明,大多人看不懂哈

解释开始:

1、先了解一个常量,世界一张图。一个像素代表多少米
世界范围,一个256*256的图 就是一个世界地图(如下)。 1个像素代表的米数就是 156543.0339。下面这图的面积就是=世界面积=156543.0339*256 * 156543.0339*256

 

2、其实全世界墨卡托范围是 -20037508, -20037508,20037508, 20037508.34 ,从第四象限到第一象限

其实这个值很简单,就是 -20037508 = -156543.0339*128  ; 为什么称128 呢? 因为 他是256的一半,所以一个像素*128正好代表一个象限的长度,也就是世界的一半长度。

3、切片的级别,比例尺级别

我们一般考虑切片到 18级别 ,maxZoomLevel = 18; 也就是说 世界一张图,被放大到 2的18次方倍哈。宽度、高度同时放大到2的18次方倍

我们用这个函数就可以知道 每个比例尺下,每个像素代表多少米啦。那我们18级别一个像素代表的米为:0.5971642833709717 (一像素不到一米哈)

Map.getZoomUnits = function(zoom)
{
    var zu = [0,0];
    var a = Math.pow(2,(18-zoom));
    zu[0] = 0.5971642833709717 * a;           
    zu[1] = 0.5971642833709717 * a;
    return zu;
};

4、根据墨卡托经纬度定位到x ,y ,z块号。

用点所在的墨卡托 减去 之前的基础墨卡托值,得到相对绝对距离米,再用这个 总米 / 当前比例尺每块代表的米 就知道是在哪一xy块啦
中国一般在第一象限哈

SE.Map.prototype.toMapId = function(point,zoom)
{
    var x=point.MercatorLng-156543.0339*128;
    var y=-156543.0339*128-point.MercatorLat;
    var zu = this.getZoomUnits(zoom,true);
    var spanX = zu[0]*256;//zu[0]为1px代表的纬度,this.imgSize为加载的图片大小(256)
    var spanY = zu[1]*256;//zu[1]为1px代表的经度,this.imgSize为加载的图片大小(256)
    var bx=parseInt(x/spanX);
    var by=parseInt(y/spanY);
    return [bx,by,(x-bx*spanX)/spanX*this.imgSize,(y-by*spanY)/spanY*this.imgSize];
};


附上:经纬度转84、84转经纬度 算法函数:

/**
    w84转为墨卡托坐标(经纬度转墨卡托)
    WGS84是地理坐标的一种,地理坐标本身有很多种,web墨卡托是投影坐标

    lon :    w84经度
    lat :    w84纬度
*/
PG.Tool.forwardMercator = function(lon, lat) {
    lon = parseFloat(lon);
    lat = parseFloat(lat);
    var x = lon * 20037508.34 / 180;
    var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
    y = y * 20037508.34 / 180;       
    return [x,y];
};

/**
    将墨卡托坐标转为w84(墨卡托转经纬度)

    x :    墨卡托经度
    y :    墨卡托纬度
*/
PG.Tool.inverseMercator = function(x, y) {
    var lon = (x / 20037508.34) * 180;
    var lat = (y / 20037508.34) * 180;
    lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
    return [lon, lat];
}

 

 

 

  • 大小: 60.3 KB
  • 大小: 76.1 KB
  • 大小: 3.9 KB
  • 大小: 50.1 KB
0
0
分享到:
评论

相关推荐

    天地图显示定位显示图层

    综上所述,"天地图显示定位显示图层"的实现涉及到了Android网络编程、数据解析、地图渲染、定位服务、手势识别以及性能优化等多个方面的知识。在实际项目中,开发者需要根据具体需求,结合天地图SDK文档,灵活运用...

    百度地图知识详解

    在百度地图中,可以通过编程方式控制不同的图层进行显示或隐藏,根据用户需求和场景提供更加丰富的地图信息。 3. 路径规划 路径规划是指根据用户输入的起点和终点信息,百度地图能够提供多种出行方式的路线规划,...

    点击地图模块显示具体信息对话框

    综上所述,"点击地图模块显示具体信息对话框"这一功能涵盖了地图API的使用、用户交互设计、数据处理、前端开发等多个方面的知识,需要开发者具备跨领域的技能和经验。通过深入理解和实践这些知识点,我们可以创建出...

    知识地图,swfobject.js

    在“知识地图,swfobject.js”这个项目中,它被巧妙地应用到构建一个可分类显示、支持向下级联展开的交互式知识结构图。 首先,我们来理解SWFObject.js的基本功能。SWFObject.js的核心功能是检测用户浏览器是否支持...

    C# winfrom窗体显示百度地图

    本教程将聚焦于如何在VS2015环境下利用WinFroms窗体结合WebBrowser控件来显示百度地图。这一过程涉及到的知识点包括C#编程基础、Windows Forms控件的使用以及HTML和JavaScript的交互。 首先,我们需要理解C# ...

    将gps路线(经纬度)在卫星地图上显示

    标题中的“将GPS路线(经纬度)在卫星地图上显示”指的是使用计算机程序将GPS轨迹数据,即经度和纬度坐标,转化为可视化的地图路径。这个过程涉及到地理信息系统(GIS)的基础知识,以及特定编程语言(如Qt)的应用...

    知识管理里的知识地图部分

    在系统展示和评估阶段,可以看到知识地图在不同领域的应用效果,如医药馆、两性馆、美容馆、健身馆和饮食馆,通过训练前后对比,显示了知识地图在信息分类和推荐上的改善。这些数据显示了知识地图在提升信息检索精确...

    ehart地图数据显示

    对于地图显示,我们需要设置`series`中的`type`为`'map'`,并指定地图的类型,如`mapType: 'china'`表示使用中国地图。同时,可以设置地图的缩放级别、是否可拖动、是否可缩放等属性。 5. 数据绑定:在`series`的...

    Qt地图显示源码

    以下是Qt地图显示涉及的关键知识点和相关细节: 1. **QGraphicsView与QGraphicsScene**:Qt地图显示通常基于QGraphicsView和QGraphicsScene组件。QGraphicsView用于显示场景(QGraphicsScene),而QGraphicsScene...

    nmea定位数据分析和地图显示

    标题中的“nmea定位数据分析和地图显示”指的是利用NMEA(Navigation Message Encoding Standard)协议的数据进行定位信息的分析,并将其结果显示在地图上。NMEA协议是全球定位系统(GPS)接收器通信的一种标准,它...

    高德地图显示、定位、地理编码和地图点击事件(Android)

    以上就是关于“高德地图显示、定位、地理编码和地图点击事件(Android)”的主要知识点。通过理解并熟练运用这些技术,开发者可以创建出功能完善的地图应用,提供用户友好的地图交互体验。在实际开发中,还需注意...

    在百度地图上显示jpg照片

    标题中的“在百度地图上显示jpg照片”是指利用特定的软件或技术,将带有GPS元数据的jpg格式照片与百度地图结合,使照片能够在地图上定位并显示出来。这一功能通常用于旅行记录、地理标记或者资产管理等场景,使得...

    地图图形显示

    在IT领域,地图图形显示是一项重要的技术,尤其在地理信息系统(GIS)中广泛应用。这个话题主要涉及如何处理和展示地图数据,以及实现地图的交互功能,如放大、缩小和移动。我们将深入探讨这些知识点。 首先,地图...

    鼠标移动到地图某个对象时,放大突出显示

    以下是一些关键的知识点: 1. **地图对象**:在SuperMap iObject中,地图对象包括点、线、面等多种类型,每个对象都有自己的属性和几何信息。我们要操作的对象通常是以图层的形式存在于地图中。 2. **事件监听**:...

    百度地图显示

    【百度地图显示】技术主要涉及地图服务的使用,包括定位和车辆轨迹的呈现。在现代生活中,地图服务已经成为我们日常导航、出行规划不可或缺的一部分。百度地图作为国内领先的在线地图服务提供商,提供了丰富的API和...

Global site tag (gtag.js) - Google Analytics