RESTインターフェースの新しい手法を使用して、新しいジオコーディングアドインを提供しました。その中核は、それぞれのRESTインターフェースの呼び出しです。 MapQuest 、ルーティングサービスとアプリケーションの多くを提供する会社。
MapQuestのサービスの1つはルーティングです。MapQuestは、提供された住所のペアごとに、各場所の緯度と経度、および国や州などの管理情報を送信します。また、2つのポイント間のすべてのウェイポイントの位置と、最初の住所から2番目の住所に移動する方向を変更する場所も提供します。合計距離や推定移動時間などの要約情報も提供されます。関数が2つのアドレスだけで呼び出された場合、ルートおよび/またはそれらの間の距離が返されます。アドレスのリストを提供する場合、ルートは連続するリスト要素の各ペアについて計算されます。その後、要素1と要素2の間、要素2と要素3の間などで接続が行われます。nロケーションのリストは、n-1ルートを生成します。
データテーブルは、情報を収集する通常の方法です。 JMP 、分析は、ユーザーがユーザーダイアログを介してデータテーブルの列にロールを割り当てることから始まります。の Geocoding 2020アドイン同じように動作します。ユーザーがダイアログを完了すると、プログラムはデータテーブルから関連データを収集し、REST APIが必要とする構造に変換してから、MapQuestに送信します。したがって、プログラムの大まかな構造は次のとおりです。1)ユーザーダイアログを完了します。2)データを収集します。3)インターフェースのデータを準備します。4)インターフェースリクエストを送信します。5)結果を解釈します。6)JMPデータテーブルを書き込みます。3番目のステップであるデータ準備は、関数として定義され、次のように使用できます。 MapQuest_route.jsl JSLクックブックに。独自のジオアプリケーションに埋め込むか、それを使用してREST呼び出しのデータを構造化する方法のアイデアを得ることができます。
ベースライン機能
あなた、またはプログラムのユーザーはvlidを必要とします APIキー MapQuestから。
JMPデータはデータテーブル列の形式で提供されますが、RESTインターフェースはおそらくJSON構造を使用します。その結果、両方のフォーマット間で変換する機能が必要です。JSLには、データ収集のための構造(リストまたは連想配列)もあります。この関数の目的は、すべての非ネイティブJSLコマンドをカプセル化することです。必要なデータは、典型的なJSL変数とともに文字、数値、またはリスト形式で提供されます。呼び出しから返されるデータは、JSLリストとしても提供されます。したがって、この関数をJSLスクリプトに埋め込むには、JSL標準を超える追加の知識は必要ありません。
インターフェース
JSL関数は、次のようなステートメントで呼び出されます。
結果=関数();
関数がパラメーターを必要とする場合、またはパラメーターを受け入れる場合、それらは括弧内にリストされます。この関数、GC_routeは、空のブラケットまたはパラメーターの完全なリストを使用して呼び出すことができます。次のセクションに示すように、空の角かっこを付けて呼び出すと、入力と出力の概要を示すパラメーター定義ウィンドウが呼び出されます。

関数呼び出しのパラメーターは、常に定位置パラメーターです。関数をパラメーター付きで呼び出す場合、すべての必須パラメーターを指定する必要がありますが、空の場合があります。
私のジオコーディングアドインに関するブログ投稿 、アドインの使用方法の例として、故郷周辺のいくつかの地元の観光サイトを使用しました。この2つを見て、このインターフェースがどのように機能するかを見てみましょう。

|
Alte Freiheit 24a、42103ヴッパータール、ドイツ
|
世界で最も古い吊り下げ式の電気式高架鉄道である全長13 kmのヴッパータラーシュウェブバーンが1901年に発足しました。
|

