ENVI 좌표변환 API와 Task

ENVI 영상의 좌표 인식

ENVI 인터페이스에서, 영상 위에 마우스를 이동하면, 인터페이스 좌측 하단에 현재 위치의 경위도(또는 설정에 따라 Map 좌표 등 다양한 좌표계 표시 가능)가 표시됩니다. Cursor Value를 실행하면 마우스를 클릭하는 지점의 경위도(Geo), Map 좌표(Map : UTM, 또는 TM 등 투영법 기준의 좌표를 의미합니다), 군용좌표(MGRS; Military Grid Reference System) 이 표시되고, 아래쪽에 영상의 Pixel 좌표(File) 그리고 해당 지점의 Pixel Value를 표시해 줍니다. Go To  창에는 이동하고자 하는 좌표를 경위도좌표라든지 Map 좌표로 입력하면 해당 위치로 바로 이동합니다. 한번 방문했던 좌표는 메모리에 남아 위 그림과 같이 풀다운 메뉴 형태로 목록화 됩니다. 재방문이 가능한 거죠.

이러한 작업에서 등장하는 것이 몇가지 좌표들입니다. 사실상 같은 위치인데, 좌표계 정의에 따라 다르게 표출되는 것입니다. 당연히 상호 변환이 가능합니다. ENVI에서 좌표변환 작업의 특징은, 지정된 영상을 기준으로 정의가 된다는 것입니다. (물론 Vector 파일을 올릴 경우에는 Vector 기준으로 정의가 됩니다). 앞선 글 “투영좌표 변환(TM과 UTM)”에서는, IDL에서 지도 좌표변환 방법과 관련된 함수를 소개하며,  IDL의 방식은 경위도와 특정 투영법 간의 변환이라는 취지의 설명을 드린 바 있습니다.

ENVI에서는 영상이 주축이 됩니다. 영상 없는 ENVI는 의미가 없는 것이죠. 두가지를 기억해 두시면 될 것 같습니다.

  1. 영상의 투영법과 관련된 Map 좌표가 주축이 됩니다. Map 좌표와 경위도 좌표간의 변환, Map 좌표와 File 좌표(Pixel 좌표)간의 변환 기능이 제공됩니다.
  2. 그러므로 내가 가진 영상의 Map 정보를 아는 것이 중요한데, 이는 Raster 데이터의 SPATIALREF 속성으로 가져옵니다.

예제 코드를 보시면 오히려 쉽게 정리가 될 수 있을 것 같습니다.

SpatialRef를 이용한 좌표변환 메쏘드는 다음과 같은 것이 존재합니다. 이 중 몇가지는 위 예제에서 보여 드렸지만, 사용법은 모두 비슷합니다.

  • ConvertLonLatToMap   / ConvertMapToLonLat
  • ConvertMapToFile / ConvertFileToMap
  • ConvertLonLatToMGRS / ConvertMGRSToLonLat
  • ConvertFileToFile / ConvertLonLatToLonLat / ConvertMapToMap

경위도와 Map 좌표간의 변환, Map좌표와 File 좌표 간의 변환은 투영된 영상을 다루는 ENVI의 특성상 Map좌표가 기준이 되도록 설계되어 있습니다. MGRS 체계는 경위도 좌표와 대응되도록 개발되어 있습니다. 다른 표현으로 MGRS에서 바로 Map 좌표나 File 좌표로 변환되지 않습니다. MGRS에서 File 좌표로 변환하고자 한다면 MGRS > LonLat > Map좌표 > File 좌표 로 변환의 단계를 거쳐야 합니다.

재미있는 것은 마지막 줄의 ConvertFileToFile, ConvertLonLatToLonLat, ConvertMapToMap 인데, 얼듯 보면, 뭐하러 경위도를 다시 경위도로 바꾸는가 하는 생각이 들 것입니다. 영상이 두 개 일 때, 두 영상의 SpatialRef를 따로 가지고 두 영상 서로간의 좌표체계로 변환하려고 존재하는 메쏘드들입니다. 예를 들어, 지구타원체 정의가 다른 영상이거나, 1번 영상은 UTM, 2번영상은 TM 좌표계일 수 있지요. 이럴 때 서로간의 좌표계로 상호 변환을 할 때 사용합니다.

지금까지는 ENVI의 API를 이용한 좌표변환을 소개하였습니다. 아래부터는 ENVI의 Task를 이용하여 같은 작업을 수행하는 과정입니다. Task 방식은 작업흐름(Workflow)을 따르는 방식과 유사합니다. 해당 작업을 ENVI GUI에서 수행한다고 생각하고, ENVI가 사용자에게 어떤 것들을 물어볼지 추정해 보면 흐름이 대강 잡힙니다. 물론 그렇다고 해서 매뉴얼(도움말) 안보고 하자는 얘기는 아닙니다. 도움말에 다 나오는 과정이고 그 과정 그대로 따르면 됩니다.

ENVI의 API가 먼저 개발되고, 이중 일부가 Task로 제공되고 있습니다. 앞으로 점차 많은 기능이 Task로 제공될 텐데, ENVI 5.4 기준으로는 다음과 같이 네 가지 변환 기능만 제공됩니다.

  • ConvertMapToGeographicCoordinates / ConvertGeographicToMapCoordinates
  • ConvertMapToPixelCoordinates / ConvertPixelToMapCoordinates

마지막으로, 예제에서는 모두 좌표 하나에 대해서만 변환을 수행했는데요, 배열을 이용하여 여러개의 좌표를 동시에 변환하는 것이 당연히 가능합니다.

SpatialRef를 이용하여 영상의 투영 정보를 확보하는 방식은, 여러개의 영상을 순차적으로 처리할 때 유용하게 됩니다. 100여장의 영상이 있고, 이 영상으로부터 우리 동네 공원(위경도를 알고 있는)의 NDVI 값을 추출하는 작업을 수행한다고 생각해 보면, 100여개의 영상이 Landsat 영상이든, Sentinel 영상이든, 읽는 방법은

Raster = e. OpenRaster(file)

이고, 투영정보를 가져 오는 방법은

SpatialRef = Raster.SpatialRef

입니다. 즉, 앞의 예제를 각각의 영상에 대해 반복문을 돌린다고 해도 코드를 수정할 부분은 사실상 전혀 없다고 보아도 되는 것입니다.