丽水市汽车运输集团股份有限公司信息中心 苟安廷
在天朝特有的加偏让开发人员不胜其烦,地图纠偏也就一直是开发人员头疼,关于加偏、纠偏的具体描写叙述网上一大堆,能够自己搜搜。这里简单介绍一下,就是我们接收到的GPS坐标假设直接显示到电子地图上,和实际位置有非常大的偏移,必须把GPS坐标加上一定的偏移量再显示到电子地图上才干反映真正的位置。
纠偏的方法主要有两种:
1. 地图厂商(或第三方)提供的在线接口。一般是通过webservice服务供调用,传入GPS坐标,返回地图坐标,这样的方式的缺点非常明显:(1)速度慢,难以满足大量数据并发,且因为网络等原因easy失败。(2)无法在数据库直接操作,比方须要将车辆执行轨迹批量返回。
2. 纠偏数据库,地图加偏不是线性的,没有公式可套用。但同一区域的偏移量差点儿相同,因此,我们按0.01度把中国版图划成不同的小区域。坐标落在哪个区域。就取出这个区域的偏移值,和GPS坐标相加就能够了,网上这类数据库一般是须要银子的。
本人为工作方便,自己创建了谷歌(腾讯纠偏和谷歌全然一样)、百度两种地图的纠偏库,创建方法參考我的另外一篇博客构建自己的百度地图坐标纠偏数据库(http://blog.csdn.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
上传成功后,我将在评论中给出下载链接。