ホームページ データベース mysql チュートリアル 构建自己的百度地图坐标纠偏数据库

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

Jun 07, 2016 pm 03:36 PM
http 地図 座標 データベース 構築する 百度 私自身の

转 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,直接经度和纬度一起作为主键。

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

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Deepseek Webバージョンの入り口Deepseek公式ウェブサイトの入り口 Deepseek Webバージョンの入り口Deepseek公式ウェブサイトの入り口 Feb 19, 2025 pm 04:54 PM

DeepSeekは、Webバージョンと公式Webサイトの2つのアクセス方法を提供する強力なインテリジェント検索および分析ツールです。 Webバージョンは便利で効率的であり、公式ウェブサイトは包括的な製品情報、ダウンロードリソース、サポートサービスを提供できます。個人であろうと企業ユーザーであろうと、DeepSeekを通じて大規模なデータを簡単に取得および分析して、仕事の効率を向上させ、意思決定を支援し、イノベーションを促進することができます。

Baidu Apollo、L4自動運転に対応した世界初の大型モデル「Apollo ADFM」を発売 Baidu Apollo、L4自動運転に対応した世界初の大型モデル「Apollo ADFM」を発売 Jun 04, 2024 pm 08:01 PM

5月15日、Baidu Apolloは武漢Baidu キャロット Auto Robot Zhixing Valleyで2024年アポロデーを開催し、過去10年間におけるBaiduの自動運転における大きな進歩を包括的に実証し、大型モデルと乗客の安全性の新たな定義に基づいた技術的飛躍をもたらした。世界最大の自動運転ネットワークである百度は、自動運転を人間の運転よりも安全なものにしました。このおかげで、より安全、より快適、環境に優しい、低炭素の旅行方法が理想から現実へと変わりつつあります。百度グループ副社長兼インテリジェント・ドライビング・ビジネス・グループ社長の王雲鵬氏はその場で「自動運転車を開発するという私たちの本来の目的は、より良い旅行への人々の高まる切望を満たすことだ。人々の満足こそが私たちの原動力である。なぜなら安全性、とても美しいので、見ることができて嬉しいです

Google マップで一目でわかるルートを使用する方法 Google マップで一目でわかるルートを使用する方法 Jun 13, 2024 pm 09:40 PM

サービス開始から 1 年後、Google マップは新しい機能をリリースしました。地図上に目的地までのルートを設定すると、移動ルートがまとめられます。旅行が始まると、携帯電話のロック画面からルート案内を「参照」できます。 Google マップを使用すると、到着予定時刻とルートを確認できます。旅行中は、ロック画面でナビゲーション情報を表示できます。また、携帯電話のロックを解除すると、Google マップにアクセスせずにナビゲーション情報を表示できます。携帯電話のロックを解除すると、Google マップにアクセスせずにナビゲーション情報を表示できます。携帯電話のロックを解除すると、Google マップにアクセスせずにナビゲーション情報を表示できます。 携帯電話のロックを解除すると、Google マップにアクセスせずにナビゲーション情報を表示できます。 Google マップにアクセスせずにナビゲーション情報を表示できます。

PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル Jun 04, 2024 pm 01:42 PM

MySQLi を使用して PHP でデータベース接続を確立する方法: MySQLi 拡張機能を含める (require_once) 接続関数を作成する (functionconnect_to_db) 接続関数を呼び出す ($conn=connect_to_db()) クエリを実行する ($result=$conn->query()) 閉じる接続 ( $conn->close())

iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます Jul 18, 2024 am 05:48 AM

Apple の最新リリースの iOS18、iPadOS18、および macOS Sequoia システムでは、さまざまな理由で紛失または破損した写真やビデオをユーザーが簡単に回復できるように設計された重要な機能が写真アプリケーションに追加されました。この新機能では、写真アプリのツール セクションに「Recovered」というアルバムが導入され、ユーザーがデバイス上に写真ライブラリに含まれていない写真やビデオがある場合に自動的に表示されます。 「Recovered」アルバムの登場により、データベースの破損、カメラ アプリケーションが写真ライブラリに正しく保存されない、または写真ライブラリを管理するサードパーティ アプリケーションによって失われた写真やビデオに対する解決策が提供されます。ユーザーはいくつかの簡単な手順を実行するだけで済みます

AIツールのおすすめ AIツールのおすすめ Nov 29, 2024 am 11:08 AM

この記事では、Douyin Doubao、Wenxin Yige、Tencent Zhiying、Baidu Feipiao EasyDL、Baidu AI Studio、iFlytek Spark Cognitive Large Model を含む 6 つの人気 AI ツールを紹介します。これらのツールは、テキスト作成、画像生成、ビデオ編集、AI モデル開発などのさまざまな機能をカバーしています。適切な AI ツールを選択するには、機能要件、技術レベル、コスト予算などの要素を考慮する必要があります。これらのツールは、AI 支援を必要とする個人や企業に便利で効率的なソリューションを提供します。

PHP でデータベース接続エラーを処理する方法 PHP でデータベース接続エラーを処理する方法 Jun 05, 2024 pm 02:16 PM

PHP でデータベース接続エラーを処理するには、次の手順を使用できます。 mysqli_connect_errno() を使用してエラー コードを取得します。 mysqli_connect_error() を使用してエラー メッセージを取得します。これらのエラー メッセージをキャプチャしてログに記録することで、データベース接続の問題を簡単に特定して解決でき、アプリケーションをスムーズに実行できるようになります。

Go WebSocket はどのようにデータベースと統合しますか? Go WebSocket はどのようにデータベースと統合しますか? Jun 05, 2024 pm 03:18 PM

GoWebSocket をデータベースと統合する方法: データベース接続をセットアップする: データベースに接続するには、database/sql パッケージを使用します。 WebSocket メッセージをデータベースに保存する: INSERT ステートメントを使用して、メッセージをデータベースに挿入します。データベースから WebSocket メッセージを取得する: データベースからメッセージを取得するには、SELECT ステートメントを使用します。

See all articles