ジオコーディングはしばらく前から存在しています。 しかし現在、このサービスは REST インターフェイス経由で提供され、より高い柔軟性と正確性が提供されています。 Mapquest のサービスを使用して、住所の地理コードを検索し、距離、移動時間、または場所のペア間の完全なルートを計算するアドインを作成しました。 ここではその機能と使い方について説明します。
私はいつも地図に興味を持っていました。 デジタル地図が利用可能になる前は、休暇のたびに地図を購入していましたが、通常は縮尺が異なり、実際に必要以上に詳細に記載されていました。 ですから、私もそれに魅了されても不思議ではありません。 JMPのグラフ機能を使用すると、データを地図上に表現できます。
ジオコーディングとは何ですか?
興味深いアプリケーションの 1 つは、ジオコーディング、つまり地図上の点を特定する機能です。 通常、興味のある場所とその住所がわかります。 その位置を見つけて地図上にプロットするには、地理座標も必要です。 ご想像のとおり、ウィキペディアジオコーディングについてさらに詳しく説明します。
新しいジオコーディング アドインを使用する理由
近年、コンピュータ通信技術として知られる、休むより広く使用されるようになりました。 2019 年の基調講演で、ジョン・ソール氏は次のように話しました。 JMPの秘密の機能。 JMP の隠された宝石の 1 つは、実際には非常に深く埋められています。それは、JSL コマンドを介して REST API (高度なプログラミング インターフェイス) にアクセスする機能です。 パソコンの通信データは「」を利用してやり取りされることが多いため、 JSON 」データ構造に基づいて、JMP 開発者は、JSL データ構造と JSON データの間でデータを簡単に転送する JSL コマンドを作成しました。 このテクニックはますます重要になってきています。 実際、ジョンズ ホプキンス大学とロベルト コッホ研究所は、新型コロナウイルス感染症 (COVID-19) に関連する情報のデータ プールに REST API を提供しています。 JMP の顧客は、品質管理のために SAP データにアクセスするためにこれらを使用します。私はジオコーディングに 1 つを使用します。 このインターフェイスは、関心のある地点の地理座標以上の情報を提供するため、情報交換の可能性が広がります。 また、ユーザーは距離、移動時間、さらにはルートに関する情報を取得することもできます。 この記事では、加えるファイル交換にロードしたものです。 技術的な背景については、最後の段落で要約したように、別の投稿で説明します。
機能は何ですか?
観測ごとのアドレス情報を含むデータ テーブルが必要です。 住所を使用して 3 つの異なるレベルの地理情報を追加できます。各レベルには前のレベルの情報が含まれます。
- 地理座標
観測ごとに、その場所の緯度と経度が追加されます。 さらに、データベースで入手可能な情報の限り、行政単位、国、州、地区、郵便番号、都市、番地の階層と、その住所がどの程度接近しているかの評価も得られます。
- 距離と移動時間
データテーブル内の連続する行の各ペア (例: 行 1 –> 行 2 / 行 2 –> 行 3 /…) について、住所間の距離と所要の移動時間が 2 番目の行に追加されます。 接続は追加の列に列挙されます。 移動時間は、ユーザーが選択した交通手段 (車、自転車、徒歩) に基づいて計算されます。
- ルーティング
上記のすべての情報と、連続する 2 つの行間のルートを説明するすべてのポイントのジオコードを含む追加のテーブルが作成されます。
前提条件
地図作成やルート案内サービスを提供するインターネット サイトがいくつかあります。 優れた概要はジャーナルに記載されていますプログラマブルウェブ。 使うことにしましたマップクエスト。 同社はさまざまな有料サービスを提供していますが、無料の API も提供しています。 使用したい場合は、まず登録して無料の API キーを取得する必要があります。 もちろん、Geocoding 2020 アドインも必要です。 これは、「Map Shapes」サブメニューの「アドイン」メニューに自動的にインストールされます。
最初の呼び出し時に、MapQuest から必要なキーを取得できることと、キーに貼り付けるフィールドが提供されることが通知されます。

