지오코딩은 한동안 사용되어 왔습니다. 그러나 이제 이 서비스는 더 많은 유연성과 정확성을 제공하는 REST 인터페이스를 통해 제공됩니다. 저는 Mapquest의 서비스를 사용하여 주소에 대한 지리 코드를 찾고 거리, 이동 시간 또는 위치 쌍 간의 전체 경로를 계산하는 추가 기능을 만들었습니다. 기능과 사용법에 대한 설명입니다.
나는 항상 지도에 매료되어 왔습니다. 디지털 지도가 출시되기 전에는 휴가 때마다 지도를 구입했는데, 대개 축척이 다르고 실제로 필요한 것보다 훨씬 더 자세한 지도였습니다. 그러니 나도 이 작품에 매료된 것은 전혀 놀랄 일이 아니다. JMP 데이터를 지도에 표시할 수 있는 의 그래프 기능입니다.
지오코딩이란 무엇입니까?
흥미로운 응용 프로그램 중 하나는 지오코딩, 즉 지도에서 지점을 찾는 기능입니다. 일반적으로 관심 장소와 주소가 있습니다. 위치를 찾아 지도에 표시하려면 지리좌표도 필요합니다. 예상하셨겠지만, 위키피디아 지오코딩에 대한 자세한 내용을 제공합니다.
새로운 지오코딩 추가 기능이 필요한 이유는 무엇입니까?
최근에는 컴퓨터 통신 기술로 알려진 나머지 더욱 널리 사용되게 되었습니다. 2019년 기조연설에서 John Sall은 다음과 같이 말했습니다. JMP의 비밀 기능 . ” JMP의 숨겨진 보석 중 하나는 JSL 명령을 통해 REST API(고급 프로그래밍 인터페이스)에 액세스하는 기능입니다. 컴퓨터 통신 데이터는 종종 “ JSON ” 데이터 구조를 활용하여 JMP 개발자는 JSL 데이터 구조와 JSON 데이터 간에 데이터를 쉽게 전송하는 JSL 명령을 만들었습니다. 이 기술은 점점 더 중요해지고 있습니다. 실제로 Johns Hopkins University와 Robert Koch Institut는 코로나19와 관련된 정보를 위한 데이터 풀에 REST API를 제공합니다. JMP 고객은 이를 사용하여 품질 관리를 위한 SAP 데이터에 액세스합니다. 저는 지오코딩에 하나를 사용합니다. 이 인터페이스는 관심 지점의 지리좌표 그 이상을 제공하므로 정보 교환 가능성을 확장합니다. 또한 사용자는 거리, 이동 시간, 경로에 대한 정보도 얻을 수 있습니다. 이 글은 의 사용법에 관한 것입니다. 추가 기능 내가 파일 교환에 로드한 것입니다. 기술적 배경은 마지막 단락에 요약된 대로 별도의 게시물로 제공됩니다.
기능은 무엇입니까?
관찰당 주소 정보가 포함된 데이터 테이블이 필요합니다. 주소는 세 가지 다른 수준의 지리 정보를 추가하는 데 사용될 수 있으며, 모든 수준에는 이전 수준의 정보가 포함됩니다.
- 지좌표
모든 관측치에 대해 해당 위치의 위도와 경도가 추가됩니다. 또한, 행정 단위, 국가, 주, 지역, 우편번호, 도시, 거리의 계층 구조를 얻을 수 있으며 데이터베이스에서 사용 가능한 정보까지 해당 주소가 얼마나 근접했는지 평가할 수 있습니다.
- 거리와 이동시간
데이터 테이블의 모든 연속 행 쌍(예: 1행 –> 2행 / 2행 –> 3행 /….)에 대해 주소 간 거리와 필요한 이동 시간이 두 번째 행에 추가됩니다. 연결은 추가 열에 열거됩니다. 이동 시간은 자동차, 자전거, 도보 등 사용자가 선택한 교통 수단을 기준으로 계산됩니다.
- 라우팅
위의 모든 정보와 연속된 두 행 사이의 경로를 설명하는 모든 지점의 지리 코드를 포함하는 추가 테이블이 생성됩니다.
전제
매핑 및 경로 지정 서비스를 제공하는 여러 인터넷 사이트가 있습니다. 저널에서 좋은 개요를 제공합니다. 프로그래밍 가능한 웹 . 나는 사용하기로 결정했다 맵퀘스트 . 이 회사는 다양한 유료 서비스뿐만 아니라 무료 API도 제공합니다. 사용하려면 먼저 등록하고 무료 API 키를 받아야 합니다. 물론 Geocoding 2020 추가 기능도 필요합니다. "Map Shapes" 하위 메뉴의 추가 기능 메뉴에 자동으로 설치됩니다.
첫 번째 호출 시 MapQuest에서 필요한 키를 얻을 수 있으며 키에 붙여넣을 필드가 제공된다는 알림을 받게 됩니다.

