MAPCONTINENTS를 이용하여 shape file을 읽을 경우

게시판 IDL Q&A MAPCONTINENTS를 이용하여 shape file을 읽을 경우

4 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #5271 Reply
      ChoiYoun
      회원

      안녕하세요.

      MAPCONTINENTS 함수를 이용하여 shape file을 읽어 표출할 경우, MAP의 경계(LIMIT)에 따라 MAPCONTINENTS 함수가 작동하지 않는 문제에 대해 도움을 구하고자 글 남깁니다.

      아래는 예제코드 입니다.

      ;MAPCONTINENTS works
      sb = 5 &wb = 100 &nb = 25 &eb = 115
      m = MAP(‘Geographic’, CENTER_LONGITUDE = 107, $
      LIMIT = [sb,wb,nb,eb])
      mc_VNM = MAPCONTINENTS(‘./VNM_adm1.shp’)

      ;MAPCONTINENTS not works
      sb = 12 &wb = 112 &nb = 22 &eb = 102
      m = MAP(‘Geographic’, CENTER_LONGITUDE = 107, $
      LIMIT = [sb,wb,nb,eb])
      mc_VNM = MAPCONTINENTS(‘./VNM_adm1.shp’)

    • #5286 Reply
      ChoiYoun
      회원

      예제코드에 사용된 파일은 아래 링크에서 다운로드 받을 수 있습니다.

      ▶Shape file 다운로드(25메가바이트)

      • 이 답변은 ChoiYoun에 의해 5 years, 11 months 전에 수정됐습니다.
    • #5288 Reply
      Sangwoo
      회원

      작동하지 않는 문제는 shape file의 문제가 아니고, MAP 함수의 LIMIT 키워드에서 값들의 순서가 잘못되었기 때문입니다. LIMIT에 주어지는 4개의 값들의 순서는 lat_min, lon_min, lat_max, lon_max가 되어야 하는데, 작동안한다는 예제의 코드를 보면 lon_min이 lon_max보다 큰 값으로 설정되어 있기 때문에 이런 문제가 발생하는 것입니다. 따라서 두 값을 서로 바꾸면 됩니다.

      • #5291 Reply
        ChoiYoun
        회원

        맙소사, 이런 실수 때문에 작동 안하는 것이었다니 정말 감사합니다. 밑에 코드는 왜 작성했는지.. 헣헣헣.. 좋은 공부가 되었습니다.

        ps. 머리가 나쁘면 몸이 고생하네요.

    • #5290 Reply
      ChoiYoun
      회원

      글 찾아오시는 분이 계실까봐 스스로 답변 달아봅니다. 저는 아래와 같은 방법으로 해결하였습니다.

      MAPCONTINENTS 함수를 이용하지 않고 shape file에 직접 접근하여 PLOYLINE을 이용하여 표출하였습니다.
      즉, mc_VNM = MAPCONTIENTS(‘./VNM_adm1.shp’) 대신 아래 코드를 사용하였습니다.

      ;INSTEAD MAPCONTINENTS =======================
      shp = IDLFFSHAPE(‘./VNM_adm1.shp’)
      shp.getProperty, N_ENT = n_ent
      shp_ent = shp.getEntity(/ALL)
      for ient = 0, n_ent – 1 do begin
      n_parts = shp_ent[ient].n_parts
      for ipart = 0, n_parts – 1 do begin
      cuts = [*shp_ent[ient].parts, shp_ent[ient].n_vertices]
      n_conn = cuts[ipart + 1] – cuts[ipart]
      temp_conn = cuts[ipart] + INDGEN(n_conn)
      if ipart eq 0 then begin
      connectivity = [n_conn, temp_conn]
      endif else begin
      connectivity = [connectivity, n_conn, temp_conn]
      endelse
      endfor
      temp_x = TRANSPOSE((*shp_ent[ient].vertices)[0, *])
      temp_y = TRANSPOSE((*shp_ent[ient].vertices)[1, *])
      pline = POLYLINE(temp_x, temp_y, /DATA, TARGET = m, $
      CONNECTIVITY = connectivity)
      endfor
      ;=============================================

      • #5292 Reply
        ChoiYoun
        회원

        이 코드는 위에 답변해주신 내용처럼 MAP의 LIMIT를 제대로 설정하면 사용할 필요가 없는 코드입니다.

    • #5293 Reply
      Sangwoo
      회원

      사실 저 순서가 그리 직관적인 편은 아니어서 항상 헷갈리기 때문에, LIMIT 키워드 사용할 때마다 도움말을 매번 참조하게 되긴 합니다. 저같은 경우는 그냥 “랫민, 론민, 랫맥스, 론맥스” 이런 식으로 마치 입시 때 암기과목 공부하듯이 외우니까 좀 낫긴 하더군요^^ 그리고 shape 파일이 기본적으로 바이너리 파일이기 때문에, 저렇게 내부의 내용들을 해독해서 필요한 정보들을 추출해서 사용하는 것은 좀 복잡할 수는 있겠지만 꽤 괜찮은 접근 방법이라고 봅니다.

4 답변 글타래를 보이고 있습니다
'MAPCONTINENTS를 이용하여 shape file을 읽을 경우'에 답변달기
글쓴이 정보: