OpenStreetMap을 배경으로 사용하기

이 글은 IDL 도움말의 “Image with a Map Projection” 을 서울 중심으로 일부 수정한 것입니다.

IDL 도움말의 Image with a Map Projection

OpenStreetMap의 staticMapLite API를 사용하면, 지정한 위치에 대한 지도를 그림 파일로 가져올 수 있습니다. 이 그림은 Mercator 투영법으로 된 지도인데, png 파일로 되어 있습니다.  그림을 가져오는 것은 IDLnetURL 기능을 이용하면 아주 간단한 기능입니다. 어려울 게 없죠. 다만, IDL의 그래픽스에서 지도의 배경으로 사용하려면, 이 그림에 대한 Mercator 투영 정보를 확보해야 합니다. 이 과정이 조금 까다로울 수 있는데, 그냥 도움말에 있는 내용을 베껴 써 보니 아무 걱정 없이 사용해도 될 것 같습니다. 혹시 중간 중간에 나오는 코드가 이해되지 않는다고 해도 별 상관 없겠습니다. 베껴 쓰기 시작하겠습니다.

위의 위경도 좌표는 서울시청의 위치입니다. OpenStreetMap의 Zoom 값을 12로 할 예정이고, 다운로드할 그림의 크기는 가로 800 픽셀, 세로 800 픽셀로 설정할 계획입니다.

이렇게 생긴 지도그림을 주세요… 라는 요청을 하는 URL 입니다. URL은 문자열이죠. 그래서 숫자들을 STRING 함수를 이용하여 문자열 형으로 변환하고, 이 때 발생하는 앞뒤 공백을 제거하기 위해 STRTRIM 함수를 사용했습니다. 복잡해 보이지만, 실제로 생성되는 URL 문자열은 그리 보기 어렵지 않습니다.

이 URL을 웹브라우저의 주소창에 넣기만 하면 지도 그림은 바로 받아집니다.

웹브라우저에서 OpenStreetMap staticmap을 요청

같은 요청을 IDL에서 수행하는 것도 전혀 어렵지 않은데 IDLnetURL 이라는 함수(사실은 오브젝트입니다)를 이용합니다.

처음 보는 장면이라면, 그냥 위와 같이 베껴쓰면 됩니다. osmstatic.png 라는 이름으로 다운로드 받게 될 것입니다. 당연히, 절대경로를 지정할 수도 있습니다(예: C:\Users\yi\Desktop\osmstatic.png). 그냥 파일 이름만 써 놓은 경우, ‘현재 디렉토리’ 에 저장될 텐데, 현재 디렉토리는 다음과 같이 확인이 가능해요.

저를 믿으시겠지만, 그럼에도 다운로드 받은 그림 파일이 잘 있는지 확인해 보시죠.

IDL의 iimage 를 이용하여 osmstatic.png를 확인

OpenStreetMap의 척도를 계산하는 과정입니다. 이 과정은 어차피 누구나 똑같이 해야 합니다. 베껴쓰면 된다는 얘기죠.

지정된 Zoom에 대해 meter/pixel 척도로 변환하는 과정이 있고, meter/pixel 값이 있다면, 그림파일의 가로방향 크기(픽셀 수, XS)와 세로방향 크기(픽셀수, YS)가 있으니, 이 그림이 실제로 가로폭 몇 meter 인지, 세로폭 몇 meter 인지 계산할 수 있게 됩니다. (deltax, deltay)

그 다음 단계는 이 지도 그림이 Mercator 좌표로 어디에 해당하는지 위치를 찾아내는 일입니다. 우리가 지도 그림을 요청할 때 지도 그림의 중심 위경도(LAT과 LON)를 이용했으니, 이를 Mercator 좌표로 변환하고, deltax(가로폭)과 deltay(세로폭)을 알기 때문에 가로폭, 세로폭을 반으로 나눠서 중심좌표에 더하고 빼면, 지도 그림의 사각경계좌표를 알 수 있게 됩니다.

IDL 도움말에서 제시한 방법은 다음과 같습니다.