대화상자 알림이 비활성화됩니다. 키를 붙여넣은 후 적절한 MapQuest 키인지 확인하기 위해 테스트됩니다. 계속하기 전에 키를 확인해야 합니다. 유효한 키를 제공한 경우 해당 키는 AppData/Roaming/SAS/JMP 폴더의 사용자 디렉터리에 저장됩니다. 이 디렉터리가 없으면 생성됩니다.
추가 기능의 모든 명령이 작동하려면 JMP 언어를 영어로 설정해야 합니다. 그리고 "JMP 언어 사용..." 옵션을 선택합니다. 불행히도 JSL을 통해서는 이 작업을 수행할 수 없습니다. 파일 -> 기본 설정 -> Windows에 해당하는 언어를 사용하여 이러한 항목을 선택해야 합니다. 추가 기능은 언어 설정이 올바른지 확인하고 그렇지 않은 경우 경고를 표시합니다.
갑시다
메뉴는 두 부분으로 구성됩니다. 첫 번째 부분은 위쪽 빨간색 영역으로, 거의 모든 JMP 플랫폼 대화 상자처럼 구성되어 있습니다. 여기에는 열 목록, 역할 부분 및 작업 패널이 포함되어 있습니다. 역할 영역에는 파란색 테두리로 강조된 두 부분이 있습니다. 데이터 테이블에서 주소 정보는 두 가지 형식 중 하나로 저장될 수 있습니다. 즉, 전체 주소를 텍스트 문자열로 포함하는 하나의 열로 저장하거나, 각 열에 국가, 도시, 도시 등 주소의 일부를 포함하는 별도의 열로 저장할 수 있습니다. 거리. 이러한 형식 중 하나를 제공할 수 있지만 상호 배타적입니다. 두 경우 모두, 주소에는 국가가 포함되어야 합니다. . 원하는 대로 이름이나 ISO 코드로 지정할 수 있습니다.
두 번째 부분은 사용 가능한 옵션을 보여주는 아래쪽 빨간색 프레임입니다. 라디오 버튼 그룹으로 구성되어 있습니다(아래 스크린샷은 기본값을 보여줍니다). 모든 옵션은 데이터 테이블에 추가 열 그룹을 추가합니다. "라우팅"과 "상세 경로"를 조합하면 데이터 사본이 포함된 추가 데이터 세트가 생성됩니다. 이러한 지점은 "관심 지점"으로 식별됩니다. 또한 경로를 따라 회전해야 하는 지점인 "웨이포인트"가 있습니다.

예
모든 것이 어떻게 작동하는지 테스트하기 위해 인터넷에서 주소 정보를 수집했습니다. 저는 독일 서부의 작은 마을인 졸링겐에서 자랐습니다. 이곳은 중세 시대에 고품질의 검과 수저를 생산하는 곳으로 잘 알려져 있었습니다. 그래서 이곳에는 독일 수저 박물관이 있습니다. 박물관 옆에는 작지만 매우 인상적인 바로크 양식의 교회가 있습니다. 근처에 다른 유명한 장소도 있습니다:

|
도이치 클링겐 박물관
|
독일 칼 박물관
|

|
그레프라터 클로스터키르헤(Gräfrather Klosterkirche)
|
바로크 양식의 수도원 교회
|

|
네안데르탈인
|
우리 조상의 한 가지 유적이 최초로 발견된 지역
|

|
디 부퍼탈러 슈베베반
|
13km 길이의 현수철도는 1901년 개통된 세계에서 가장 오래된 현수형 전기 고가철도입니다.
|

|
다이 뭉스트너 브뤼케
|
1897년에 건설된 독일에서 가장 높은 철도 교량
|

|
슐로스 부르크
|
12세기에 지어진 재건된 성 일 세기
|
인터넷에서 주소를 검색한 후 해당 문자열을 JMP 데이터 테이블에 복사했습니다. 주소에는 국가 이름이 포함되어 있지 않으므로 모든 문자열 앞에 "Deutschland"를 추가했습니다. 문자열은 이제 다음과 같습니다
독일, Talstraße 300, 40822 Mettmann
|
독일, Alte Freiheit 24a, 42103 부퍼탈
|
독일, Klosterhof 4, 42653 졸링겐
|
독일, Klosterhof 3, 42653 졸링겐
|
독일, Müngstener Brückenweg, 42659 Solingen
|
독일, Schloßplatz 2, 42659 Solingen
|
일부러 독일 국가 이름인 'Deutschland'를 선택했습니다. 대화 상자에서 이 열을 "단일 주소" 역할에 할당하고 이동합니다.

실행 결과 다음 열이 데이터 세트에 추가됩니다.
지리정보
|
GC#위도
|
GC#경도
|
GC#국가 코드
|
GC#상태
|
GC#지구
|
GC#우편번호
|
GC#시티
|
GC#스트리트
|
GC#품질 평가
|
GC#반환 메시지
|
나는 열 이름이 그 자체로 말해준다고 생각합니다. MapQuest는 각 히트에 대한 예상 품질 등급을 제공합니다. 꽤 정교해서 해당 정보를 정확함, 가깝음, 근사함, 멀음의 네 가지 범주로 요약했습니다. 데이터 테이블의 행에는 이 등급에 따라 기호와 색상이 지정됩니다. 모든 위치는 지도에 표시되며, 이 지도를 재현하는 스크립트가 데이터 테이블에 추가됩니다. 포인트가 분포된 지역에 따라 배경 맵은 Street Map 또는 Simple Earth가 됩니다.
해당 데이터 테이블에서 주소 문자열을 단일 구성 요소로 분할하고(Cols à Utilities à Text to Column…을 사용하면 쉽습니다) "별도의 주소 필드" 역할을 사용하여 좌표를 요청했습니다.

이 섹션의 모든 역할 필드를 채울 필요는 없습니다. 국가는 최소 요구사항입니다. 더 많은 정보를 제공할수록 적중률이 높아집니다. 좌표를 요청하는 두 가지 방법의 결과는 완전히 동일하지 않습니다. 좌표자체는 다소 차이가 있을 수 있으며, 자세한 요청시에는 지역 등 추가 정보를 제공할 수 있습니다. 품질 평가도 다를 수 있습니다.
성능상의 이유로 단일 주소 필드는 하나의 문자열로 연결되며 데이터 테이블에 200개가 넘는 주소가 있는 경우 단일 문자열 요청이 MapQuest로 전송됩니다.
"경로"와 "거리/시간만" 조합을 선택하면 지오코딩과 동일한 정보와 3개의 추가 열을 얻게 됩니다. 때때로 다음과 같은 오류 메시지가 나타날 수 있습니다.
관심 장소
|
GC#반환 메시지
|
GC#거리(km)
|
GC#시간(자전거)
|
GC#다리
|
네안데르탈인
|
|
.
|
.
|
0
|
부퍼탈러 슈베베반
|
경로를 계산할 수 없습니다.
|
19.1287
|
:0:00:52:39
|
1
|
도이치 클링겐 박물관
|
경로를 계산할 수 없습니다.
|
0
|
:0:00:00:00
|
2
|
그레프라터 클로스터키르헤(Gräfrather Klosterkirche)
|
|
0
|
:0:00:00:00
|
삼
|
뭉스트너 브뤼케
|
|
9.92
|
:0:00:26:26
|
4
|
슐로스 부르크
|
|
5.0163
|
:0:00:13:55
|
5
|
연속된 행은 전체 경로의 한쪽 구간을 구성합니다. 대상 행에는 다리 정보가 들어 있습니다. 예에서 첫 번째 구간은 네안데르탈인에서 부퍼탈러 슈베베반까지입니다. 자전거 코스의 거리는 약 19km, 예상 소요 시간은 52분입니다.
어떤 이유로든 Deutsches Klingenmuseum이나 Gräfrather Klosterkirche까지 가는 자전거 경로를 찾을 수 없었습니다. 따라서 2구간과 3구간에는 여행정보가 없고, 4구간과 5구간은 다시 해당 정보를 제공합니다.
이 옵션 조합은 거리가 마일 단위로 지정된 데이터 테이블의 두 연속 행 사이의 경로에 대한 세부 정보를 요청합니다.
데이터 테이블은 지오코딩을 위해 위에서 설명한 열로 확장됩니다. 라우팅을 위해 데이터 테이블의 각 행 사본이 포함된 추가 테이블이 생성됩니다. 이 행 사이에 경로를 따라 중요한 지점마다 하나씩 새 선이 삽입됩니다. Solingen 투어의 마지막 부분은 다음과 같습니다.

