提供一个谷歌(腾讯)、百度地图纠偏数据库
丽水市汽车运输集团股份有限公司信息中心苟安廷
在天朝特有的加偏让开发者不胜其烦,地图纠偏也就一直是开发者头疼,关于加偏、纠偏的详细描述网上一大堆,可以自己搜搜,这里简介一下,就是我们接收到的GPS坐标如果直接显示到电子地图上,和实际位置有很大的偏移,必须把GPS坐标加上一定的偏移量再显示到电子地图上才能反映真正的位置。纠偏的方法主要有两种:
1.地图厂商(或第三方)提供的在线接口,通常是通过webservice服务供调用,传入GPS坐标,返回地图坐标,这种方式的缺点很明显:(1)速度慢,难以满足大量数据并发,且由于网络等原因容易失败,(2)无法在数据库直接操作,比如需要将车辆运行轨迹批量返回。
2.纠偏数据库,地图加偏不是线性的,没有公式可套用,但同一区域的偏移量差不多,因此,我们按0.01度把中国版图划成不同的小区域,坐标落在哪个区域,就取出这个区域的偏移值,和GPS坐标相加就可以了,网上这类数据库通常是需要银子的。
本人为工作方便,自己创建了谷歌(腾讯纠偏和谷歌完全一样)、百度两种地图的纠偏库,创建方法参考我的另外一篇博客构建自己的百度地图坐标纠偏数据库(http://blog.****.net/gatr/article/details/21520737),覆盖范围从东经73.5度~135度,北纬18~54度,完全可以满足日常需求了,参考范围如下:
数据库采用了sqlserver 2005备份,你可以还原到sqlserver 2005或sql server2008上,其他版本的数据库那就无能为力了,只有先导入到sql server,再通过链接服务器导入吧。
经纬度均按百万分之一度存放,typeno表示地图类型,0表示谷歌(腾讯)地图,1表示百度地图,后面是对应的经纬度偏移量,作为示例,我还写了一个存储过程,根据传入的GPS坐标和地图类型,返回地图坐标:
CREATE PROCEDURE [dbo].[GetMapCoordinate]
@Lng INT, --GPS坐标经度,百万分之一度
@Lat INT, --GPS坐标纬度度,百万分之一度
@MapTypeNo TINYINT --地图编号,0:谷歌/腾讯,1:百度
AS
BEGIN
SET NOCOUNTON;
SELECT @Lng=@Lng+LngOffset,@Lat=@Lat+LatOffset
FROM dbo.Offset
WHERE lng=@Lng/10000*10000 --转换成.01度
AND lat=@Lat/10000*10000 --转换成.01度
AND typeno=@MapTypeNo
SELECT @LngAS Lng,@Lat AS Lat
END
使用效果:传入经度(120.123456)、纬度(28.123456)和地图编号(谷歌腾讯地图),返回对应的地图坐标,注意,都是百万分之一度,显示到地图上时,必须除以100万。
如果你需要批量返回,可以用LEFT JOIN查询直接返回,你应该在自己的表中增加两个字段,存放GPS坐标对应的区域特征值,也就是将GPS坐标的经纬度分别精确到0.01度,或者说,你将GPS经纬度(百万分之一度)/10000*10000就得到了特征值,字段示意如下:
GPS经度 |
GPS纬度 |
经度特征值 |
纬度特征值 |
其他字段 |
120123456 |
28123456 |
120120000 |
28120000 |
… |
需要返回对应的百度地图坐标,参照下面的语法:
SELECT A.*,
A.GPS经度+ISNULL(B.LngOffset,0) AS地图经度,
A.GPS纬度++ISNULL(B.LatOffset,0) AS地图纬度
FROM MyTable A LEFT JOIN LngLatOffset B
ON A.经度特征值=B.lng AND A.经度特征值=B.lat AND B.typeno=1
上传成功后,我将在评论中给出下载链接。