由于测绘局对互联网地图的加密规定以及各个互联网地图处于自身利益的考虑,各个互联网地图公司的坐标系统、地图瓦片组织方式、切片规则等都不各尽相同,因此导致一套坐标数据很难在另一套地图中进行展示,如目前咱们项目组正在实施的“易行杭州”项目需要将杭州公交集团的公交自行车数据在百度地图上进行叠加展示与查询就遇到此类问题。
杭州公交公司的坐标系统未知、但可以从其页面上将所有的自行车空间分布数据down下来,下载的数据为经纬度格式,众所周知,经纬度是一个球面坐标,目前电脑上地图展示在一个平面上,因此所有的瓦片组织方式肯定是一个平面的方式,需要去分析和猜解其采用的椭球基准以及投影参数是比较困难的!但既然是平面坐标,在一个城市级别的小范围内利用四参数进行仿射变换是完全能够满足日常普通的导航定位作用的。
两个不同坐标系统的坐标进行互相转换时,最重要的是必须找出其间的转换参数,这点约等于废话,目前几乎看不到哪里有直接提供转换参数的。另外一种方式就是自己对两套坐标分析求解转换参数,求转换参数的最关键的一步是找出两个不同坐标系统中的同名控制点(不是测量中的控制点)在两个不同坐标系中的不同坐标。然后就可以根据数学公式进行转换了。四参数的仿射变换的计算公式很简单:
x1 = a * x0 + b * y0 + c
y1 = m * x0 + n * y0 + d
其中(a,b,c,m,n,d)就是需要求的参数,咋一看,有点不对啊,这明明有六个未知数了嘛,其实中间是有内在关系可以省略掉两个参数的,最后算的其实就一个旋转角度、两个偏移参数deltX,deltY,再加一个放缩因子k,上面的公式推导可以用纸在图上画一下就出来了,推荐采用数学中的极坐标方式,此处就不仔细推导了,需要转换公式程序代码的,可以联系本作者:QQ:450380306
上面的文字主要是向读者解释平面坐标转换的原理的,用户可以方便地自己编写程序去实现坐标转换的程序,本人以前也采用这种方式,程序也是有的,可惜每次用起来或者找起来就比较麻烦,推荐使用Coord.exe,但这样有个缺陷就是不能看到转换的效果,现在俺就讲讲利用ArcGIS软件讲解下怎么实现坐标转换。
下面以百度地图坐标系统和杭州规划局提供的地理信息公共服务平台两套坐标之间的转换为例进行讲解:
步骤1:放大到百度地图的最大比例尺级别(就是看的最清晰地一层,百度的是第19层),下载所有的瓦片拼接成一整个地图,为了便于后面的刺点和配准,最好将每个瓦片画上方框,有点像测绘领域里数据处理过程中的结合表,其实用的就是结合表的思想。如下图
图中蓝色数字表示百度瓦片的行列行,可以用下面的地址检测http://q8.baidu.com/it/u=x=104486;y=27497;z=19;v=011;type=web&fm=44,u=x=行号,y=列号
上面的图片可以将其加载在ArcGIS中,但这个时候,这个图片还只是一个图片,目前还没有空间信息,因此需要将其在ArcMap中进行配准,百度地图API说其坐标系统采用的Mercator投影,但没具体说明采用的是哪种魔卡托投影,魔卡托投影那么多,这就是国内公司国外公司的一个很大区别!人家一般都是趋向于开放,而国内恨不得什么都保密!像ArcGIS软件体系做为国外GIS软件第一厂商,现在也在慢慢的将各个内部细节进行公布,可想而知软件后面的时代将会是开放的时代!有点偏题了,继续回来讲配准的问题。
为什么要配准呢?因为配准后你图片上每个像素就都有了空间信息,这样你就能找出任意一个位置的精确坐标!这样方便找出同名点,因为找同名点最好是找位置明显、特征明显易于区分的点。要配准就必须首先找出图片上至少两个点的空间位置,这很容易得出!前面已经讲过百度地图分辨率参数的文章,咱们可以根据瓦片的行列号和缩放级别,计算出每个瓦片左上角的平面坐标来。具体的计算公式如下:
x = 256 * col / Math.power(2, level - 18 )
y = 256 * (row + 1 ) / Math.Power( 2, level - 18 )
计算出一系列的点和行列号,然后将其生成shp数据,这样到时候就可以采用ArcGIS的捕捉功能进行精确的配准!
ArcGIS的Georefrence这里就不详细讲解了,就是选择图上两点然后和对应的空间点进行关联就自动匹配了,为了精准匹配,在Link table里可以输入图片的精确像素值和实际坐标值,这样配准的精度和理论值一样!
上图中,红色的点为按照图上行列上生成的各个shp点,都带有坐标,可以看出,上面各种推论均正确,鼠标随便移动到每个位置都能显示其精确的百度平面坐标!
如法炮制,生成杭州市规划局的配准地图
时间关系,先写到这里。
To be continued......