행 49는 데이터 테이블의 마지막에서 다음 주소를 보유하며, 여기에서 레그 4가 끝납니다. 이전 장소에서 이 지점까지 이어지는 경로의 길이는 9.3마일이며, 자동차로 예상 소요 시간은 15분이다. '관심 포인트' 입니다. 다음 행은 +/- 300피트 5초의 운전 시간 이후 구간 5의 첫 번째 세그먼트의 끝입니다. 이는 다음(그리고 마지막) 관심 지점에 도달하기 전의 일련의 7개 경유지 중 첫 번째 경유지입니다. 지도에는 결과가 표시되며 해당 스크립트도 테이블에 있습니다.
데이터 테이블은 추가 기능의 일부이며 "도움말" 버튼을 사용하여 열 수 있습니다. 내가 포함시킨 관광명소의 사진을 보면서 놀기 시작하는 데 사용할 수 있습니다.
만약 너라면 이 지역에 와서 몇몇 장소를 방문해야 한다면, 서비스를 제공하는 레스토랑을 찾는 것을 잊지 마세요. 베르기셰 카페타펠 , 빵, 소시지, 찹쌀, 와플 등을 포함한 지역 특산품의 매우 풍부한 조합입니다. 시연으로 골랐던 곳은 지역 곳곳에 잘 알려져 있어서 많은 레스토랑에서 만나보실 수 있을 거예요.

첫 번째 실행 시
MapQuest에는 개인 API 키가 필요합니다. 당신은 그들의로부터 그것을 얻습니다 개발자 웹사이트 무료로. 추가 기능은 이 키를 요청하고 이를 붙여 넣을 필드를 제공합니다.

추가 기능은 SAS\JMP에 대한 사용자의 appdata 디렉터리에 키를 저장합니다. 매번 실행하기 전에 키 읽기를 시도하고 키가 있는 한 이를 사용합니다.
제외된 행/라우팅이 불가능함

추가 기능은 행에 기호, 색상 및 레이블을 할당하지만 라우팅 응용 프로그램에 특정한 결과를 가져오는 "제외된" 행 상태도 준수합니다. 행이 제외되거나 해당 주소로 라우팅이 불가능한 경우 해당 행을 무시하고 다음 주소로의 경로를 검색합니다.
이 상황에서는 네안데르탈인과 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가 아닐 것입니다. Ishikawa 다이어그램에서 완벽한 방법을 찾았습니다. 이것을 프로그래밍하면서 재귀의 힘이 떠올랐습니다. 재귀는 깊은 스택을 내려갔다가 안전하게 복귀하는 최고의 기술입니다. 나는 그것이 다른 프로그래머들에게도 도움이 되거나 영감을 줄 수 있다고 생각했습니다. 나는 그 대본을 요리책에 넣었고 – 자연스럽게 – 나는 게시물을 작성했습니다 재귀에 대해 알아보고 계층 구조를 그립니다.
개발에는 JMP 프로젝트를 사용하여 JMP 15를 사용했습니다. 프로젝트 없이는 내 작은 프로젝트를 진행할 수 없었다고 말할 수는 없지만 프로젝트를 사용하면 작업이 훨씬 쉬워졌습니다.