ダイアログのリマインダーは無効になっています。 キーが貼り付けられた後、それが適切な MapQuest キーであるかどうかがテストされます。続行する前にキーを検証する必要があります。 有効なキーを指定した場合、そのキーはユーザーのディレクトリの AppData/Roaming/SAS/JMP フォルダーに保存されます。 このディレクトリが存在しない場合は作成されます。
アドインのすべてのコマンドが機能するには、JMP 言語を英語に設定する必要があります。そして「JMP 言語を使用…」オプションを選択します。 残念ながら、これは JSL 経由では実行できません。 これらの選択は、[ファイル] -> [環境設定] -> [Windows 固有] と同等の言語を使用して行う必要があります。 アドインは言語設定が正しいことを確認し、正しくない場合は警告を発します。
さあ行こう
メニューは 2 つの部分で構成されます。 最初の部分は上部の赤い領域で、ほぼすべての JMP プラットフォーム ダイアログと同様に構築されています。これには、列リスト、役割部分、アクション パネルが含まれています。 役割エリアには 2 つの部分があり、青枠で強調されています。 データ テーブルでは、住所情報は 2 つの形式のいずれかで保存できます。1 つは完全な住所をテキスト文字列として保持する 1 つの列として、もう 1 つは国、都市、都市などの住所の一部を各列に保持する個別の列としてです。通り。 これらの形式のいずれかを指定できますが、相互に排他的です。 両方の場合において、住所には国が含まれている必要があります。 名前または ISO コードのどちらでも指定できます。
2 番目の部分は、使用可能なオプションを示す下の赤枠です。 これらはラジオ ボタンのグループに編成されています (下のスクリーン ショットはデフォルトを示しています)。 すべてのオプションでは、追加の列のグループがデータ テーブルに追加されます。 「ルーティング」と「詳細なルート」を組み合わせると、データのコピーを含む追加のデータセットが作成されます。 これらのポイントは「注目ポイント」として識別されます。さらに、ルート上で曲がる必要があるポイントである「ウェイポイント」があります。

例
すべてがどのように機能するかをテストするために、インターネットからいくつかのアドレス情報を収集しました。 私はドイツ西部の小さな町ゾーリンゲンで育ちました。 中世には高品質の剣や刃物を生産することで有名で、そのためここにドイツ刃物博物館があります。 博物館の隣には、小さいながらも非常に印象的なバロック様式の教会があります。 近くには他にもいくつかの有名な場所があります。

|
ドイツ クリンゲン博物館
|
ドイツ刃物博物館
|

|
聖母教会教会
|
バロック様式の修道院の教会
|

|
ダス・ネアンデルタール
|
私たちの祖先の分家の遺骨が最初に発見された地域
|

|
Die Wuppertaler Schwebebahn
|
全長 13 km の吊り下げ鉄道。1901 年に開業した世界最古の吊り下げ車両を備えた高架電気鉄道です。
|

|
ミュングストナー橋
|
1897 年に建設されたドイツで最も高い鉄道橋
|

|
シュロスブルク
|
12世紀の城を復元したもの。番目世紀
|
インターネットでアドレスを検索した後、文字列を JMP データ テーブルにコピーしました。 どの住所にも国名が含まれていなかったため、すべての文字列の先頭に「Deutschland, 」を追加しました。 文字列は次のようになります
Deutschland, Talstraße 300, 40822 メットマン
|
Deutschland, Alte Freiheit 24a, 42103 ヴッパータール
|
Deutschland, Klosterhof 4, 42653 ゾーリンゲン
|
Deutschland, Klosterhof 3, 42653 ゾーリンゲン
|
Deutschland, Müngstener Brückenweg, 42659 ゾーリンゲン
|
Deutschland, Schloßplatz 2, 42659 ゾーリンゲン
|
ドイツの国名はあえて「ドイッチュラント」としています。 ダイアログで、この列を「単一アドレス」ロールに割り当てて、次に進みます。

