日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

让经纬度数据带矢量方向_惊艳!这样处理可得到细至可用于交通模型的路网数据...

發布時間:2023/12/15 编程问答 88 豆豆
生活随笔 收集整理的這篇文章主要介紹了 让经纬度数据带矢量方向_惊艳!这样处理可得到细至可用于交通模型的路网数据... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【本期看點】

矢量路網數據哪里來? 對著衛星圖一筆一劃描? 從AutoCAD轉換? 從OSM直接下載? 不,以上方法已經OUT了, 不是效率低,就是誤差大,獲取局部道路數據勉強可行,但是要獲取大片區域的路網數據時就行不通了。

本教程將教你如何利用高德導航接口獲取城市矢量路網數據,并剖析路段之間的空間拓撲關系,然后通過OGC空間算法批量處理該關系,最終得到詳細至可直接用于交通模型的路網數據。

? 本期投稿??

作者:許新昆北京交通大學
交通運輸和計算機雙職稱工程師
上得了工地,下得了0/1
致力于用Coding讓交通更智能為什么寫這個教程如果你做城市規劃或者交通規劃,需要一個城市的交通路網矢量數據;如果你做交通設計、交通仿真或者交通模型,那么不但需要路網矢量數據,還需要確保道路的方向、連通性等拓撲問題準確無誤;如果你做交通評價,還進一步需要各路段的歷史和實時路況以及自由流車速。本教程將介紹在沒有任何數據的情況下,如何徒手獲得這些數據。常見的獲取道路矢量數據的方法有三種,一是在沒有任何數據的情況下直接對著衛星圖把道路一條一條描出來;二是基于已有的道路CAD數據,逐條設置道路的方向和連通性;三是下載OSM等開源地圖,同樣也得需要修復方向和連通性。以上三種方法,需要重復的人力勞動,不但效率低,正確率也難以保證。前段時間在做某地級市交通模型的時候,就有獲取整個城市路網的需求,于是花了不少時間仔細研究了高德官方免費的導航接口(官網上叫做”路徑規劃”,由于”導航”叫法更通俗易懂,后文簡稱”導航”)。高德官方只對接口返回規范做了解釋,對路段的空間關系并沒有任何說明,事實上,接口返回的原始路網數據不但在連通性方面有一些問題,而且在不同的時間用完全相同的參數調用接口,返回的路網坐標(經緯度)會稍有偏差,這些原因就導致路段連通性完全斷裂,無法建立理想的拓撲關系。如果你獲取了路網只是用來展示,那問題不大,但是如果想直接導入交通仿真模型等軟件,那在連通性和拓撲性方面就會出大問題。因此在獲得高德導航接口返回的原始路網數據之后,我們還需要進行手動加工,才能滿足交通模型對路網連通性和拓撲性方面的要求。通過分析對比,我總結出一系列空間規則,并將這些抽象規則的識別和處理完全代碼化,最終解決以上所有問題,得到幾乎完美的路網數據。得到的路網數據可以直接導入到交通模型中作為基礎路網,極大地節約了構建路網模型的時間,而且準確率極高,時效性幾乎無敵。因此編寫本教程向大家分享接口背后”隱藏”的路段空間關系,以及如何識別和處理路段空間關系,以幫助大家獲取”完美”路網。Talking is Cheap,Show me the Code。本項目源代碼已在github上開源。本教程包括以下幾個部分:1. 案例效果圖,先看看實際應用場景和效果;2. 技術方案;3. 知識和軟件儲備;4. 詳細的操作實例;5.?源代碼技術架構簡介

1 案例效果圖

?案例1?來個我見過的最復雜的互通,北京西直門立交橋,因為其交通組織過分復雜,被戲稱為”第九奇跡”。第一張圖是網絡地圖,第二張圖是處理完之后得到的道路矢量數據,連通性和方向也已經處理好,我在每條路段的終點畫一個紅色箭頭,用來示意路段的方向和拓撲關系。

PS:在這附近上學曾無數次迷路,

畢業后終于靠寫代碼把路給走通了。

?案例2?來個普通的十字信號交叉口。各方向均可通行,中間十字交叉的”四條線”代表四個進口道的左轉,眼睛看上去是兩條線,實際上是四條,一個箭頭代表一條線,一條線首尾都有箭頭是因為兩條線完全重疊了,只不過他們的方向剛好相反。

