GPS平台,需要和各种地图打交道,需要解决以下的问题:

1.坐标偏移,这个不用多说,需要将原始坐标加偏,然后在百度地图或谷歌上显示出来,需要注意的是百度地图的加偏是偏上再偏,谷歌、高德地图等是火星坐标;

2.坐标解偏,或者纠偏,这个我们也是需要的,因为当用户在地图上画出的各种区域,标注,发送到后台存储的坐标都是基于地图所采用的坐标系统,因而是偏移的,这就面临一个严重的问题,因为在部标808协议中,对于区域报警,需要将区域的顶点坐标,下发给终端,终端在实际运行中,不断用GPS坐标和区域坐标进行比对,来判断是否是进入区域报警,还是离开区域报警。如果区域坐标是偏移的,那么判断出来必然是错误的。所以下发前,必须要将偏移的坐标逆向再还原成原始的基于wgs84坐标系的坐标出来。

3.区域报警,GPS部标平台也要求平台支持区域报警,也就是说,如果终端没有这个功能,平台也是可以自己来分析GPS位置,来进行区域报警。那么部标平台就要提供圆形、多边形、矩形区域的判断算法。

4.路线偏移,部标规定部标平台在过检测的时候,必须要测试路线偏移报警,所以部标平台也要提供路线偏移的判断算法。

5.地理位置,用户需要知道车辆的地理位置的文字信息,需要知道报警时的具体地点,很多平台在报表中仅仅显示了个经纬度坐标,这个是很让人恼火的。所以在后台需要提供获取地理位置的接口,在报警的时候,记录下地理位置。保存到数据库中,再形成报表显示。

6.通常的GPS平台,都会提供至少两个地图给用户使用,如百度、四维、谷歌、高德等,我们的算法必须要使用与所有这些地图。

所以我们在设计的过程中,坚决屏弃掉掉远程调用百度地图SDK http接口之类的方法,因为无法容忍Http调用的次数限制、性能损失和网络问题带来的Timeout等不可预料的未知错误,所以坚决设计一个底层的算法服务库,提供给其他开发人员使用,因为是纯算法,上本地可以无限次调用,也不用担心性能问题,在开发方法上由于是直接调用转换,对于程序员开发效率也是大大提升。

解决了最难解决的百度坐标加偏和反向纠偏的问题,纯算法代码,不调用百度地图的SDK API,而且提供了百度所没有的反向纠偏的算法,可以将手机百度地图的坐标直接反向解析成原始GPS坐标(wgs84坐标系)。

百度地图、谷歌地图、高德地图、四维地图、GPS终端设备坐标直接可以灵活互转,再也不用受限于远程调用http接口的性能损失和网络中断的麻烦。

现在提供了一个在线的动态库(如需购买,离线DLL300元,源码600元)

调用方法如下:

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米左右,非常精确。运行结果如下:

