码迷,mamicode.com
首页 > 其他好文 > 详细

GPS部标平台的架构设计(五)-地图服务算法库

时间:2014-09-16 12:21:30      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   使用   ar   for   数据   div   

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

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

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

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

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

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

所以我们在设计的过程中,要设计一个底层的算法服务库,提供给其他开发人员使用,因为算法主要是应用与实时报警分析中,所以算法必须是高效的。

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

现在提供了一个在线的动态库,供大家试用,bubuko.com,布布扣GPS算法服务库Demo 已下载 20 次

调用方法如下:

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

bubuko.com,布布扣

GPS部标平台的架构设计(五)-地图服务算法库

标签:style   blog   http   io   使用   ar   for   数据   div   

原文地址:http://www.cnblogs.com/productivity/p/3974591.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!