実行の結果、次の列がデータ セットに追加されます。
地理情報
|
GC#緯度
|
GC#経度
|
GC#国コード
|
GC#状態
|
GC#地区
|
GC#郵便番号
|
GC#都市
|
GC#ストリート
|
GC#品質評価
|
GC#リターンメッセージ
|
列名がそれ自体を物語っていると思います。 MapQuest は、各ヒットの推定品質評価を提供します。 非常に複雑なので、その情報を正確、近い、近似、遠いの 4 つのカテゴリにまとめました。 データ テーブルの行には、この評価に従ってシンボルと色が与えられます。 すべての位置が地図上に表示され、この地図を再現するスクリプトがデータ テーブルに追加されます。 ポイントが分布するエリアに応じて、背景マップはストリート マップまたはシンプル アースのいずれかになります。
そのデータ テーブルで、住所文字列を単一のコンポーネントに分割し (列 → ユーティリティ → テキストから列へ…を使用すると簡単です)、「個別の住所フィールド」ロールを使用して座標を要求しました。

このセクションの役割フィールドをすべて入力する必要はありません。 国は最低要件です。 提供する情報が多ければ多いほど、ヒット率は高くなります。 座標を要求する両方の方法の結果は完全に同一ではありません。 座標自体は多少異なる場合があり、詳細なリクエストの場合は、より詳細な情報(地区など)が提供される場合があります。 品質評価も異なる場合があります。
データ テーブルに 200 を超える住所がある場合、パフォーマンス上の理由から、単一の住所フィールドが 1 つの文字列に連結され、単一の文字列リクエストが MapQuest に送信されます。
「ルーティング」と「距離/時間のみ」の組み合わせを選択すると、ジオコーディングの場合と同じ情報に加えて、3 つの追加列が返されます。 場合によっては、次のようなエラー メッセージが表示されることがあります。
興味のあるスポット
|
GC#リターンメッセージ
|
GC#距離 (km)
|
GC#Time (自転車)
|
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
|
連続する行により、ルート全体の 1 つの区間が構築されます。 対象行は脚の情報を保持します。 この例では、最初の区間はネアンデルタール州からヴッパーターラー シュヴェーベバーンまでです。 自転車ルートの距離は約 19 キロメートル、推定サイクリング時間は 52 分です。
何らかの理由で、ドイツ クリンゲン博物館や聖母教会へのサイクリング ルートが見つかりませんでした。 したがって、レグ 2 とレグ 3 には旅行情報がありませんが、レグ 4 とレグ 5 ではそれぞれの情報が再び提供されます。
このオプションの組み合わせでは、データ テーブル内の連続する 2 つの行間の距離をマイル単位で指定したルートの詳細が要求されます。
データ テーブルは、ジオコーディングのために上記で説明した列によって拡張されます。 ルーティングのために、データ テーブルの各行のコピーを含む追加のテーブルが作成されます。これらの行の間に、ルート上の重要な点ごとに 1 つずつ、新しい線が挿入されます。 ゾーリンゲンツアーの最後の部分は次のようになります。

行 49 には、データ テーブルの最後から 2 番目のアドレスが保持され、ここでレッグ 4 が終了します。 先ほどの場所からこの地点までのルートは長さ 15.3 マイル、推定移動時間は車で 15 分です。 それは「興味のあるポイント」です。次の行は、+/- 300 フィートおよび 5 秒の運転時間後のレグ 5 の最初のセグメントの終わりです。 これは、次の (そして最後の) 対象地点に到達する前の、一連の 7 つのウェイポイントのうちの最初のウェイポイントです。 マップには結果が表示され、そのスクリプトも表に記載されています。
データ テーブルはアドインの一部であり、[ヘルプ] ボタンを使用して開くことができます。 これを使用して、私が含めたアトラクションの写真を見て遊んだり、見たりすることができます。
そしてもしあなたがぜひこのエリアに来て、いくつかの場所を訪れてください。ベルギッシェ・カフェタフェル、パン、ソーセージ、スイートライス、ワッフルなどを含む地元の名物を非常に豊富に組み合わせたものです。 私が実演として選んだ地域ではよく知られているので、多くのレストランで見つけることができるはずです。

