我使用 REST 接口的新技術來提供新的地理編碼插件。 其核心是調用相應的 REST 接口地圖探索,一家提供大量路由服務和應用程序的公司。 MapQuest 的一項服務是地理編碼。 對於提供的每個地址,MapQuest 都會發回該位置的經緯度,以及國家和州等行政信息。
由於數據表是 JMP 中收集信息的常用方式,因此分析從用戶通過用戶對話框將角色分配給數據表的列開始。 這地理編碼 2020 加載項工作方式相同。 用戶完成對話後,程序從數據表中收集相關數據,翻譯成REST API需要的結構,然後發送給MapQuest。 因此,程序的大致結構是:1) 完成用戶對話,2) 收集數據,3) 為接口準備數據,4) 發送接口請求,5) 解釋結果,6) 編寫 JMP 數據表。 第三步,數據準備,定義為一個函數,可作為MapQuest_geocode.jsl在 JSL 食譜中。 您可以將它嵌入到您自己的地理應用程序中,或者使用它來了解如何為 REST 調用構建數據結構。
基線功能
您或您程序的任何用戶需要一個有效的API密鑰來自 MapQuest。
JMP 數據以數據表列的形式出現,而 REST 接口很可能使用 JSON 結構。 因此,需要有在兩種格式之間進行轉換的功能。 JSL 還具有用於數據集合的結構,列表或關聯數組。 這個函數的目的是封裝所有非原生的 JSL 命令。 必要的數據以字符、數字或列表格式與典型的 JSL 變量一起提供。 從調用返回的數據也以 JSL 列表的形式出現。 因此,將此函數嵌入 JSL 腳本中不需要 JSL 標準以外的任何其他知識。
界面
使用如下語句調用 JSL 函數:
結果=函數();
如果函數需要或接受參數,它們會列在括號中。 可以使用空括號或完整參數列表調用此函數 GC_geocode。 用空括號調用它會調用一個參數定義窗口,其中包含輸入和輸出的輪廓,如以下兩個圖所示:


函數調用中的參數始終是位置參數。 當使用參數調用函數時,需要提供所有強制參數,但它們可能為空。
在我的關於 Geocoding 2020 加載項的博文,我使用了我家鄉周圍的一些當地旅遊景點作為如何使用加載項的示例。 讓我們用其中兩個來看看這個接口是如何工作的:

|
Alte Freiheit 24a, 42103 伍珀塔爾, 德國
|
Wuppertaler Schwebebahn 是一條全長 13 公里的懸索鐵路,是世界上最古老的懸掛車廂的電動高架鐵路,於 1901 年開通。
|

|
Schloßplatz 2, 42659 索林根, 德國
|
Schloss Burg,一座重建的城堡,起源於 12日世紀。
|
首先,您需要一個來自 MapQuest 的訪問密鑰,我們假設它是 1234ABCD。 使用此接口的一種方法是按原樣獲取地址字符串。 在這種情況下,格式指示符(位置 2)需要為 1 或更大。 然後,函數調用如下所示:
coordinates = GC_geocode ("1234ABCD", 1, {"Alte Freiheit 24a, 42103 Wuppertal, Deutschland",<BR /> "Schloßplatz 2, 42659 Solingen, Deutschland"}, {}, {}, {}, {}, {}, {});
如果地址在單獨的元素中而不是在一個字符串中,則格式指示符需要為 0(零),這意味著您的調用將如下所示:
coordinates = GC_geocode ("1234ABCD", 0, {}, {"Deutschland", "Deutschland"}, {}, {"Wuppertal", "Solingen"}, {42103, 42659},<BR /> {"Alte Freiheit 24a", "Schloßplatz 2"}, {})
當然,您不需要將值作為參數放入;您還可以提供一個變量,例如,帶有國家名稱列表的列表變量。
在任何情況下,結果都是相同的數據列表:
{200, "HTTP/1.1 200 OK", "", {0, 0}, {"", ""}, {51.25603, 51.13768}, {7.14865, 7.15245}, {"exact", "exact"}, {"DE", "DE"},<BR /> {"Nordrhein-Westfalen", "Nordrhein-Westfalen"}, {"", ""}, {"42103", "42659"}, {"Wuppertal", "Solingen"},<BR /> {"Alte Freiheit 24A", "Schloßplatz 2"}, 0}
由於可以找到並標記地址,因此每個地址的響應代碼為“0”(元素 4),這就是元素 5 中存在空文本的原因,否則會出現錯誤消息。 鑑於上面的接口聲明,其餘的很容易理解。
技術細節
基本功能很簡單。 我們向 MapQuest 發送一個地址並返回緯度和經度。 對於這個簡單的任務,MapQuest 提供了不同的輸入格式和處理模式。 地址信息可以作為一個文本字符串以逗號分隔的部分提供,例如“Deutschland, Schloßplatz 2, 42659 Solingen”,這是我家鄉附近一座著名城堡的地址。 或者,地址可以作為單個元素給出:國家 = “德國”,街道 = “Schloßplatz 2”,城市 = “索林根”,郵政編碼 = “42659”。
我假設,在大多數情況下,可能會查找多個地址。 因此,該函數期望以列表的形式獲取地址信息,可以是具有完整地址的字符串列表,也可以是具有地址元素的多個列表。 MapQuest 對於兩種地址格式有兩個不同的 URL。 單字符串接口以批處理方式運行,即一次調用可以解析多個地址。 單獨地址元素的接口一次只接受一個地址。 出於性能原因,該函數將單獨的元素組合成一個字符串,並在需要定位許多地址(當前:> 100)時運行批處理模式。
每個地址,無論提供的格式如何,都需要提供其國家/地區。 並且沒有檢查是否提供了所需的最少信息。 所有其他元素都是可選的。 您描述的地址越精確,結果的質量就越好。 如果整個地址作為單個字符串提供,則該字符串中地址元素的順序無關緊要。
如果您正在從數據表中讀取位置並且該數據表包含已排除的行,則必須提供已排除行的列表 (excludedrows = As List( dt << Get Excluded Rows )) 作為參數 12。 否則,返回的列表可能與您的數據表不同步。 在消息列表中,這些觀察結果被標記為“已排除”。如果“排除”的觀測值比數據表中的原始觀測值多,則該觀測值無法提供最少的位置信息。
MapQuest 是一家美國公司,我發現我測試的所有美國地址的結果都是一致的。 對於世界其他地區的地址,情況並非總是如此。 州、地區或城市等位置信息通常以當地語言返回,但有時結果為英語。
我希望這段代碼可以對您的項目有所幫助,或者只是提供對 JSL 應用程序的一些見解。 我願意接受任何問題或建議,但由於它是 Geocoding 2020 加載項的一部分,因此我只會進行與其在該加載項中的預期用途一致的更改。