?案例3?最后來個環島,這個很容易看懂,我就不多說了.

?2?技術方案

本教程的技術方案簡單來說分為4個步驟:1. 在ArcMap中畫幾個OD點對(起點—終點)作為導航的起終點。當然你也可以用已有的帶經緯度的POI自己去批量構造OD點對;?2. 用JAVA或PYTHON等語言反復調用高德導航接口,將接口返回的所有路段數據做連通性檢查和處理,并轉換為OGC標準格式(GeoJson、WKT等)后保存到空間數據庫;3. 在空間數據庫中利用SQL和存儲過程對路段重復、方向、連通性等一些列問題進行識別和處理,需要用到OGC空間操作符(函數);4. 導出處理好的路段數據為 .SHP格式,供其它軟件如TransCAD、EMME使用。

?

3 知識和軟件儲備

1 申請自己的高德路徑規劃API的key,大家可自行上官網申請。目前這個接口是免費的,并且每天免費調用次數相當多;只要高德手機APP能夠導航到的地方,就能用這個接口;高德路網更新很及時,用這種方法得到的路網是最新數據。2 了解高德導航接口,即高德路徑規劃API的詳細規則,官網地址如下,只需看駕車路徑規劃部分:https://lbs.amap.com/api/webservice/guide/api/direction除了官網說明,補充強調幾點:
  • 一次導航可以得到多個方案,因為你從地點A去地點B有很多種走法,殊途同歸,每種走法對應一種方案;

  • 一個方案有多個step,比如從你家去單位,先上路A,走到頭了右拐進入路B,再右拐進入路C,右拐到D,最后發現今天沒上班右拐回了家。這里的ABCD就分別是一個step,每個step長度為大幾十米到幾百米不等,路比較長的時候一條路會有多個step,對于每一個step,高德給出如下信息:

ACTION:意思是在這條路的終點駕駛員要采取什么動作;DISTANCE:這段step的長度,單位是米;DURATION:駕車通過這段路的時間,單位是秒。應該注意到,把DISTANCE除以DURATION就可以得到這段路的速度,這個很有用,可以寫代碼實現定時x分鐘爬取這條路,爬個一天的數據就可以知道這條路的什么時候堵,還可以計算它的自由流速度,有時間我再另講這個,這里先不展開講。ORIENTATION:道路方向;ROAD:道路名稱;POLYLINE:路段矢量數據, 一條道路由多個經緯度點構成。
  • ?一個step又被拆成多個tmc,從坐標上來看,多個tmc依次首尾相接完全相加等效于step,每段tmc長度一般只有小幾十米,除了有以上字段外(沒有給出DURATION),tmc還多了一個STATUS信息,即路段擁堵信息,取值為:暢通、緩行、擁堵、未知。本教程構建路網模型只用到tmc路段。

3 安裝ArcMap軟件,用于描點以及路段的展示;?4 會用Java或者Python等語言進行批量接口調用,并保存路段數據至空間數據庫;?5 安裝空間數據庫,如Oracle、PostSQL、Mysql等,用來保存路段數據,并進行后期處理。6 對空間數據OGC規范及空間關系判斷與操作有一定了解,相關標準可參考:http://www.gismanual.com/relational/99-049_OpenGIS_Simple_Features_Specification_For_SQL_Rev_1.1.pdf

4 操作實例

為方便大家理解,我以福州市某信號交叉口(高德經緯度為:119.25,26.05)為例,教大家如何一步一步操作,得到最后想要的數據。本實例開發語言為Java,數據庫用Oracle。當然你也可以選擇其他語言或數據庫,不管用哪種語言,業務邏輯和數據規則都是一樣的,因此下文會著重講解方法和思路,而不是具體的語法。對語法感興趣的,可以直接讀源代碼。

1?構造OD點對?

1.1?描點

如圖,在ArcMap中新建點圖層,并添加軟件自帶底圖(ArcGIS底圖默認為高德坐標系)。然后參照底圖在道路四個進口道上分別描兩個點(圖上為紅色的×),馬路兩邊是分開的,因此一邊描一個,共8個點。

1.2?生成起終點坐標

將點圖層導入到空間數據庫,提取這8個點的坐標,將其排列組合得到共計A(8,2)=56組OD點對,用于下一步的導航,部分OD點對如下圖。

2?建立空間表?

在空間數據庫中新建表,用于保存道路數據,表字段及各字段存儲內容參考如下:

其中,polyline 即路段矢量數據是我們最關心的,在Oracle中默認字段類型為SDO_GEOMETRY,在PostSQL中默認字段為Geometry,切記為該字段建立空間索引,因為后期涉及到大量復雜的空間數據處理,有索引跟沒索引情況下的計算時間會差上百倍!?

?3?調用路徑導航接口?

3.1 發送請求

根據高德路徑規劃的接口規則,結合上述OD點對坐標,構造56次導航請求參數,依次調用高德路徑規劃API接口,API參數可參考下圖。

3.2?保存路段數據

將接口返回的路段經緯度信息轉換為GeoJson或WKT等標準空間數據格式(具體轉換成哪種格式取決于你的數據庫類型),并與道路名稱、路況等其它字段一起保存至數據庫,共計約1000條記錄(路段),展示其中一條tmc記錄如下圖。

有兩點需要注意:1 由于我們選取的起點或者終點不能完全落在高德的路網上(而是落在某條路的附近),因此必須忽略(即不保存)每個路徑規劃方案中的第一個tmc和最后一個tmc(什么是tmc請查看前文),否則在后面的拓撲關系處理中會出現瑕疵。當然了,如果你只做路網展示,不要求路網的連通性100%正確,這一步可以無視。2 在絕大多數情況下,該接口返回的多個tmc路段是頭尾連續的,但是在信號交叉口左轉、調頭以及一些匝道出入口等交通組織較為復雜的情況下,路段不連續,為嚴格保證路段連通性,需要寫代碼及時判斷并自動補線,即在斷開的地方補上一條直線。下圖以交叉口左轉為例做個對比,“補線前”是默認路段數據,“補線后”是利用代碼修復連通性后的路段數據。在這個例子中,補的線用來給車輛左轉。

?4 處理路段數據?

從上面步驟可知,導航了56次就產生了約1000條路段,這么小一個交叉口為什么有會這么多路段!? 我們先回頭數一下上面”補線后”這張圖,里面一共還不到20個箭頭,對應只有約20條路段,也就是說1000條路段里面只有20條是最終我們想要的。想要編程篩選出這20條路段,需要對這1000條路段之間的空間關系規則有深刻理解,高德API官網沒有對這種抽象的規則進行任何解釋,我花了整整兩個星期時間才厘清其中的規律,并編程實現了路段的批量識別和處理,這種關系規則比較抽象,很難光靠文字說清,我在下文盡量講的通俗易懂。簡單來說,就是對空間表做笛卡爾乘積,比較兩輛路段之間的空間關系,并進行相應處理。需要處理的關系主要包括 刪除重復道路、處理道路覆蓋、增加交叉口調頭、糾正路段起終點、刪除偽節點這5種,下面逐一講解。

4.1 刪除重復道路

這點很容易想到,1000條路段里面肯定有很多是重復的。問題是怎么篩選并刪掉重復的路段?處理方法:利用OGC規范的EQUALS操作符判斷兩兩路段是否相同(路段由多個經緯度點構成,兩路段的所有經緯度點都相同才滿足EQUALS關系)。另外,EQUALS操作符不會對路段的方向進行判斷,因此需要額外判斷路段的起終點也分別相同,即判斷條件有三個:a 路段1和路段2滿足EQUALS關系;b 路段1的起點和路段2的起點相同;c 路段1的終點和路段2的終點相同;處理效率方面:對1000條路段進行去重操作,執行時間不到1秒,另外,我之前對400多萬記錄(路段)的表進行該操作,執行時間也不到10秒。再強調一次,一定要對空間字段建立索引,不然等到天黑都跑不出結果。

4.2?處理道路覆蓋

一條較長的路完全覆蓋了一條較短的路,注意是完全覆蓋,而不是部分覆蓋,這種關系可用OGC規范的COVERS操作符進行判斷。對于滿足COVERS關系的兩條路,將長的一條更新為長的比短的多的那部分,短的那條則不變,最后留下的還是兩條路段,只不過長的那條變短了,將它稱之為”裁剪路段”,示意圖如下。

4.3 增加交叉口調頭

對于上一步中產生的”裁剪路段”,將其復制后反轉,作為交叉口調頭車道,如下圖所示,新增的調頭車道a供路段1上的車輛調頭行駛到路段2。同理,對交叉口的每個進口道做同樣處理。如果你的路網模型不考慮車輛調頭,可以忽略該步驟。