첫 행의 MAP 함수가 화면상에 Graphics를 구현하는 것이 아니라, 좌표 변환을 하기 위해 이용하는 것이기 때문에 /BUFFER 키워드를 이용하였습니다. 실제 화면상에는 안보입니다. 화면에는 안보이지만, 메모리에는 존재하기 때문에 계산이 끝나면 m.close 문을 이용하여 MAP 객체를 닫습니다. 계산 결과는 마지막 행에 보이는데, 실제로는 x0, y0 만 사용될 것입니다. 사실 이 과정 역시 그냥 베껴 쓰면 됩니다. 어쨌든, 위치 알고(x0, y0) 크기 알았으면(deltax, deltay) 다 아는 겁니다.

자, 이제 IDL의 그래픽스에서 다운로드 받은 지도 그림을 지도투영에 맞추어 끼워 넣을 차례입니다. New Graphics에서는 IMAGE 함수 안에 지도 투영과 관련된 키워드들이 제공됩니다. 그림을 지도에 끼워 넣을 때, MAP 함수가 아닌 IMAGE 함수가 사용된다는 점은 기억해 두시면 좋겠습니다.

img 변수는 png 파일을 읽은 배열입니다. 거의 그대로 쓰면 되겠습니다. DIMENSIONS=[900, 900] 이 있는데, 별 의미는 아니고, 지도 그림이 800×800 픽셀 크기니까, 900×900 크기로 그림창을 열면 적당한 여백이 있는 구도가 되기 때문에 조금 더 크게 설정한 것 뿐입니다. 지도 그림의 좌측하단 좌표(x0, y0)와 지도 그림의 실제 크기(meter 단위로 deltax, deltay) 를 IDL에 알려 주는 것이 거의 모든 일입니다. 다음과 같이 그려집니다.

IMAGE 함수를 이용하여 Mercator 투영 표출

지도 그리기와 관련된 옵션들은 당연히 꽤 많습니다. 위 그림을 입맛에 맞게 수정하기 위해 아래 코드를 사용해 보세요.

mg 객체는 그림창의 MAP GRID와 관련된 모든 정보와 통제권을 가지고 있다고 생각하면 되겠습니다.

  • mg.LINESTYLE로 선의 종류를 선택하고(디폴트 0은 실선, 1은 점선 등…),
  • mg.LABEL_POSITION으로 LABEL의 위치를 오른쪽과 상단으로 옮깁니다(0~1 사이의 값인데, 디폴트는 0.5(중앙) 입니다. 위 그림의 LABEL_POSITION이 바로 0.5 였습니다).
  • mg.longitude(경도눈금의 LABEL을 LABEL_ANGLE을 이용하여 0으로 – 가로방향쓰기)
  • mg.latitude(위도눈금의 LABEL을 270도 – 위에서 아래 방향으로 세로 쓰기)로 바꾸어 놓습니다.
  • BOX형 AXIS 테두리를 만들고 두께를 3으로 지정하는 과정까지 처리하면 다음 상태가 됩니다.

 

MAP GRID 설정 변경 결과

이제부터 좋은 점은, 이 그림이 실제로 지도투영에 맞추어져 있다는 것입니다. 예를 들어, 우리가 기상청 AWS 좌표를 가지고 있다면, 이 위에 바로 뿌릴 수 있는 것이죠.

위와 같이 awslats 변수와 awslons 변수가 있다면 (경위도 정보가 있다면), 해당 위치에 표시를 하는 것은 당연히 간단합니다. IDL의 지도 위에 점을 찍는 것은 일 같지도 않은 일이니까요.

서울시에 설치된 기상청 AWS 위치(예시)

공개지도를 이용하여, IDL 지도의 배경을 깔아 보자는 취지의 글이었습니다. David Fanning 박사님의 글을 보니 Google 지도도 거의 같은 방법으로 사용할 수 있겠군요.

David Fanning 박사님의  Google Map 사용 관련 글 링크

  • http://www.idlcoyote.com/map_tips/googlemap.php