|
Schloßplatz2、42659ゾーリンゲン、ドイツ
|
12に由来する再建された城、シュロスブルク番目世紀。
|
まず、MapQuestからのアクセスキーが必要です。1234ABCDだとしましょう。また、次のことを前提とします。
- すべてのアドレスは1つのテキスト文字列です。
- 一対のアドレス文字列を提供しました。データテーブルは含まれません。
- 車で旅行したい。
- 距離と移動時間のみに関心があります。
- 距離をマイル単位で求めます。
このインターフェイスを使用する1つの方法は、アドレス文字列をそのまま使用することです。この場合、フォーマットインジケーター(位置2)は1以上である必要があります。次に、関数呼び出しは次のようになります。
routes = GC_route ("1234ABCD", "", 1, "fastest", "m", {"Alte Freiheit 24a, 42103 Wuppertal, Deutschland",<BR /> "Schloßplatz 2, 42659 Solingen, Deutschland"}, {}, {}, {}, {}, {}, {});
アドレスが1つの文字列ではなく別個の要素にある場合、フォーマットインジケーターは0(ゼロ)である必要があります。つまり、呼び出しは次のようになります。
routes = GC_route ("1234ABCD", "", 0, "fastest", "m", {}, {"Deutschland", "Deutschland"}, {},
{"Wuppertal", "Solingen"}, {42103, 42659}, {"Alte Freiheit 24a", "Schloßplatz 2"}, {})
もちろん、値をパラメーターとして入れる必要はありません。国名のリストを含むリスト変数などの変数を指定することもできます。