4.4?糾正路段起終點

為什么要進行起終點糾正? 舉例說明:路口由西向東的右轉車道并入直行車道,照理說只有一個匯合點,但是把匯合點放大后發現,有兩個匯合點,并且這兩個匯合點相距只有0.3米;而且路網存在偏移重復,即遠遠看上去只有一條路,放大了看其實有兩條,他們位置有一些偏移,不滿足完全重復關系。

高德官網對這個問題的產生原因表述如下:“由于道路/數據/算法的變更,很可能存在間隔一段時間后請求相同起終點的經緯度返回不同結果。”補充一下,不是”很可能”,而是”大多數時候如此”。也就是說,相同的一條路段,你在不同時間調用會得到不同的坐標,雖然肉眼來看它們挨得很近,但是對于計算機來說,別說1米,就算只差1毫米,那都算不同的兩條路。通過大量觀察,這種在現實世界中是同一條路但是坐標不同的兩個路段,其路段起點(終點)相差不超過1米,因此處理邏輯如下:a 以某路段1的起點為基準,找到距離它小于1米的其它路段2、3、4...的起點,將路段2、3、4...的起點坐標更新為基準點坐標;b 把上一步的起點全部換成終點,然后執行相同的操作;c?以上兩步操作會產生重復路段,需再次刪除重復道路處理后效果圖如下,可以看到,偏移路段消失了,只留下唯一版本的路段。

4.5?刪除偽結點

先用一張圖示意什么是偽節點,如下圖所示,每條路段的終端用箭頭表示,假設車輛行駛至路段a的終點處(結點1)產生了分叉,在該點可以直行進入路段b,也可以右轉進入路段c,在該結點存在多余兩條的路段(此處是3條),因此該結點不是偽節點;?加入車輛右轉進入路段c,并行駛到了路段c的終點(節點2),?在節點2有分叉么? 沒有,只能繼續行駛到路段d,也就是說該節點處只有兩條路段,并不會產生分叉,這種節點就叫做偽節點。

偽節點的存在有意義嗎? 沒意義,而且很多交通模型、仿真軟件(如TransCAD、EMME)對導入路網的節點數量有限制,偽節點過多不但造成資源浪費,還徒增后期的交通模型的計算量,因此最好在構建路網初期就將其刪除。如何識別并刪除偽節點:刪除偽節點2也即合并路段c和路段d,產生一個新的路段e。路段c與路段d的關系滿足:1 兩者關系符合OGC規范的TOUCH關系;2 c的終點和d的起點重合;3 在該節點處只存在兩條路段講到這里順便提以下ArcGIS的自帶的拓撲處理工具,該工具可以刪除單向路段上的偽節點,但是在雙向路段上該工具失效,所以我自己寫了刪除偽節點(合并路段)的存儲過程,對單向和雙向道路都適用。

4.6 導出空間數據

從空間數據庫中導出空間表,保存成 .SHP 數據,畢竟幾乎所有交通軟件都支持這種數據標準。

5 項目源代碼

技術架構簡介:本項目編程實現分為JAVA和ORACLE兩部分。
  • JAVA部分:

JAVA用于爬取高德路徑規劃接口,進行簡單連通性處理,并保存路段數據至空間數據庫。持久化框架:hibernate。使用hibernate中間件進行空間路段數據存儲,實現編程和空間數據庫軟件的分離,即不需要修改源代碼,只需修改一兩行數據庫的配置信息,即可和你的數據庫(非Oracle,如PostSQL或MySQL)無縫銜接。項目構建工具:maven空間數據工具包:JTS
  • Oracle部分:

Oracle空間數據庫用于存儲路段數據,并對路段進行方向、連通性等拓撲處理,包括SQL語句,以及存儲過程。版本:oracle 11.2,更高版本也支持(Oracle XE除外)。空間字段格式:SDO_GEOMETRYTalking is Cheap,Show me the Code。本項目源代碼已在github上開源。有任何問題歡迎交流。本人微信:xuxinkun0591郵箱:xuxinkun@189.cn

“交通科研Lab”:分享學習點滴,期待科研交流!

如果覺得還不錯

點這里???

總結

以上是生活随笔為你收集整理的让经纬度数据带矢量方向_惊艳!这样处理可得到细至可用于交通模型的路网数据...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。