【干貨】如何基于FME獲取高德地圖等時圈

在規(guī)劃分析過程中,往往會涉及等時圈的概念。什么是等時圈呢?小編幫你百度過了,網(wǎng)上的說法是:等時圈是指從某點出發(fā),以某種交通方式在特定時間內能到達的距離覆蓋的范圍。比如我們在規(guī)劃設計中接觸到的15分鐘生活圈就是等時圈的一個具象應用。說到這里有朋友就疑惑了,我們怎么去獲取等時圈呢?獲取等時圈的方法有很多種,最常見的就是以下幾種:
(一)無中生有,自給自足。
自給自足,很明顯就是自己生成。當然,巧婦難為無米之炊,因此我們必須要準備一些 基礎數(shù)據(jù),包括道路矢量數(shù)據(jù)以及我們的設施點,而煮飯的工具小編推薦用ArcGIS網(wǎng)絡分析工具中的服務區(qū)分析。具體步驟可以參考這一篇文章(設施服務區(qū)分析——5分鐘服務范圍)。但這種方法對數(shù)據(jù)基礎的要求很高,路網(wǎng)構建得越接近現(xiàn)實,分析結果越精確,但在實際過程中很難保證我們的路網(wǎng)能百分百模擬真實路況,因此我們需要借助大數(shù)據(jù)平臺的算法,來盡可能獲取最接近實際的結果,例如百度地圖、高德地圖、mapbox等在線地圖平臺。
(二)站在巨人的肩膀上,拿來吧你。
今天小編主要介紹一下用FME來獲取高德地圖等時圈的思路和具體步驟,主要參考這一篇博客https://blog.csdn.net/fmechina/article/details/105566627,這篇博客的思路非常清晰,但是很多細節(jié)都沒有展現(xiàn)出來,本期小編就幫大家翻譯一下,讓這篇推文變得更加的通俗易懂。悄悄告訴你,同名公眾號后臺回復“等時圈”獲取模板。
==============================進入主題==============================
【整體思路】
1.構建起點坐標對并創(chuàng)建用戶參數(shù);
2.構建終點坐標對;
3.發(fā)送調用服務請求并解析JSON
4.創(chuàng)建等時圈并導出為shp
【具體步驟】
接下來我們以長沙火車站15分鐘等時圈為例,來具體認識一下FME在獲取網(wǎng)絡數(shù)據(jù)中的魅力。本篇教程主要針對的是像我一樣的小白,所以我會在流程中先講解每一步的思路,再一一介紹我們用到的轉換器,因此篇幅稍微長一點。
1.構建起點坐標和創(chuàng)建用戶參數(shù)

首先新建幾個必要的用戶參數(shù)。用戶參數(shù)(user parameters)是FME為用戶提供的參數(shù),是為最終用戶使用工作空間提供的輸入接口。通俗一點講,這些參數(shù)是貫穿整個程序的,因此我們提前準備好。我們只需右鍵導航窗口(Navigator)下的用戶參數(shù)(user parameters),在彈出窗口中填入?yún)?shù)名稱、別名、勾選必填,設置默認值為500(也可不設,不設的情況下在運行程序時會提醒設置)。依次添加OriginLonLat(起點經(jīng)緯度)、Radius(預估半徑)、Grid(網(wǎng)格密度)、Amap_Key(高德密鑰)、Transportation(出行方案)等必填參數(shù)。其中,Amap_Key(高德密鑰)需要去高德地圖API控制臺申請。


其次在高德地圖坐標拾取器https://lbs.amap.com/tools/picker中搜索我們的分析對象坐標,比如長沙火車站,將獲取到的坐標復制到OriginLonLat(起點經(jīng)緯度)參數(shù)中去。

【Creator】用提供的參數(shù)來創(chuàng)建要素,并將這些要素發(fā)送到工作空間中進行處理。

【ParameterFetcher】給要素添加一個屬性并用先前發(fā)布的參數(shù)賦值。這里我們主要是為了獲取用戶參數(shù)到要素中。

【AttributeSplitter】把選擇的屬性分離成一個屬性列表。列表中的每一項都包含一個從列表中分離出的單個令牌。例如,你可以用這個轉換器,把一個含有分隔逗號列表的屬性分離成其組件。這一步主要是為了將起始點坐標對隔開存入列表中備用。

【VertexCreator】將坐標附加到空(Null)、點、文本、線和弧等幾何對象上,或者用點對象替換現(xiàn)有圖形對象。這一步就是為了創(chuàng)建起點要素。

2.構建終點坐標對
構建終點坐標對的思路是基于我們的起點創(chuàng)建一個大致的緩沖區(qū)作為預估范圍,緩沖區(qū)半徑是根據(jù)我們分析需求來確定(比如我們想要獲取15分鐘騎行等時圈,則根據(jù)15分鐘騎行大約3000米的標準來確定閾值),其次是在這個緩沖區(qū)范圍內創(chuàng)建一個網(wǎng)格,提取其網(wǎng)格中心點作為出行的終點,網(wǎng)格的大小決定了等時圈的精度,但受調用次數(shù)的限制,我們退而求其次盡量取合適的精度。

【EsriReprojector】使用ESRI重投影庫,把要素的坐標系重投影到另一個坐標系統(tǒng)。這里是因為后面創(chuàng)建緩沖區(qū)和網(wǎng)格的時候需要在平面坐標系下進行。

