새로운 지오 코딩 추가 기능을 제공하기 위해 REST 인터페이스의 새로운 기술을 사용했습니다. 핵심은 각각의 REST 인터페이스에 대한 호출입니다. MapQuest , 많은 라우팅 서비스와 애플리케이션을 제공하는 회사입니다.
MapQuest의 서비스 중 하나는 라우팅입니다. 제공된 모든 주소 쌍에 대해 MapQuest는 국가 및 주와 같은 행정 정보뿐만 아니라 각 위치의 위도 및 경도를 반환합니다. 또한 두 지점 사이의 모든 웨이 포인트 위치와 첫 번째 주소에서 두 번째 주소로 이동할 방향을 변경할 위치를 제공합니다. 총 거리 및 예상 이동 시간과 같은 요약 정보도 제공됩니다. 두 주소로만 함수를 호출하면 경로 및 / 또는 주소 사이의 거리를 반환합니다. 주소 목록을 제공하면 연속적인 목록 요소 쌍마다 경로가 계산됩니다. 그런 다음 요소 1과 요소 2 사이, 요소 2와 요소 3 사이에 연결이 제공됩니다. n 개의 위치 목록은 n-1 개의 경로를 생성합니다.
데이터 테이블은 정보를 수집하는 일반적인 방법이므로 JMP , 분석은 사용자가 사용자 대화 상자를 통해 데이터 테이블의 열에 역할을 할당하는 것으로 시작됩니다. 그만큼 지오 코딩 2020 추가 기능 같은 방식으로 작동합니다. 사용자가 대화 상자를 완료하면 프로그램은 데이터 테이블에서 관련 데이터를 수집하고이를 REST API에 필요한 구조로 변환 한 다음 MapQuest로 보냅니다. 따라서 프로그램의 대략적인 구조는 1) 사용자 대화 상자 완성, 2) 데이터 수집, 3) 인터페이스 용 데이터 준비, 4) 인터페이스 요청 보내기, 5) 결과 해석, 6) JMP 데이터 테이블 작성입니다. 세 번째 단계 인 데이터 준비는 함수로 정의되며 다음과 같이 사용할 수 있습니다. MapQuest_route.jsl JSL Cookbook에서. 자체 지리 애플리케이션에 포함하거나 REST 호출을위한 데이터 구조화 방법에 대한 아이디어를 얻는 데 사용할 수 있습니다.
기준 기능
귀하 또는 귀하의 프로그램 사용자는 vlid가 필요합니다. API 키 MapQuest에서.
JMP 데이터는 데이터 테이블 열의 형태로 제공되는 반면 REST 인터페이스는 대부분 JSON 구조를 사용합니다. 결과적으로 두 형식간에 변환하는 기능이 필요합니다. JSL에는 또한 데이터 수집을위한 구조 (목록 또는 연관 배열)가 있습니다. 이 함수의 목적은 모든 비원시 JSL 명령을 캡슐화하는 것입니다. 필요한 데이터는 문자, 숫자 또는 목록 형식의 일반적인 JSL 변수와 함께 제공됩니다. 호출에서 반환되는 데이터는 JSL 목록으로도 제공됩니다. 따라서이 함수를 JSL 스크립트에 포함시키는 것은 JSL 표준 이상의 추가 지식이 필요하지 않습니다.
인터페이스
JSL 함수는 다음과 같은 명령문으로 호출됩니다.
결과 = function ();
함수에 매개 변수가 필요하거나 허용되는 경우 괄호 안에 나열됩니다. 이 함수 GC_route는 빈 대괄호 또는 전체 매개 변수 목록을 사용하여 호출 할 수 있습니다. 빈 대괄호로 호출하면 다음 섹션에 표시된대로 입력 및 출력에 대한 개요가있는 매개 변수 정의 창이 호출됩니다.

함수 호출의 매개 변수는 항상 위치 매개 변수입니다. 매개 변수를 사용하여 함수를 호출 할 때 모든 필수 매개 변수를 제공해야하지만 비어있을 수 있습니다.
내 내 지오 코딩 추가 기능에 대한 블로그 게시물 , 추가 기능을 사용하는 방법의 예로 고향 주변의 지역 관광 사이트를 몇 개 사용했습니다. 이 인터페이스가 어떻게 작동하는지보기 위해 두 가지를 살펴 보겠습니다.

|
Alte Freiheit 24a, 42103 Wuppertal, Deutschland
|
13km 길이의 현수 철도 인 Wuppertaler Schwebebahn은 1901 년에 개장했습니다.
|

