地理編碼已經存在一段時間了。 但現在,這項服務是透過 REST 介面提供的,從而提供了更大的靈活性和準確性。 我建立了一個加載項,它使用 Mapquest 的服務來尋找地址的地理代碼併計算距離、行駛時間或位置對之間的完整路線。 這是其功能和用法的描述。
我一直對地圖著迷。 在數位地圖出現之前,我每次度假都會購買地圖,通常比例不同,而且比我真正需要的詳細得多。 因此,我也著迷也就不足為奇了聯合管理計劃的圖形功能允許資料在地圖上表示。
什麼是地理編碼?
有趣的應用之一是地理編碼,或是在地圖上定位點的能力。 通常,您有一個興趣點及其地址。 要找到它的位置並將其繪製在地圖上,您還需要地理座標。 正如你所期望的那樣,維基百科提供有關地理編碼的更多詳細資訊。
為什麼要使用新的地理編碼插件?
近年來,電腦通訊技術被稱為休息已得到更廣泛的應用。 在 2019 年的主題演講中,約翰·索爾 (John Sall) 談到了“ JMP 的秘密功能。 JMP 中隱藏的瑰寶之一確實埋得很深:透過 JSL 指令存取 REST API(高階程式介面)的能力。 由於電腦通訊資料經常使用“ JSON ” 資料結構,JMP 開發人員創建了 JSL 命令,可以輕鬆地在 JSL 資料結構和 JSON 資料之間傳輸資料。 這項技術變得越來越重要。 事實上,約翰霍普金斯大學和羅伯特科赫研究所為其數據池提供 REST API,以獲取與 COVID-19 相關的資訊; JMP 客戶使用它們存取 SAP 資料以進行品質管理;我用一個進行地理編碼。 這個介面擴展了資訊交換的可能性,因為它提供的不僅僅是興趣點的地理座標。 它還允許用戶獲取有關距離、旅行時間甚至路線的資訊。 這篇文章是關於使用加入我加載到文件交換。 技術背景將在單獨的帖子中給出,如最後一段所總結的。
有哪些功能?
您需要一個包含每個觀察值的地址資訊的資料表。 地址可用於新增三個不同層級的地理訊息,其中每個層級都包含前一個層級的資訊。
- 地理座標
對於每個觀測值,都會加入其位置的緯度和經度。 此外,根據資料庫中的可用信息,您還將獲得行政單位、國家、州、地區、郵遞區號、城市、街道的層次結構,以及對該地址的攻擊距離的評估。
- 距離和行車時間
對於資料表中的每一對連續行(例如,第1 行–> 第2 行/第2 行–> 第3 行/…),位址之間的距離和所需的行駛時間將會加到第二行。 連接將在額外的列中枚舉。 行程時間根據使用者選擇的交通方式計算:汽車、自行車或步行。
- 路由
將建立一個附加表,其中包含上述所有資訊以及描述兩個連續行之間的路線的所有點的地理編碼。
預設
有幾個網站提供地圖和路線服務。 該期刊給了很好的概述可程式網路。 我決定使用地圖探索。 該公司提供各種付費服務,但也提供免費 API。 如果您想使用它,您需要先註冊並獲得免費的API金鑰。 當然,您還需要 Geocoding 2020 插件。 它將自行安裝在「地圖形狀」子選單的加載項選單中。
第一次呼叫時,您將被告知您可以從 MapQuest 取得必要的金鑰,並提供一個用於貼上金鑰的欄位。

對話框的提醒被停用。 貼上金鑰後,進行測試以確定是否為正確的MapQuest金鑰;必須先驗證金鑰,然後才能繼續。 如果您提供了有效金鑰,它將保存在使用者目錄的 AppData/Roaming/SAS/JMP 資料夾中。 如果該目錄不存在,則會建立該目錄。
為了使加載項中的所有命令都能正常運作,您必須將 JMP 語言設定為英語和選擇“使用 JMP 語言...”選項。 不幸的是,這不能透過 JSL 來完成。 您必須使用與檔案 -> 首選項 -> Windows 特定的等效語言進行這些選擇。 此加載項將驗證語言設定是否正確,如果情況不正確,則會向您發出警報。
我們走吧
菜單由兩部分組成。 第一部分是上方的紅色區域,其建構方式幾乎與所有 JMP 平台對話方塊類似;它包含列列表、角色部分和操作面板。 在角色區域中,有兩個部分,用藍色框強調。 在資料表中,地址資訊可能以兩種格式之一儲存:作為一列,以文字字串形式保存完整地址,或作為單獨的列,每一列保存地址的一部分,例如國家/地區、城市、街道。 您可以提供這兩種格式中的任何一種,但它們是互斥的。 在這兩種情況下,您的地址必須包含國家/地區。 它可以以名稱或 ISO 代碼的形式給出,無論您喜歡哪種。
第二部分是下方的紅框,顯示哪些選項可用。 它們按單選按鈕組進行組織(下面的螢幕截圖顯示了預設值)。 所有選項都會為您的資料表新增一組附加列; 「路由」和「詳細路由」的組合會建立一個包含資料副本的附加資料集。 這些點被辨識為「興趣點」。此外,還有“航點”,即沿路線需要轉彎的點。