【Bufferer】在輸入幾何對象周圍或內部創(chuàng)建指定大小的緩沖區(qū)。
【2DGridCreator轉換器】用一個由二維點或者矩形形成的網(wǎng)格取代原來的輸入要素,這些網(wǎng)格有指定的間距且覆蓋所有進入此轉換器的要素的整體外接區(qū)域。這里我們主要用于創(chuàng)建網(wǎng)格。
【SpatialFilter】根據(jù)空間關系過濾點、線、面或文字等要素。每個輸入候選(CANDIDATE)要素與所有過濾(FILTER)要素進行比較,基于給定的空間測試條件來判斷是否滿足。這里主要用于提取緩沖區(qū)范圍內的網(wǎng)格,可大幅減少后面調用高德服務的次數(shù)。
這一步將投影轉換回WGS84是為了提取十進制度坐標值(高德地圖采用的是火星坐標,火星坐標系是在GSP原始定位數(shù)據(jù)的基礎上經(jīng)過加密算法加密之后的定位數(shù)據(jù)所屬坐標系,GSP原始定位數(shù)據(jù)所屬坐標系叫WGS-84坐標系,WGS-84坐標系是美國國防制圖局于1984建立的世界大地坐標系(World Geodetic System)的簡稱,出于安全考慮,我國國家測繪局規(guī)定國內必須對原始GSP數(shù)據(jù)進行加密,加密之后的坐標系就是GCJ-02坐標系,又叫火星坐標系。)
【CenterPointReplacer】用幾何要素的中心點替換幾何要素,該點或者位于要素范圍的中心,或者位于要素的質心。這一步是為了生成網(wǎng)格中心點,將其作為路徑的終點。

【CoordinateRounder】將要素坐標舍入到指定的小數(shù)位數(shù)。由于舍入而成為重復的任何連續(xù)點都將通過刪除多余的點來細化。這一步是為了滿足高德地圖調用服務的條件(經(jīng)緯度小數(shù)點不超過6位)。

【CoordinateExtractor】按指定的索引檢索坐標點XYZ值存儲到屬性字段中。這里是為了將終點的XY值提取到屬性表中。到此完成終點構建。

3.構建URL、調用服務并解析結果
完成起點和終點的構建后,就可以開始正式請求高德地圖的服務了,模板如下。

【AttributeCreator】給要素添加若干屬性,并通過常量、屬性值、表達式為屬性賦值。屬性值可以參考相鄰的要素。這里我們主要用于構建URL(URL:統(tǒng)一資源定位符是WWW的統(tǒng)一資源定位標志,就是指網(wǎng)絡地址)。

參照高德API調用示例將其屬性值設置為:“@Value(_transportation)origin=@Value(_OriginLonLat)&destination=@Value(destination{0}.x),@Value(destination{0}.y)&key=@Value(_Amap_Key)”。

【HTTPCaller】通過HTTP或HTTPS訪問URL,執(zhí)行一個GET,PUT,POST,DELETE或HEAD操作。通過這一步去調用服務。請求URL設置為:
“https://restapi.amap.com/v4/direction/@Value(_URL)”,結果保留至屬性即可。
上一步跑完后,如果成功的返回的值就會保存在“_response_body”字段中,這時我們需要對其進行解析,用到【JSONFragmenter】轉換器,提取部分JSON格式化文本到新的FME的要素中。從示例中可以分析出,我們需要的時間藏在了“data”下面的“paths”中,因此,“JSON Query”的值設置為“json["data"]["paths"][*]["duration"]”,運行后,“_response_body”的值直接會被替換為"duration"(總用時)。到此就完成了數(shù)據(jù)的獲取。


【AttributeRemover】從要素中刪除選定的屬性和列表屬性。這一步是為了刪除冗余的字段,提高運行速度。

完成數(shù)據(jù)獲取后,我們得到了起點到每個終點對應的出行時間,但網(wǎng)格點是離散的,因此我們需要將其模擬成連續(xù)的表面,再來提取等值線作為等時圈,這就跟高程點生成等高線一個道理,模板如下:

【3DForcer】通過給每個坐標添加z值,把二維數(shù)據(jù)轉換為三維數(shù)據(jù)。這里是為了將“duration”賦值給網(wǎng)格點的z值,使其具有三維屬性。

這一步是為了將其投影至平面坐標系,方便模擬運算。

【SurfaceModeller】基于輸入的點和斷裂線構建Delaunay三角格網(wǎng)。當需要同一模型多個表達形式時這個轉換器很有效。這里就是生成連續(xù)表面的過程,有幾種輸出結果,我們需要其中的“contour”,也就是等值線。

【AreaBuilder】獲取一系列拓撲上連接的線,當線形成首尾閉合時創(chuàng)建拓撲正確的多邊形要素。這一步是為了將封閉的等值線篩選出來并轉換成面要素。到這一步我們已經(jīng)得到了預估范圍內的所有等時圈。

【Tester】執(zhí)行要素的一個或多個測試條件,根據(jù)測試的結果決定要素的輸出。判斷可由任何FME允許的操作符組成。這一步是為了篩選出我們所需要的等時圈,比如15分鐘(900秒),我們只需篩選出“_elevation”小于等于900的即可。

最后通過寫模塊將結果輸出為shp,大功告成,打完收工

最后看一看效果,可以直觀地了解火車站的15分鐘騎行圈。

再次悄悄告訴你,同名公眾號后臺回復“等時圈”可以獲取模板