|
Schloßplatz 2, 42659 Solingen, Deutschland
|
12에서 시작된 재건 된 성, Schloss Burg 일 세기.
|
먼저 MapQuest의 액세스 키가 필요합니다. 1234ABCD라고 가정 해 보겠습니다. 또한 다음을 가정하십시오.
- 모든 주소는 하나의 텍스트 문자열입니다.
- 한 쌍의 주소 문자열을 제공했습니다. 관련된 데이터 테이블이 없습니다.
- 자동차로 여행하고 싶습니다.
- 거리와 이동 시간에만 관심이 있습니다.
- 당신은 마일 단위의 거리를 원합니다.
이 인터페이스를 사용하는 한 가지 방법은 주소 문자열을 그대로 가져 오는 것입니다. 이 경우 형식 표시기 (위치 2)는 1 이상이어야합니다. 그러면 함수 호출은 다음과 같습니다.
routes = GC_route ("1234ABCD", "", 1, "fastest", "m", {"Alte Freiheit 24a, 42103 Wuppertal, Deutschland",<BR /> "Schloßplatz 2, 42659 Solingen, Deutschland"}, {}, {}, {}, {}, {}, {});
주소가 하나의 문자열이 아니라 별도의 요소에있는 경우 형식 표시기는 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이 0으로 설정 되었기 때문에 비어 있습니다. 그렇지 않으면이 배열에서 라우팅 정보를 찾을 수 있습니다.
호출의 매개 변수 목록이 약간 변경되면 출력이 크게 변경됩니다. 이것이“detail”플래그 인 매개 변수 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}], }
단순화를 위해이 예에서는 서로 가까운 두 장소 사이의 경로를 사용합니다. 경로는 시작 지점과 끝 지점 사이의 8 개의 경유지로 구성됩니다. 이들은 "gc # wpidx"키를 사용하여 연관 배열의 마지막 목록에 열거됩니다. 일부 정보는 시작 및 끝 위치에만 사용할 수 있으므로 일부 목록에는 너무 많은 결 측값이 있습니다. 모든 목록에는 동일한 수의 요소가 있으므로 전체 배열을 데이터 테이블로 쉽게 변환 할 수 있습니다.
기술적 세부 사항
이 함수는 한 쌍의 주소 또는 주소 목록을 입력으로받습니다. MapQuest는 각 여정의 끝점, 각 위치의 좌표, 각 지점 간의 방향 및 방향 변경이 발생해야하는 위치에 대한 위치 및 지리 정보를 다시 보냅니다. 이 간단한 작업을 위해 MapQuest는 다양한 입력 형식을 제공합니다. 주소 정보는 내 고향 근처의 유명한 성 주소 인 "Deutschland, Schloßplatz 2, 42659 Solingen"과 같이 쉼표로 구분 된 부분이있는 하나의 텍스트 문자열로 제공 될 수 있습니다. 또는 국가 =“Deutschland”, 거리 =“Schloßplatz 2”, 도시 =“Solingen”, 우편 번호 =“42659”와 같이 주소를 단일 요소로 지정할 수 있습니다.
대부분의 경우 두 개 이상의 주소가 조회 될 것이라고 가정합니다. 따라서 함수는 주소 정보를 전체 주소가있는 문자열 목록 또는 주소 요소가있는 여러 목록 인 목록으로 가져올 것으로 예상합니다. 형식에 관계없이 각 주소는 국가를 제공해야합니다. 그리고 필요한 최소한의 정보가 제공되는지 확인하지 않습니다. 다른 모든 요소는 선택 사항입니다.
자세한 라우팅이 요청되면 목록이 많은 배열이 반환됩니다. 각 목록의 첫 번째 요소는 첫 번째 위치에 속하고 후속 요소는 경로에 속하며 다시 두 번째 위치에 대한 요소 하나가 계속됩니다. 요청에 입력 된 위치와 돌아온 라우팅 포인트를 구별하기 위해 gc # coordtype은 원래 위치의 이름을 '관심 지점'과 '웨이 포인트'사이의 지점으로 지정합니다. gc # leg 목록은 목적지로 이어지는 모든 지점을 함께 붙입니다. 첫 번째 위치는 다리에 속하지 않습니다 (내 정의). 첫 번째 목적지를 포함하는 경로의 경우 하나입니다. 두 번째 목적지로가는 경로는 2 개입니다.
매개 변수 2에 대해 데이터 테이블에 대한 참조가있는 JSL 변수가 제공되고 세부 라우팅이 요청되면 위치 목록이 데이터 테이블의 위치 목록과 동일하다고 가정합니다. 참조 된 데이터 테이블의 모든 내용이 복사되고 자세한 라우팅과 함께 어레이에 삽입됩니다. 모든 목록에 웨이 포인트에 대한 누락 된 값이 있기 때문에이 정보는 관심 지점에만 연결될 수 있습니다.
경로를 찾을 수없는 경우 해당 구간의 원점에 해당하는 위치에 오류 메시지가 표시됩니다. 가능한 경우 후속 경로가 계산됩니다.
데이터 테이블에 대한 링크를 제공하고 해당 데이터 테이블에 제외 된 행이있는 경우 제외 된 행 목록을 제공해야합니다 (
excludedrows = As List( dt << Get Excluded Rows )
); 매개 변수 12로. 그렇지 않으면 목록이 동기화되지 않습니다. 메시지 목록에서 이러한 관찰은 "제외"로 표시됩니다. 원래 데이터 테이블에있는 것보다 더 많은 "제외 된"관측치가있는 경우 이러한 관측치는 최소한의 위치 정보를 제공하지 못한 것입니다.
이 코드가 프로젝트에 도움이되거나 JSL 애플리케이션에 대한 통찰력을 제공하기를 바랍니다. 질문이나 제안에 대해 열려 있지만 Geocoding 2020 추가 기능의 일부이므로 해당 추가 기능에서 의도 한 용도와 일치하는 변경 만 수행 할 것입니다.