最初の実行時
MapQuest では、個人用の API キーが必要です。 あなたは彼らからそれを受け取ります開発者のウェブサイト無料で。 アドインはこのキーを要求し、それを貼り付けるフィールドを提供します。

アドインは、SAS\JMP のユーザーの appdata ディレクトリにキーを保存します。 毎回実行前にキーの読み取りを試行し、キーが存在する限りそれを使用します。
除外された行/ルーティングは不可能

アドインはシンボル、色、ラベルを行に割り当てますが、ルーティング アプリケーションに特定の影響を与える「除外された」行の状態も考慮します。 行が除外されているか、そのアドレスへのルーティングが不可能な場合、この行は無視され、次のアドレスへのルートが検索されます。
この場合、ネアンデルタール~ヴッパーターラー・シュヴェーベバーン間、ヴッパーターラー・シュヴェーベバーン~ミュングストナー・ブリュッケ間、ミュングストナー・ブリュッケ~シュロス・ブルク間のルートが検索されます。
同様に、その場所へのルーティングが不可能な場合、その場所はスキップされます。
技術的な詳細
注意深い観察者は、メイン ダイアログがタブに含まれていることにお気づきかもしれません。 タブは単独では役に立ちません。 このタブは、ルーティングの場所がさまざまな形式で表示される可能性があるという考えを反映しています。 ルーティングの場所を提供する別の方法が要求された場合、そのタブは兄弟を取得する可能性があります。
私がこのアドインを作成しようと思ったのは、マップ全般と REST API 技術に対する私の興味が重なった結果です。 後者をより透明性を高め、おそらくさらに広く使用できるようにするために、3 つのファイルを JSL クックブックに追加しました。 これらは、他のプログラムから呼び出すことができる関数を定義しています。 1 つは MapQuest への REST 呼び出しです。 コンテンツとインターフェイスの説明については、ブログ投稿で説明します。粗雑な MapQuest 呼び出し。 他のスクリプトは REST 呼び出しのエンベロープです。 JMP リストを入力として受け取り、必要な JSON 構造を構築します。ジオコーディングまたはルーティング電話。 コーディングするアドレスが多数ある場合は、信頼性とパフォーマンスを向上させるために、アドレスを 50 個のブロックにパッケージ化します。 私のブログ投稿では、ジオコーディングそしてそのルーティングサブルーチンについては、これらのコード部分について詳しく説明します。
前に述べたように、JMP プログラマは、JMP データ構造と JSON の間で双方向に変換する JSL 関数を提供するという素晴らしい仕事をしました。 JSL 用語では、リストと連想配列が関係します。 これらの要素は積み重ねることができます。 … を含む連想配列のリストを含む連想配列がある場合があります。 MapQuest を 1 回呼び出すと、要素の一部のみが必要な豊富なデータ セットが提供されます。 場合によっては、これらはスタックの 2 レベルの深さになることがありました。また、多くのレベルが深い場合もあります。 そこで、次のことを書くと便利だと思いましたちょっとしたスクリプトこの構造を反復処理します。 そして、結果の視覚化を求めていなかったら、私は立派な JMPer ではなかったでしょう。 石川図で完璧な方法を見つけました。 これをプログラミングすることで、再帰の力を思い出しました。再帰は、深いスタックをステップダウンして安全に戻るための最良のテクニックです。 これは他のプログラマーにも役立つかもしれないし、インスピレーションを与えるかもしれないと思いました。 スクリプトをクックブックに組み込み、当然のことながら、投稿を書きました再帰と階層構造の描画について。
開発には JMP プロジェクトを使用し、JMP 15 を使用しました。 私の小さなプロジェクトが Projects なしでは実現できなかったとは言いませんが、Projects のおかげで作業がずっと簡単になりました。