﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GPS软件平台开发技术博客 &#187; GPS纠偏</title>
	<atom:link href="http://www.jt808.com/?feed=rss2&#038;tag=gps%E7%BA%A0%E5%81%8F" rel="self" type="application/rss+xml" />
	<link>http://www.jt808.com</link>
	<description>帮助IT团队快速构建符合部标的GPS和视频平台(2379423771@qq.com)</description>
	<lastBuildDate>Sun, 03 Nov 2024 04:30:16 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<item>
		<title>GPS部标平台的架构设计(五)-地图服务算法库</title>
		<link>http://www.jt808.com/?p=552</link>
		<comments>http://www.jt808.com/?p=552#comments</comments>
		<pubDate>Tue, 16 Sep 2014 03:16:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[GPS系统]]></category>
		<category><![CDATA[部标监控平台]]></category>
		<category><![CDATA[GB35658过检与认证]]></category>
		<category><![CDATA[GPS偏移]]></category>
		<category><![CDATA[GPS纠偏]]></category>
		<category><![CDATA[电子围栏]]></category>
		<category><![CDATA[百度地图纠偏加偏]]></category>

		<guid isPermaLink="false">http://www.ltmonitor.com/blog/?p=552</guid>
		<description><![CDATA[&#160; GPS平台，需要和各种地图打交道，需要解决一下的问题： 1.坐标偏移，这个不用多说，需要将原始坐 [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>GPS平台，需要和各种地图打交道，需要解决一下的问题：</p>
<p>1.坐标偏移，这个不用多说，需要将原始坐标加偏，然后在地图上显示出来；</p>
<p>2.坐标解偏，或者纠偏，就是用户在地图上画出的各种区域，标注，发送到后台存储的坐标都是偏移的，这就面临一个严重的问题，因为在部标808协议中，对于区域报警，需要将区域的顶点坐标，下发给终端，终端在实际运行中，不断用GPS坐标和区域坐标进行比对，来判断是否是进入区域报警，还是离开区域报警。如果区域坐标是偏移的，那么判断出来必然是错误的。所以下发前，必须要将偏移的坐标逆向再还原成原始的基于wgs84坐标系的坐标出来。</p>
<p>3.区域报警，GPS部标平台也要求电子围栏的功能，就是要求平台支持区域报警，也就是说，如果终端没有这个功能，平台也是可以自己来分析GPS位置，来进行区域报警。那么部标平台就要提供圆形、多边形、矩形区域的判断算法。</p>
<p>4.路线偏移，部标规定部标平台在过检测的时候，必须要测试路线偏移报警，所以部标平台也要提供路线偏移的判断算法。</p>
<p>5.地理位置，用户需要知道车辆的地理位置的文字信息，需要知道报警时的具体地点，很多平台在报表中仅仅显示了个经纬度坐标，这个是很让人恼火的。所以在后台需要提供获取地理位置的接口，在报警的时候，记录下地理位置。保存到数据库中，再形成报表显示。</p>
<p>所以我们在设计的过程中，坚决屏弃掉掉远程调用百度地图SDK http接口之类的方法，因为无法容忍Http调用的次数限制、性能损失和网络问题带来的Timeout等不可预料的未知错误，所以坚决设计一个底层的算法服务库，提供给其他开发人员使用，<span style="color: rgb(51, 51, 51); font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; line-height: 24px;">因为是纯算法，上本地可以无限次调用，也不用担心性能问题，在开发方法上由于是直接调用转换，对于程序员开发效率也是大大提升。</span></p>
<p style="margin: 0px 0px 10px; padding: 0px; color: rgb(51, 51, 51); font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; line-height: 24px;">解决了最难解决的百度坐标加偏和反向纠偏的问题，纯算法代码，不调用百度地图的SDK API，而且提供了百度所没有的反向纠偏的算法，可以将手机百度地图的坐标直接反向解析成原始GPS坐标(wgs84坐标系）。</p>
<p style="margin: 0px 0px 10px; padding: 0px; color: rgb(51, 51, 51); font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; line-height: 24px;">百度地图、谷歌地图、高德地图、四维地图、GPS终端设备坐标直接可以灵活互转，再也不用受限于远程调用http接口的性能损失和网络中断的麻烦。</p>
<p style="margin: 0px 0px 10px; padding: 0px; color: rgb(51, 51, 51); font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; line-height: 24px;">&nbsp;</p>
<p>现在提供了一个在线的动态库，供大家试用，离线的动态库DLL和源码需要购买(<strong style="font-size: 16px;"><u><span style="color: rgb(0, 0, 0); font-family: 'lucida Grande', Verdana, 'Microsoft YaHei'; line-height: 18px;">2379423771@qq.com)</span></u></strong>，<a href="http://www.jt808.com/wp-content/plugins/download-monitor/download.php?id=20" style=""><img src="http://www.ltmonitor.com/blog/wp-content/uploads/2011/08/Download-17.png" alt="GPS算法服务库Demo" />GPS算法服务库Demo 已下载 2510 次</a></p>
<p>调用方法如下：</p>
<pre class="brush:csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MapServiceClient;
using MapServiceClient.MapFix;
using GpsNET.CoordService;
using GpsNET;
/**
 *@author: www.ltmonitor.com
 *@email: speed.zheng@gmail.com
 */
namespace MapServiceDemo
{
    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 &lt; 50; m++)
            {
                double lng = 121.122 + m * 0.01;
                double lat = 33.222 + m * 0.01;


                //百度坐标加偏
                MyPointLatLng pt1 = service.Fix(lng, lat, &quot;baidu&quot;);

                /**
                 *反向还原成原始的GPS坐标
                 */
                MyPointLatLng pt2 = service.Reverse(pt1.Lng, pt1.Lat, &quot;baidu&quot;);

                /**
                 * 获得两点之间的误差距离,单位米
                 */
                double d = service.GetDistanceByMeter(lng, lat, pt2.Lng, pt2.Lat);

                Console.WriteLine(&quot;百度坐标还原后，两点之间的误差精度:&quot; + d + &quot;米&quot;);

                //火星坐标系(如谷歌，高德)坐标加偏
                pt1 = service.Fix(lng, lat, &quot;google&quot;);
                /**
                 *反向还原成原始的GPS坐标
                 */
                pt2 = service.Reverse(pt1.Lng, pt1.Lat, &quot;google&quot;);

                /**
                 * 获得两点之间的误差距离,单位米
                 */
                d = service.GetDistanceByMeter(lng, lat, pt2.Lng, pt2.Lat);

                Console.WriteLine(&quot;谷歌坐标还原后，两点之间的误差精度:&quot; + d + &quot;米&quot;);

            }


            Console.ReadLine();
        }
    }
}

原始坐标，和经过加偏再解偏后的坐标比较，误差精度在1米左右，非常精确。运行结果如下：

</pre>
<p><img alt="" height="887" src="http://www.ltmonitor.com/blog/wp-content/uploads/testmapfix.JPG" width="639" /></p>
<p> (9979)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jt808.com/?feed=rss2&#038;p=552</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