一個例子
為了測試它是如何運作的,我從網路上收集了一些地址資訊。 我在德國西部的一個小鎮索林根長大。 它在中世紀時期因生產高品質的劍和餐具而聞名,這就是為什麼您會在這裡找到德國餐具博物館。 博物館旁邊是一座雖小但非常令人印象深刻的巴洛克教堂。 附近還有一些其他著名的地方:

|
德國克林根博物館
|
德國餐具博物館
|

|
修道院教堂
|
巴洛克風格的修道院教堂
|

|
尼安德特人
|
首次發現我們祖先分支遺骸的地區
|

|
伍珀塔勒施韋伯鐵路
|
1901年通車,全長13公里的懸吊式鐵路,是世界上最古老的懸吊式車輛電氣高架鐵路
|

|
明斯特納橋
|
德國最高的鐵路橋,建於 1897 年
|

|
城堡城堡
|
一座重建的城堡,源自 12 th世紀
|
在互聯網上搜尋地址後,我將字串複製到 JMP 資料表中。 這些地址都不包含國家/地區名稱,因此我在所有字串前面添加了“德國”。 字串現在看起來像這樣
德國, Talstraße 300, 40822 梅特曼
|
德國, Alte Freiheit 24a, 42103 伍珀塔爾
|
德國, Klosterhof 4, 42653 索林根
|
德國, Klosterhof 3, 42653 索林根
|
德國, Müngstener Brückenweg, 42659 索林根
|
德國, Schloßplatz 2, 42659 索林根
|
我特意選擇德國國名「Deutschland」。 在對話方塊中,將此列指派給「單一位址」角色並繼續。

運行的結果是,這些列將附加到您的資料集中:
地理資訊
|
GC#緯度
|
GC#經度
|
GC#國家代碼
|
GC#狀態
|
GC#區
|
GC#郵遞區號
|
GC#城市
|
GC#街
|
GC#品質評估
|
GC#回傳訊息
|
我認為列名本身就說明了問題。 MapQuest 為每次點擊提供估計的品質評級。 它非常複雜,所以我將這些資訊歸納為四類:精確、接近、近似、遠。 資料表中的行根據此評級取得符號和顏色。 所有位置都顯示在地圖中,重現該地圖的腳本將會新增到資料表中。 根據您的點分佈的區域,背景地圖是街道地圖或簡單地球。
在該資料表中,我將位址字串拆分為單一元件(如果使用“列”→“實用程式”→“文字到列”,這很容易),並使用“單獨的位址欄位”角色請求座標。

無需填寫本節中的所有角色欄位。 國家/地區是最低要求。 您提供的資訊越多,命中率就越高。 兩種請求座標的方法的結果並不完全相同。 座標本身可能會略有偏差,對於詳細要求,可以提供更多資訊(例如區域)。 品質評估也可能有所不同。
出於效能原因,如果資料表中的位址超過 200 個,則單一位址欄位將連接到一個字串,並且單一字串請求將發送到 MapQuest。
如果您選擇「路線」和「僅距離/時間」的組合,您將獲得與地理編碼相同的訊息,以及三個附加列。 有時,您可能會收到錯誤訊息:
興趣點
|
GC#回傳訊息
|
GC#距離(公里)
|
GC#時間(自行車)
|
GC#腿
|
尼安德特人
|
|
。
|
。
|
0
|
伍珀塔爾施韋伯鐵路
|
無法計算路線。
|
19.1287
|
:0:00:52:39
|
1
|
德國克林根博物館
|
無法計算路線。
|
0
|
:0:00:00:00
|
2
|
修道院教堂
|
|
0
|
:0:00:00:00
|
3
|
明斯特納橋
|
|
9.92
|
:0:00:26:26
|
4
|
城堡城堡
|
|
5.0163
|
:0:00:13:55
|
5
|
連續的行構成了總路線的一條路段。 目標行保存腿部的資訊。 在範例中,第一段線路是從 Neandertal 到 Wuppertaler Schwebebahn。 自行車路線的距離約19公里,預計騎乘時間為52分鐘。
無論出於何種原因,無法找到前往 Deutsches Klingenmuseum 或 Gräfrather Klosterkirche 的自行車路線。 因此,第二條和第三條線路沒有旅行訊息,而第四條和第五條線路再次提供相應的資訊。
此選項組合請求資料表中兩個連續行之間的路線詳細信息,距離以英里為單位:
您的資料表將透過上述地理編碼列進行擴充。 對於路由,將建立一個額外的表,其中包含資料表每一行的副本;在這些行之間插入新線,沿路線的每個重要點插入一條新線。 索林根之旅的最後一段是這樣的:

第 49 行保存資料表中的倒數第二個位址,這是第 4 條線路結束的地方。 從之前的地點到此處的路線長 9.3 英里,預計行駛時間為 15 分鐘。 這是一個「興趣點」。下一行是 +/- 300 英尺和 5 秒行駛時間後第 5 條路段第一段的終點。 這是在到達下一個(也是最後一個)興趣點之前一系列七個路徑點中的第一個路徑點。 地圖顯示了結果,它們的腳本也在表格中。
資料表是加載項的一部分,可以使用「幫助」按鈕開啟。 您可以使用它開始玩耍並查看我包含的景點的圖片。
如果你如果您應該來這個地區並參觀一些地方,請不要忘記尋找一家提供服務的餐廳貝爾吉斯咖啡館非常豐富的當地特色菜組合,包括麵包、香腸、甜米飯、華夫餅等。 它在我選擇作為示範的地區都很有名,所以你應該可以在許多餐廳找到它。

第一次運行時
MapQuest 要求您擁有個人 API 金鑰。 你從他們那裡得到它開發者網站免費。 此加載項要求提供此金鑰並提供一個用於將其貼上到的欄位。

該插件將密鑰儲存在 SAS\JMP 用戶的 appdata 目錄中。 在每次運行之前,它都會嘗試讀取密鑰,並且只要密鑰存在就會使用它。
不可能排除行/路由

此加載項為行分配符號、顏色和標籤,但它也尊重「排除」行狀態,這對路由應用程式有特定的影響。 如果排除某行或無法路由到其位址,則忽略該行並蒐索到下一個位址的路由。
在這種情況下,將搜尋 Neandertal 和 Wuppertaler Schwebebahn 之間、Wuppertaler Schwebebahn 和 Müngstner Brücke 之間以及 Müngstner Brücke 和 Schloss Burg 之間的路線。
同樣,如果無法路由到某個位置,則將跳過這些位置。
技術細節
細心的觀察者可能已經注意到主對話框包含在選項卡中。 如果選項卡單獨存在,則它們毫無用處。 此選項卡反映了路線位置可能以不同格式顯示的想法。 如果需要提供路由位置的替代方式的請求,則該選項卡可能會獲得同級選項卡。
由於我對一般地圖和 REST API 技術的共同興趣,我有動力編寫此插件。 為了使後一種方法更加透明,甚至更廣泛地使用,我將三個文件放入 JSL 說明書中。 它們定義了可以被其他程式呼叫的函數。 一種是對 MapQuest 的 REST 呼叫。 我在一篇關於的部落格文章中描述了內容和介面的描述粗略的 MapQuest 調用。 其他腳本是 REST 呼叫的信封。 他們將 JMP 列表作為輸入並建立所需的 JSON 結構地理編碼或者路由稱呼。 如果有很多地址需要編碼,它會將它們打包成 50 個區塊,以獲得更好的可靠性和效能。 在我的部落格文章中關於地理編碼和路由子例程中,我更詳細地描述了這些程式碼片段。
如前所述,JMP 程式設計師在提供可在 JMP 資料結構和 JSON 之間雙向轉換的 JSL 函數方面做得非常出色。 在 JSL 術語中,涉及列表和關聯數組。 這些元素可以堆疊。 您可能有一個關聯數組,其中包含一系列關聯數組,其中包含...。 單一 MapQuest 呼叫提供了一組豐富的數據,我只需要其中的一些元素。 有時,這些是堆疊深處的兩層;其他時候,深度很多。 所以,我發現寫一個很有用小腳本迭代這個結構。 如果我不尋求結果的可視化,我就不會成為一個受人尊敬的 JMPer。 我在石川圖中找到了完美的方法。 這個程式讓我想起了遞歸的力量,這是跳出深堆疊並安全返回的最佳技術。 我認為它也可能會幫助或激勵其他程式設計師。 我把劇本放進食譜,自然而然地,我寫了一篇文章關於遞歸和繪製層次結構。
我使用 JMP 15 進行開發,使用 JMP 專案。 我不會說沒有項目就不可能完成我的小項目,但專案讓事情變得容易多了。
我遇到了同樣的錯誤(如下)
不能建立文件。在存取或評估「儲存文字檔案」時,儲存文字檔案/*###*/(keypath || "gckey.gce", ak)
到目前為止有人能夠解決這個問題嗎?
現在收到錯誤訊息:
不能建立文件。在存取或評估「儲存文字檔案」時,儲存文字檔案/*###*/(keypath || "gckey.gce", ak)