map 위경도 추출

게시판 IDL Q&A map 위경도 추출

이 게시글은 7개 답변과 4명 참여가 있으며 마지막으로  jhlee에 의해 1 시간, 53 분 전에 업데이트 됐습니다.

  • 글쓴이
  • #5423

    nopane11
    회원

    안녕하세요,

    보통 MAP_SET 으로 어떤 지도를 쓸것인지 정하고 CONTOUR 하잖아요?

    그래서 우리가 위도,경도,값이 있다면 MAP_SET에서 설정한 map projection의 위경도에 맞게 값을 대입해서 표출하게되는데

    이때 map projection의 위경도를 추출할 수 있는 방법이 있나요?

    예를들어

    어떤 자료를 /isotropic으로 표출할 때 그 isotropic의 위경도 값을 알고싶습니다

  • #5424

    ChoiYoun
    회원

    안녕하세요. 짧은 지식이지만 도움이 되실까하여 답변 답니다.

    Q1. 보통 MAP_SET 으로 어떤 지도를 쓸것인지 정하고 CONTOUR 하잖아요?
    A1. 맞습니다.

    Q2. 우리가 위도,경도,값이 있다면 MAP_SET에서 설정한 map projection의 위경도에 맞게 값을 대입해서 표출하게되는데 이때 map projection의 위경도를 추출할 수 있는 방법이 있나요?
    A2. 질문에 틀린 내용이 있습니다. 지도 투영법(map projection)은 위경도 값을 변경하는 방법이 아닙니다. 투영법은 지리 좌표계(Geographic coordinate system)를 직교 좌표계로 변경하는 방법입니다. 즉, (위도,경도)를 (x, y)로 바꾸는 방법입니다. 따라서 표출한 그림의 위경도는 투영법의 종류와 무관합니다.

    Q3. 어떤 자료를 /isotropic으로 표출할 때 그 isotropic의 위경도 값을 알고싶습니다
    Q3. /isotropic은 투영법이 아닌 표출하는 그림의 x축과 y축의 스케일을 동일하게 만들어줄 때 사용하는 키워드입니다. 또한, isotropic 키워드를 추가한다하여 표출한 그림의 위경도가 달라지지 않습니다.

    C1. 질문자께서 (위도, 경도)에서 투영법을 거친 (x, y)가 궁금한 상황이라면 MAP_PROJ_TOWARD, MAP_PROJ_BACKWARD 함수를 공부해보시기 바랍니다. 그러나 이러한 함수는 본인이 사용하는 투영법에 대한 이해가 우선입니다.

    • 이 답변은  ChoiYoun에 의해 2 주, 5 일 전에 수정됐습니다.
    • 이 답변은  ChoiYoun에 의해 2 주, 5 일 전에 수정됐습니다.
  • #5427

    Sangwoo
    회원

    “map projection의 위경도를 추출할 수 있는 방법”이라고 하시면 정확히 어떤 것을 원하시는 것인지 상당히 모호합니다. 질문하고자 하시는 내용이, 어떤 특정한 투영법(Map Projection)으로 그려진 지도상에서 특정한 포인트에 대한 경위도 좌표를 추출하는 방법에 관한 것인지요? 그런 경우에는 Cartesian XY 좌표와 Lon/Lat 좌표 사이의 변환이 필요한데 그러한 역할을 하는 내장함수들이 바로 MAP_PROJ_FORWARD와 MAP_PROJ_INVERSE입니다. MAP_PROJ_FORWARD 함수는 XY 좌표를 경위도 좌표로 변환하는 역할을 하고 MAP_PROJ_INVERSE 함수는 그 반대입니다. 다만 이 함수들을 제대로 사용하려면 MAP_PROJ_INIT라는 함수도 함께 사용을 해야 합니다.

    그래서 질문하고자 하시는 내용을 좀 더 구체적으로 알려주셨으면 합니다.

    • #5439

      nopane11
      회원

      정지궤도위성의 경우 위경도가 정해져있잖아요?

      그 정해진 위경도에 격자마다 값을 주어서 그걸 표출하는데

      정해진 위경도가 어떤 projection의 위경도겠죠?

      lcc라던지 다른 프로젝션으로 바꿔보고 싶어서요

      예를들어 MODIS의 AOD를 표출하는데 MODIS의 위경도가 어떤 프로젝션의 위경도로 고정되어서 제공하니까

      그걸 다른 프로젝션의 위경도로 바꿔보려고 합니다 ㅠ

    • #5444

      ChoiYoun
      회원

      질문자님 말씀을 토대로 추측하였을 때 가지고 있는 정보는 “위경도 정보”가 아니라 투영법을 거친 “직교좌표계 정보”라는 말씀인 것 같습니다. 투영법을 거친 위경도 정보는 (x,y)형태의 “직교좌표계 정보”입니다.

      <예시>
      위경도 정보: (126.0, 37.0), (127.0, 38.0)
      직교좌표계 정보: (0, 0), (1, 0)

      물론 투영법을 거친 (x, y)가 위경도를 의미하긴 하지만 이는 투영법을 알고 있을 때 위경도가 됩니다. 이것이 무슨 차이를 가지고 있는지 아래 예시 코드가 도움이 되셨으면 합니다.

      다음과 같이 3가지 투영법이 있습니다(m1, m2, m3). 그리고 위경도 정보를 lon_arr, lat_arr와 같이 가지고 있을 때, 각 투영법을 적용하여 표출하는 방법은 c1, c2, c3와 같습니다.

      data_arr = ;SOMETHING
      lat_arr = ;SOMETHING[deg.] ex: lon_arr[0]=128.0
      lon_arr = ;SOMETHING[deg.] ex: lat_arr[0]=37.0

      m1 = MAP(‘Geographic’, CENTER_LONGITUDE = 127)
      m2 = MAP(‘Lambert Conformal Conic’, $
      STANDARD_PAR1 = 30, STANDARD_PAR2 = 60, $
      CENTER_LONGITUDE = 126, CENTER_LATITUDE = 38)
      m3 = MAP(‘Miller Cylindrical’, $
      CENTER_LONGITUDE = 127, FALSE_EASTING=2546731.496d, FALSE_NORTHING=-4354009.816d)

      c1 = CONTOUR(data_arr, lon_arr, lat_arr, GRID_UNITS=’Degrees’, OVERPLOT = m1)
      c2 = CONTOUR(data_arr, lon_arr, lat_arr, GRID_UNITS=’Degrees’, OVERPLOT = m2)
      c3 = CONTOUR(data_arr, lon_arr, lat_arr, GRID_UNITS=’Degrees’, OVERPLOT = m3)

      즉, 위경도 정보를 알고 있으면 투영법만 바꿔주면 알아서 표출해줍니다.
      반면에 직교좌표계 정보를 알고 있을 경우 투영법을 이용해 “위경도 정보”로 바꿔주는 과정이 필요합니다. 이와 관련된 상세한 내용은 아래 이상우 박사님 블로그의 “MapForward, MapInverse 메서드의 이해와 활용”을 참조하시면 좋을 것 같습니다.

      http://blog.daum.net/swrush

      질문자님이 사용하는 MODIS가 어떤 형식인지 알 수 없으나, 투영법을 거치지 않은 위경도 자료일 경우 투영법만 변경하여 표출하시면 됩니다.

    • #5440

      nopane11
      회원

      답변해주신걸 제가 제대로 이해하고있는지 모르겠네요

      어떤 특정한 투영법의 격자로 구성된 위성자료를 다른 투영법의 격자로 변환하기 위해서는

      MAP_PROJ_FORWARD 함수를 이용해야 한다 그리고 MAP_PROJ_INIT도 필요하다라는 말씀이시죠?

      매우 생소한 함수들이네요..

  • #5445

    Sangwoo
    회원

    아마도 말씀하시는 위성자료가 경위도 격자 기반의 자료가 아니라 거리 격자 기반의 자료인 것으로 보입니다. 예를 들어 3km 자료라고 하면 특정 지점으로부터 XY방향으로 3km씩 떨어져있는 격자점들로 구성된 2차원 자료가 될겁니다. 이런 경우에는 어떤 투영법의 지도를 기준으로 하고 있다는 것이 명시가 될 것입니다. 따라서 격자들의 위치나 간격 등의 공간적 분포는 XY좌표계 기준으로 보면 사각형이 되겠지만, 경위도 좌표계 기준으로 보면 규칙적이지 않겠지요. 그래서 아마 예를 들어서 특정 투영법(예를 들어 LCC) 기준의 거리 기반 격자 자료를 또 다른 투영법 기반으로 변환해서 표출해보고자 하는 경우인 것으로 보입니다.

    이런 경우라면 제 생각에는 두 단계로 처리가 되어야 할 것으로 보입니다. 첫번째 단계에서는 거리 격자 기반인 원래 자료를 경위도 격자 기반의 자료로 변환을 하고, 두번째 단계에서는 앞서 변환된 경위도 격자 기반 자료를 다른 원하는 투영법의 지도상에 표출하는 것입니다. 그런데 다른 투영법의 지도상에서 표출하는 것까지가 목적이냐 또는 다른 투영법 지도 기준의 새로운 거리 격자 기반의 자료로 변환을 할 것이냐에 따라 다음 세번째 단계가 더 필요할 수도 있습니다. 그런데 1~2단계에 한해서만 다시 본다면, 거리 격자 기반의 자료는 경위도 격자 기반의 좌표계의 입장에서 볼 때에는 일종의 “불규칙한” 격자 분포를 하는 데이터입니다. 따라서 이러한 “불규칙” 격자 분포 데이터(원본 데이터)를 경위도 규칙 격자 분포 데이터로 변환하는 작업이 아무래도 핵심이 됩니다. 이러한 작업에 있어서는 몇가지 방법이 있는데, GRIDDATA와 같은 IDL 내장함수를 활용하는 것도 하나의 방법이 될 수 있습니다. 이와 관련해서는 윗 댓글에서 소개된 제 IDL 블로그에서 “불규칙 분포 데이터를 규칙 격자화된 데이터로 만들기”라는 제목의 게시물들의 내용을 참조해볼만 합니다. 이러한 처리가 끝난 경위도 격자 기반 데이터는 어떤 투영법의 지도로든 쉽게 표출이 됩니다.

    그리고 위에서 언급된 MAP_PROJ_FORWARD, MAP_PROJ_INVERSE, MAP_PROJ_INIT, MapForward, MapInverse 등은 지도상의 특정 지점 몇개에 대한 좌표 변환이 필요할 경우에 사용 가능한 기능들입니다. 만약 격자들에 대한 좌표 정보를 배열의 형태로 갖고있을 경우 이와 같은 기능들을 활용하여 변환 좌표를 구하는 것도 가능은 할거라고 봅니다. 결국은 주 목적이 투영법 변환을 해서 그 결과를 표출하는 것이냐 아니면 변환된 투영법 기반의 좌표 정보까지 계산할 것이냐에 따라 어떤 방향으로 작업을 할 것이냐가 결정될 것이라고 봅니다.

  • #5447

    jhlee
    Keymaster

    다른 분들께서 이미 IDL을 이용한 다양한 방법에 대해 답변을 주신 것 같습니다.
    혹시 IDL만 사용하시는게 아니라 ENVI 사용도 가능하신 유저라면, 아래 링크의 내용도 참고하시면 좋겠습니다.
    http://idl.selab.re.kr/?p=3167
    위 링크에서 설명하는 API와 TASK는 ENVI의 기능을 IDL 문법으로 처리하는 것이라서 IDLer 라면 쉽게 이해가 가능하리라 생각합니다.

답변은 로그인 후 가능합니다.