地理编码已经存在一段时间了。 但现在,这项服务是通过 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)