GPS部标平台的架构设计(五)-地图服务算法库的更多相关文章

  1. GPS部标平台的架构设计(四)-百度地图设计

    部标GPS软件平台之百度地图设计 地图是客户端中不可缺少的一个模块,很多人在设计和画图时候,喜欢加上地图引擎这样高大上的字眼,显得自己的平台有内涵,说白了就是用第三方的SDK来开发,早期的GPS监 控 ...

  2. GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台

    在当前很多的GPS平台当中,有很多是基于asp.NET+siverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的 ...

  3. GPS部标平台的架构设计(三) 基于struts+spring+hibernate+ibatis+quartz+mina框架开发GPS平台

    注意,此版本是2014年研发的基于Spring2.5和Struts2的版本,此版本的源码仍然销售,但已不再提供源码升级的服务,因为目前我们开发的主流新版本是2015-2016年近一年推出的基于spri ...

  4. GPS部标平台的架构设计(一)

    设计和开发一个GPS系统似乎并不太难,很多人马上就想到了地图,放大,缩小之类的功能,最多就是在加点报表之类的东西,就成了. 这种观点造成了业界内,很多GPS系统粗制滥造,不堪大用. 事实上,设计和开发 ...

  5. GPS部标平台的架构设计(六)-Android手机客户端和手机查车设计

    对于GPS软件平台,虽然有功能非常丰富的PC端或BS客户端,但是客户也是需要移动客户端来作为自己的辅助工具,也是需要的.做为GPS平台的设计者和开发者,在开发移动客户端的时候,也需要从常规的服务器开发 ...

  6. GPS部标平台的架构设计(九)-GPS监控客户端设计

    交通部的部标过检,所有的测试都是从客户端发起的,也是在客户端体现的,在客户端承载了部标标准所要求的所有的功能,是整个部标平台当中工作量最大的部分,也是最繁琐的部分. 客户端设计面临两个问题: 1.基于 ...

  7. GPS部标平台的架构设计(二) 可扩展性设计

    在设计的前夕,设计人员喜欢把领导对未来业务的期望带入到设计目标当中,比如当前业务也不过是接入几千辆车,未来业务增长也不过几万台,但领导很多激情,强势要求二期平台的接入能力要达到20万台,这个要求带入到 ...

  8. GPS部标监控平台的架构设计(十一)-基于Memcached的分布式Gps监控平台

    部标gps监控平台的架构,随着平台接入的车辆越来越多,架构也面临越来越大的负载挑战,我们当然希望软件尽可能的优化并能够接入更多的车辆,减少在硬件上的投资.但是当车辆增多到某一个临界点的时候,仍然要面临 ...

  9. GPS部标监控平台的架构设计(八)-基于WCF的平台数据通信设计

    总体来讲,GPS部标平台的软件开发是一个对网络通信和应用程序之间通信的技术应用密集型的开发工作,也是有一定设计技术含量的工作. 1.设计通信接口 在设计的时候,根据职责划分,拆分成不同的应用子系统,对 ...

随机推荐

  1. /var/run/yum.pid 已被锁定,PID 为 XXXX 的另一个程序正在运行。

    安装st-load时, 终端提示 “/var/run/yum.pid 已被锁定,PID 为 13908 的另一个程序正在运行.” 解决方法:直接在终端运行 rm -f /var/run/yum.pid ...

  2. 2015年ACM沈阳网络赛(准备做掉4道:)

    Traversal Best Solver Minimum Cut Dividing This Product Excited Database Fang Fang Matches Puzzle Ga ...

  3. call()与apply()

    1.obj1.method1.call(obj2,argument1,argument2) call的作用就是把obj1的方法放到obj2上使用 2. add 来替换 sub,add.call(sub ...

  4. jQuery插件(右击事件)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. enumerate()

    今天我们学一个单词 enumerate 后面加个括号 他就不是单词了,那是什么呢 来看一下 enumerate() a = ('htc', 'oppo', 'vivo', 'huawei', 'mi' ...

  6. python与正则表达式

    匹配一个字符: . 任意非\n字符 [...] \d \D digit \s \S space \w \W word 匹配前一个字符的多个: * 0->> + 1->> ? 0 ...

  7. HDU 5833 Zhu and 772002(高斯消元)

    题意:给n个数,从n个数中抽取x(x>=1)个数,这x个数相乘为完全平方数,求一共有多少种取法,结果模1000000007. 思路:每个数可以拆成素数相乘的形式,例如: x1 2=2^1 * 3 ...

  8. mysql 定时任务

    mysql 5.1以上支持定时任务. SHOW VARIABLES LIKE 'event_scheduler';   检查是否已开启该功能 开启计划任务功能: SET GLOBAL event_sc ...

  9. 键盘和alertView的冲突问题

    冲突现象: textField失去响应收键盘时,如果要弹出一个alertView警告框,就会出现一个现象:在点击了alertView上的事件后,在alertView消失后,会有短暂的出现键盘会再次弹出 ...

  10. eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN

    eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错?java. ...