博客原文地点:
我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就一定需要一个转换过程,这个过程就叫做投影(Projection)。在地球上我们通过经纬度来描述某个位置,而颠末投影之后的舆图也有本身的坐标系统,本篇文章就来详细介绍在百度舆图API中涉及的各类坐标体系。
在百度舆图API中,你需要了解如下坐标系:
经纬度:通过经度(longitude)和纬度(latitude)描述的地球上的某个位置。
平面坐标:投影之后的坐标(用x和y描述),用于在平面上标识某个位置。
像素坐标:描述差别级别下舆图上某点的位置。
图块坐标:舆图图块编号(用x和y描述)。
可视区域坐标:舆图可视区域的坐标系(用x和y描述)。
笼罩物坐标:笼罩物相对付容器的坐标(用x和y描述)。
别被这么多的坐标系吓着,看完了后面的讲解相信你会逐渐理解它们。
经纬度
这个就不久不多说了,不熟悉的可以翻翻地舆书。但需要注意的是即便同是经纬度坐标也可能属于差此外坐标体系。一般GPS设备获取的经纬度属于WGS84坐标系,这是一个对照通用的坐标体系。由于某些原因国内不能直接使用WGS84坐标,因此百度舆图API的经纬度是颠末加密偏移的。
平面坐标
前面说过,球面上的形状需要颠末投影才华调动为平面上的形状,调动后就需要有一个平面坐标系统来描述舆图上某个位置。百度舆图API默认使用墨卡托投影(Mercator Projection),同样需要注意的是由于投影参数差别,同样是墨卡托投影也会有所分歧。
平面坐标系的原点与经纬度的原点一致,即赤道与0度经线订交的位置:
在百度舆图API中,平面坐标是以最大级别18级为基准的。就是说在18级下,平面坐标的一个单位就代表了屏幕上的1个像素。平面坐标与舆图所展示的级别没有关系,也就是说在1级和18级下,*位置的平面坐标都是一致的。那么如何知道某个位置的平面坐标呢?可通过BMap.MercatorProjection类来完成,该类供给经纬度与平面坐标互相转换的要领。例如*的经纬度约莫为116.404, 39.915,颠末转换即可得到平面坐标:
var projection =new BMap.MercatorProjection(); var point = projection.lngLatToPoint(new BMap.Point(116.404, 39.915)); alert(point.x +", "+ point.y);
功效如下:
这个就是平面坐标。你可以这样理解它的含义:第18级下,*距离坐标原点的位置差为:12958175, 4825923.77,单位为像素。
像素坐标
在第18级下,我们直接将平面坐标向下取整就得到了像素坐标,而在其他级别下可以通过如下公式进行换算(这里取整为向下取整):
像素坐标 = |平面坐标 × 2 zoom -18|
好比颠末计算,在第4级*位置的像素坐标是:790, 294
差别级别下,同一个地舆位置的像素坐标是不一样的,它与当前舆图的级别相关。
图块坐标
百度舆图API在展示舆图时是将整个舆图图片切割成若干图块来显示的,当舆图初始化或是舆图级别、中心点位置产生变革时,舆图API会按照当前像素坐标计算出视野内需要的图块坐标(也叫图块编号),从而加载对应的图块用以显示舆图。
百度舆图的图块坐标原点与平面坐标一致,从原点向右上方开始编号为0, 0:
如何知道某个位置的图块坐标呢?通过如下公式计算即可(这里为向下取整):
图块坐标 =|像素坐标 ÷ 256|
256实际上是每个图块的宽度和高度,我们用像素坐标除以这个数就知道图块坐标了。还以*为例,在第4级下*地址的图块编号为:3, 1,而在第18级下,图块编号为:50617, 18851
可视区域坐标
舆图都是显示在确定巨细的矩形框中的,这个矩形框凡是是开发者在初始化舆图传入的某个容器元素。这个矩形框也有本身的坐标系,在百度舆图API中称之为可视区域坐标系,它的原点位于矩形的左上角。
通过Map类的pointToPixel和pixelToPoint要领可以彼此转换经纬度坐标与可视区域坐标。
笼罩物坐标