1.坐标偏移,这个不用多说,须要将原始坐标加偏,而后在百度地图或谷歌上显示出来,须要注意的是百度地图的加偏是偏上再偏,谷歌、高德地图等是火星坐标;程序员
2.坐标解偏,或者纠偏,这个咱们也是须要的,由于当用户在地图上画出的各类区域,标注,发送到后台存储的坐标都是基于地图所采用的坐标系统,于是是偏移的,这就面临一个严重的问题,由于在部标808协议中,对于区域报警,须要将区域的顶点坐标,下发给终端,终端在实际运行中,不断用GPS坐标和区域坐标进行比对,来判断是不是进入区域报警,仍是离开区域报警。若是区域坐标是偏移的,那么判断出来必然是错误的。因此下发前,必需要将偏移的坐标逆向再还原成原始的基于wgs84坐标系的坐标出来。算法
3.区域报警,GPS部标平台也要求平台支持区域报警,也就是说,若是终端没有这个功能,平台也是能够本身来分析GPS位置,来进行区域报警。那么部标平台就要提供圆形、多边形、矩形区域的判断算法。数据库
4.路线偏移,部标规定部标平台在过检测的时候,必需要测试路线偏移报警,因此部标平台也要提供路线偏移的判断算法。网络
5.地理位置,用户须要知道车辆的地理位置的文字信息,须要知道报警时的具体地点,不少平台在报表中仅仅显示了个经纬度坐标,这个是很让人恼火的。因此在后台须要提供获取地理位置的接口,在报警的时候,记录下地理位置。保存到数据库中,再造成报表显示。性能
6.一般的GPS平台,都会提供至少两个地图给用户使用,如百度、四维、谷歌、高德等,咱们的算法必需要使用与全部这些地图。测试
因此咱们在设计的过程当中,坚定屏弃掉掉远程调用百度地图SDK http接口之类的方法,由于没法容忍Http调用的次数限制、性能损失和网络问题带来的Timeout等不可预料的未知错误,因此坚定设计一个底层的算法服务库,提供给其余开发人员使用,由于是纯算法,上本地能够无限次调用,也不用担忧性能问题,在开发方法上因为是直接调用转换,对于程序员开发效率也是大大提高。google
解决了最难解决的百度坐标加偏和反向纠偏的问题,纯算法代码,不调用百度地图的SDK API,并且提供了百度所没有的反向纠偏的算法,能够将手机百度地图的坐标直接反向解析成原始GPS坐标(wgs84坐标系)。spa
百度地图、谷歌地图、高德地图、四维地图、GPS终端设备坐标直接能够灵活互转,不再用受限于远程调用http接口的性能损失和网络中断的麻烦。设计
如今提供了一个在线的动态库(如需购买,离线DLL300元,源码600元)blog
调用方法以下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MapServiceClient; using MapServiceClient.MapFix; using GpsNET.CoordService; using GpsNET; namespace MapServiceDemo { /** *@author www.ltmonitor.com *@email speed.zheng@gmail.com */ class Program { static void Main(string[] args) { MapServiceClient.MapFix.IMapService service = MapServiceFactory.getMapService(); double lng1 = 121.111; double lat1 = 32.121; //获取地理位置 String location = service.GetLocation(lng1, lat1); Console.WriteLine(location); //测试点是否在圆形区域中 double centerLng = 120; double centerLat = 32;//圆心坐标 double radiusByMeter = 100;//圆形半径,米为单位 Boolean isInCircle = service.IsInCircle(lng1, lat1, centerLng, centerLat, radiusByMeter); //测试点是否在多边形中 MyPointLatLng p = new MyPointLatLng(lat1, lng1); MyPointLatLng p1 = new MyPointLatLng(33.12,121.10); MyPointLatLng p2 = new MyPointLatLng(33.12, 121.10); MyPointLatLng p3 = new MyPointLatLng(33.12, 121.10); MyPointLatLng p4 = new MyPointLatLng(33.12, 121.10); MyPointLatLng[] points = new MyPointLatLng[]{p1,p2,p3};//多边形的顶点 Boolean isInPolygon = service.IsInPolygon(p, points); //测试点是否在矩形中,矩形的左上角和右下角的坐标必需要输入正确,不能搞混 //Boolean isInRect = service.IsInRect(lng1,lat1,lngLeft, latTop,lngRight,latBottom); int offset = 12;//路线偏移的最大距离 Boolean isOnline = service.IsPointOnLine(p, p1, p2, offset); //测试坐标加偏和解偏 for (int m = 0; m < 50; m++) { double lng = 121.122 + m * 0.01; double lat = 33.222 + m * 0.01; //百度坐标加偏 MyPointLatLng pt1 = service.Fix(lng, lat, "baidu"); /** *反向还原成原始的GPS坐标 */ MyPointLatLng pt2 = service.Reverse(pt1.Lng, pt1.Lat, "baidu"); /** * 得到两点之间的偏差距离,单位米 */ double d = service.GetDistanceByMeter(lng, lat, pt2.Lng, pt2.Lat); Console.WriteLine("百度坐标还原后,两点之间的偏差精度:" + d + "米"); //火星坐标系(如谷歌,高德)坐标加偏 pt1 = service.Fix(lng, lat, "google"); /** *反向还原成原始的GPS坐标 */ pt2 = service.Reverse(pt1.Lng, pt1.Lat, "google"); /** * 得到两点之间的偏差距离,单位米 */ d = service.GetDistanceByMeter(lng, lat, pt2.Lng, pt2.Lat); Console.WriteLine("谷歌坐标还原后,两点之间的偏差精度:" + d + "米"); } Console.ReadLine(); } } }
原始坐标,和通过加偏再解偏后的坐标比较,偏差精度在1米左右,很是精确。运行结果以下: