search
HomeDatabaseMysql Tutorial构建自己的百度地图坐标纠偏数据库
构建自己的百度地图坐标纠偏数据库Jun 07, 2016 pm 03:36 PM
httpmapcoordinatedatabaseConstructBaidumy own

转 http://blog.csdn.net/gatr/article/details/21520737 丽水市汽车运输集团股份有限公司信息中心 苟安廷 搞GPS相关开发的,无一例外都会碰到坐标纠偏问题,即接收到的GPS坐标,如果直接显示到电子地图上,和实际位置有较大差距,必须在GPS坐标的基础上加上

转 http://blog.csdn.net/gatr/article/details/21520737




丽水市汽车运输集团股份有限公司信息中心 苟安廷

  搞GPS相关开发的,无一例外都会碰到坐标纠偏问题,即接收到的GPS坐标,如果直接显示到电子地图上,和实际位置有较大差距,必须在GPS坐标的基础上加上一个偏移量,才能正确显示,由于偏移是非线性的,而算法又是保密的,故很难获得算法,网上通用的做法就是使用偏移数据库,原理是某一个区域的偏移是差不多的,那么,按0.01度或0.001度等方式,把中国地图分割成很多区域,GPS坐标落在哪个区域,就取出这个区域偏移值,和GPS坐标相加就可以得到地图坐标。中国很大,数据库也很庞大,网上很少有完整的,即使有,也需要付钱,百度地图提供了纠偏接口,传入GPS经纬度,返回地图经纬度,但通过网页接口访问,显然无法满足大规模并发处理,故使用本地偏移库相对靠谱一些。中国大陆(含海南岛)的经纬度大概范围在经度73.5~135度和纬度18~53.6之间,如果按1度一条记录,那么记录数为(53.6-18)*(135-73.5)=2189.4条,显然,1度的跨度太大了,如果0.1度,则需要2189.4*100(10的平方)约22万条记录,如果是0.01度,则需要2189.4万条,已经很庞大了,再精确到0.001,那么,就是21.894亿条了,根据实测,这么高精度没必要,精确到0.01度足矣,也就是说,中国大陆1/100度的偏移库有2189.4万条记录,还是比较大的,我们的车辆并不是在中国大陆任何地方都可以开的,比如车辆是不会开到居民楼顶的,我们实际用到的并不多,你可以参照我的另外一篇博客(点击打开链接)构建一个精简的数据库,这里,我们使用百度地图接口,自己创建一个完整的偏移数据库。结果如下(经纬度、偏移均使用百万分之一度表示):

构建自己的百度地图坐标纠偏数据库

我们先看看百度纠偏接口:

http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=120.434966&y=28.160923

x代表经度,y代表纬度,网站返回如下信息:

{"error":0,"x":"MTIwLjQ0NTg3NzczOTc1","y":"MjguMTYzNjM2MzM0NjU5"}
 

这是一个JSON的数据结构,error=0表示解析成功,x代表纠偏后的经度,y代表纠偏后的纬度,经纬度采用了base64加密,还原后就可以正常取得了,注意,该接口每次返回的结果可能都不一样,也就是我们永远都是接近真实值,但永远都无法得到真实值。

有了这个接口,我们可以通过二次循环,经度从73.5到135循环,每次增加0.01度,纬度亦然,这样就可以自动生成自己的偏移库了。

我们知道,整数的运输速度远远快于浮点数,因此,我们参照部标GPS规定,用百万分之一度来描述经纬度,也就是把经纬度都乘以一百万保存到数据库里面。显然,数据库表至少应该有经度(int)、纬度(int),经度偏移(smallint)、纬度偏移(smallint)几列,由于网络的不稳定性,并不能保证一次性每条都解析成功,因此,还需要增加一列,当解析失败时,做个标记,以便下次重新解析。这里给出我用C#写的调用百度接口进行解析的代码供参考,参数均是百万分之一度:

 

#region 查询百度纠偏坐标

        ///

        ///计算百度地图坐标

        ///

        ///原始经度

        ///原始纬度

        ///百度地图纠偏后的坐标

        public Point GetBaiduPosOff(intLng, int Lat)

        {

            Pointpos = new Point(0,0);

                     //还原到度供接口使用

            doublelng = 0.000001 * Lng, lat = 0.000001 * Lat;

            try

            {

                stringurl = string.Format("http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x={0}&y={1}",

                    lng, lat);

                HttpWebRequestrequest = (HttpWebRequest)WebRequest.Create(url);

                request.Timeout = 5000;

                HttpWebResponseresponse = (HttpWebResponse)request.GetResponse();

                Streamstream = response.GetResponseStream();

                byte[]bytes = new byte[1024];

                intn = stream.Read(bytes, 0, 1024);

                response.Close();

                if(n

                {

                    ShowLog(string.Format("返回长度不正确经度:{0},3:{1}", lng, lat));

                }

                else

                {

                    strings = System.Text.Encoding.UTF8.GetString(bytes).Substring(1,n - 2).Replace("\"","");

                    foreach(string teamins.Split(','))

                    {

                        string[] infos = team.Split(':');

                        if (infos.Length

                        {

                            ShowLog(string.Format("格式不正确,经度:{0},纬度:{1}", lng, lat));

                            break;

                        }

                        string strValue = infos[1];

                        switch (infos[0])

                        {

                            case "error":

                                if (strValue !="0")

                                    ShowLog(string.Format("返回了错误号,经度:{0},纬度:{1},错误号:{2}", lng, lat,strValue));

                                break;

                            case "x":

                                {

                                    byte[] outputb =Convert.FromBase64String(strValue);

                                    strValue = Encoding.Default.GetString(outputb);

                                    pos.X = (int)(double.Parse(strValue)* 1000000);

                                }

                                break;

                            case"y":

                                {

                                    byte[] outputb =Convert.FromBase64String(strValue);

                                    strValue = Encoding.Default.GetString(outputb);

                                    pos.Y = (int)(double.Parse(strValue) * 1000000);

                                }

                                break;

                        }

                    }

 

                }

            }

            catch(Exception ee)

            {

                ShowLog(string.Format("错误,经度:{0},3:{1},错误信息:{2}", lng, lat,ee.Message));

            }

 

            returnpos;

        }

        #endregion

 

传入经纬度(百万分之一度),得到一个Point数据结构,x代表纠偏后的经度(百万分之一度),y代表纬度,如果x或y为0,表示解析失败,需要记录下来下次重新解析。用纠偏后的坐标减去原始坐标,就得到了偏移值,存到数据库就可以了。

例如:

            intnLng = 85000000, nLat = 28000000,nLngOffset=0,nLatOffset=0;

            Pointpt = GetBaiduPosOff(nLng, nLat);

            boolbSuccess = false;

            if(pt.X > 0 && pt.Y > 0)

            {

                nLngOffset = pt.X - nLng;

                nLatOffset = pt.Y - nLat;

                bSuccess = true;

            }

这样,我们就可以把原始坐标、偏移值、是否成功存到数据库了。

有了这个数据库,使用相对比较简单,首先将GPS坐标(百万分之一度)转换到0.01度的经度(GPS坐标/10000*10000),并从数据库取得偏移值,然后将原始GPS和坐标偏移相加即可,参考代码如下:

            int nLng = 85123456,nLat = 28123456;

//从数据库读取偏移

            Pointpt = GetDBOff(nLng / 10000 * 10000, nLat / 10000 * 10000);

            //加上偏移

            nLng += pt.X;

            nLat += nLat;

应该说,整个原理非常简单,真正的困难在于时间,实测了一下,一秒钟大约能解析4~5条,两千多万条记录大概需要两个多月连续工作,恐怕大多数人都是等不及的,要解决也很简单,多线程+多电脑操作,每个线程负责一段,我调用电脑资源比较方便,用了6台服务器,每台开两个程序,一个星期不到全部解析完毕。如果有需要的朋友,我上传到了CSDN下载中心了,具体链接等出来后,我在评论里给出,我自己使用的是sql server 2008 R2,考虑到很多人还是sql server 2005,故我备份为sql server2005的格式,如果你还在使用sql server 2000,那没办法了,只能找一台2005或2008的数据库还原,然后通过链接服务器插入到你的数据库了,别忘了经度、纬度一定要聚族索引,或者干脆去掉id,直接经度和纬度一起作为主键。

构建自己的百度地图坐标纠偏数据库

该方法可能影响了部分人的财路,在此,我表示诚挚的歉意。

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
VUE3入门教程:使用Webpack进行打包和构建VUE3入门教程:使用Webpack进行打包和构建Jun 15, 2023 pm 06:17 PM

Vue是一款优秀的JavaScript框架,它可以帮助我们快速构建交互性强、高效性好的Web应用程序。Vue3是Vue的最新版本,它引入了很多新的特性和功能。Webpack是目前最流行的JavaScript模块打包器和构建工具之一,它可以帮助我们管理项目中的各种资源。本文就为大家介绍如何使用Webpack打包和构建Vue3应用程序。1.安装Webpack

使用CMake构建Linux内核的配置指南使用CMake构建Linux内核的配置指南Jul 06, 2023 pm 02:46 PM

使用CMake构建Linux内核的配置指南概述在Linux开发中,构建和配置内核是一个重要的环节。对于大多数人来说,使用Kconfig和Makefile是最常见的配置方式。然而,使用CMake来构建和配置Linux内核也是一个灵活且强大的选择。本文将介绍如何使用CMake来构建和配置Linux内核,并附上一些代码示例。安装CMake首先,我们需要安装CMak

如何使用Golang构建Web应用程序如何使用Golang构建Web应用程序Jun 24, 2023 pm 02:46 PM

在当前的互联网时代,Web应用程序已成为了人们日常生活中不可或缺的一部分,而且在各种应用场景下都有广泛的应用。无论是电商网站、社交媒体、在线教育平台,还是各种SaaS应用程序,都离不开Web应用程序。随着技术的不断更新迭代,Golang越来越受到Web应用程序开发者的喜爱,下面我们就快速了解如何使用Golang构建Web应用程序。一、为什么使用Golang?

CakePHP中间件:快速构建可扩展的Web应用程序CakePHP中间件:快速构建可扩展的Web应用程序Jul 28, 2023 am 11:33 AM

CakePHP中间件:快速构建可扩展的Web应用程序概述:CakePHP是一个流行的PHP框架,被广泛应用于Web应用程序的开发。其提供了许多功能强大的工具和功能,其中包括中间件。中间件可以帮助我们快速构建和扩展Web应用程序,提高代码的可读性和可维护性。什么是中间件:中间件是在请求被派发给控制器之前或之后执行的一系列操作。它们可以完成许多任务,如身份验证、

如何使用PHP构建智能医疗系统如何使用PHP构建智能医疗系统Jun 11, 2023 pm 05:32 PM

在当今科技迅猛发展的时代,智慧医疗逐渐成为医疗行业的新趋势,而医疗健康的数据化和智能化,更是将如何使用PHP构建智能医疗系统变得尤为重要。本文将介绍PHP如何应用于医疗系统的开发,并结合实例详细探讨。一、智能医疗系统的功能特点首先了解智能医疗系统的主要功能特点,有助于我们更加清晰的构建医疗系统。智能医疗系统的主要特点包括:1、大数据分析预测功能:通过对医学数

在PHP中构建物业管理系统在PHP中构建物业管理系统Jun 11, 2023 am 10:34 AM

随着城市化进程的不断加快和人民生活水平的不断提高,物业管理行业也逐渐成为一个重要的领域。目前,物业管理系统已经成为了物业公司必备的工具,它可以帮助物业公司提高管理效率,优化服务质量,提升客户满意度。本文将介绍在PHP中构建物业管理系统的相关知识。一、物业管理系统的基本功能1.物业收费管理物业收费管理是物业管理系统的核心功能之一,它涉及到物业管理公司对于物业费

使用JavaScript构建在线计算器使用JavaScript构建在线计算器Aug 09, 2023 pm 03:46 PM

使用JavaScript构建在线计算器随着互联网的发展,越来越多的工具和应用开始以在线形式出现。其中,计算器是一类被广泛使用的工具之一。本文将介绍如何使用JavaScript构建一个简单的在线计算器,并提供代码示例。在开始之前,我们需要了解一些基本的HTML和CSS知识。计算器的界面可以使用HTML的表格元素来构建,然后用CSS进行样式设计。以下是一个基本的

基于Swoole构建实时股票交易系统基于Swoole构建实时股票交易系统Aug 08, 2023 am 09:01 AM

基于Swoole构建实时股票交易系统随着互联网技术的发展,股票交易成为了越来越多个人投资者和机构投资者的选择。为了更好地满足投资者的需求,提供更实时、高效的股票交易服务,我们可以借助Swoole这个高性能的PHP扩展来构建一个实时股票交易系统。Swoole是一个基于C语言扩展开发的PHP网络通信框架,它提供了异步、并发、高性能的网络编程特性。使用Swoole

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version