我使用 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 加载项的一部分,因此我只会进行与其在该加载项中的预期用途一致的更改。