いずれの場合も、結果は同じデータのリストです。
{200, "HTTP/1.1 200 OK", "", {}, {""}, {51.256414, 51.137675}, {7.148503, 7.152488}, {"close", "exact"},{"DE", "DE"},<BR />{"North Rhine-Westphalia", "North Rhine-Westphalia"}, {"Wuppertal", "Solingen"}, {"42103", "42659"},<BR /> {"Elberfeld", "Unterburg"}, {"Alte Freiheit", "Schloßplatz 2"}, {., 16.002}, {., 1600}, {}, {}, {0, 1}, [=>], }
両方の場所が検出され、距離と移動時間が計算されます。したがって、パラメーター5は空の文字列を含むリストです。最後に、空の連想配列([=>])の記号があります。パラメーター13(詳細フラグ)がゼロに設定されているため、空です。それ以外の場合、ルーティング情報はこの配列で見つかります。
呼び出しのパラメーターリストに小さな変更を加えると、出力に大きな変化が生じます。それは、パラメータ13、「詳細」フラグの変更です。1に設定されている場合、出力はすべてのルーティング情報を保持する配列によって拡張されます。
{200, "HTTP/1.1 200 OK", "", {}, {""}, {51.20971, 51.21327}, {7.07255, 7.08376},{"exact", "exact"}, {"DE", "DE"},<BR /> {"Nordrhein-Westfalen", "Nordrhein-Westfalen"}, {"", ""}, {"42653", "42653"}, {"Solingen", "Solingen"},<BR /> {"Klosterhof 4", "Lützowstraße 347"}, {., 1.0767}, {., 965}, {}, {}, {0, 1},<BR /> ["gc#city" => {"Solingen", ., ., ., ., ., ., ., ., "Solingen"},
"gc#coordtype" => {"Point of Interest", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "lPoint of Interest"},
"gc#ctrycd" => {"DE", ., ., ., ., ., ., ., ., "DE"},
"gc#dist" => {., 0.0064, 0.0499, 0.1481, 0.0853, 0.2366, 0.2993, 0.2478, 0.0032, 1.0767},<BR />"gc#district" => {"", ., ., ., ., ., ., ., ., ""},
"gc#lat" => {51.20971, 51.2099, 51.209949, 51.210171, 51.209187, 51.209667, 51.210789, 51.212135,51.213226, 51.21327},
"gc#leg" => {0, 1, 1, 1, 1, 1, 1, 1, 1},
"gc#long" => {7.07255, 7.072152, 7.072176, 7.072798, 7.074032, 7.074655, 7.077532, 7.081177, 7.084009, 7.08376},
"gc#msg" => {"", ., ., ., ., ., ., ., .},
"gc#postalc" => {"42653", ., ., ., ., ., ., ., ., "42653"},
"gc#ql" => {"exact", ., ., ., ., ., ., ., ., "exact"},
"gc#resp" => {0, ., ., ., ., ., ., ., .},
"gc#state" => {"Nordrhein-Westfalen", ., ., ., ., ., ., ., ., "Nordrhein-Westfalen"},<BR />"gc#street" => {"Klosterhof 4", "Klosterhof", ., "Gerberstraße", ., "Gräfrather Heide", .,<BR /> "Gräfrather Heide", "Lützowstraße", "Lützowstraße 347"},
"gc#time" => {., "00:00:05", "00:00:45", "00:02:13", "00:01:17", "00:03:32", "00:04:28", "00:03:42", "00:00:03", "00:16:05"},
"gc#wpidx" => {0, 1, 2, 3, 4, 5, 6, 7, 8, 0}], }
簡単にするために、この例では、互いに近い2つの場所間のルートを使用しています。ルートは、始点と終点の間の8つのウェイポイントで構成されます。それらは、キー「gc#wpidx」を持つ連想配列の最後のリストに列挙されています。一部の情報は開始位置と終了位置についてのみ利用可能です。そのため、一部のリストには非常に多くの欠損値があります。すべてのリストには同じ数の要素が含まれているため、配列全体を簡単にデータテーブルに変換できます。
技術的な詳細
この関数は、アドレスのペアまたはアドレスのリストを入力として受け取ります。MapQuestは、各行程の終点、各場所の座標、それらの間の各ポイントの方向、および方向の変更が必要な場所に関する位置情報と地理情報を返します。この簡単なタスクのために、MapQuestはさまざまな入力フォーマットを提供しています。住所情報は、「Deutschland、Schloßplatz2、42659 Solingen」のように、カンマで区切られた1つのテキスト文字列として指定できます。これは、私の故郷の近くの有名な城の住所です。または、住所を単一の要素として指定することもできます:国=“ Deutschland”、通り=“Schloßplatz2”、都市=“ Solingen”、郵便番号=“ 42659”。
ほとんどの場合、複数のアドレスが検索されると思います。したがって、関数はアドレス情報をリストとして取得することを期待しています。完全なアドレスを持つ文字列のリストか、アドレス要素を持ついくつかのリストのいずれかです。それぞれの住所は、その形式に関係なく、国を提供する必要があります。そして、必要最小限の情報が与えられているかどうかのチェックはありません。他のすべての要素はオプションです。
詳細なルーティングが要求されると、多数のリストを持つ配列が返されます。各リストの最初の要素は最初の場所に属し、後続の要素はルートに属し、次にもう一度1番目の要素が2番目の場所に属します。リクエストに入力された場所と戻ってきたルーティングポイントを区別するために、gc#coordtypeは元の場所に「興味のあるポイント」と「ウェイポイント」間のポイントを指定します。gc#legリストは、目的地に至るすべてのポイントを接着します。最初の場所はレッグに属していません(私の定義)。最初の目的地までのルートの場合は1つです。2番目の宛先へのルートの場合は2、以下同様です。
データテーブルへの参照を持つJSL変数がパラメーター2に提供され、詳細なルーティングが要求された場合、ロケーションのリストはデータテーブル内のロケーションのリストと同一であると想定されます。参照されたデータテーブルのすべてのコンテンツがコピーされ、詳細なルーティングと共に配列に挿入されます。すべてのリストにはウェイポイントの欠損値があるため、この情報は関心のあるポイントにのみリンクできます。
ルートが見つからない場合、そのレッグの起点に対応する位置にエラーメッセージが表示されます。可能であれば、後続のルートが計算されます。
データテーブルへのリンクを提供し、そのデータテーブルに除外された行がある場合、除外された行のリスト(
excludedrows = As List( dt << Get Excluded Rows )
);パラメータ12。そうしないと、リストが同期しなくなります。メッセージリストでは、これらの観測は「除外」としてマークされています。データテーブルに元々含まれているよりも「除外された」観測が多い場合、これらの観測は最小限の位置情報を提供できませんでした。
このコードがプロジェクトに役立つか、JSLのアプリケーションに対する洞察が得られることを願っています。質問や提案はありますが、Geocoding 2020アドインの一部であるため、そのアドインでの使用目的に沿った変更のみを行います。