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

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

이 게시글은 6개 답변과 2명 참여가 있으며 마지막으로  Sangwoo에 의해 3 월, 3 주 전에 업데이트 됐습니다.

  • 글쓴이
  • #5271

    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

    ChoiYoun
    회원

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

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

    • 이 답변은  ChoiYoun에 의해 3 월, 3 주 전에 수정됐습니다.
  • #5288

    Sangwoo
    회원

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

    • #5291

      ChoiYoun
      회원

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

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

  • #5290

    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

      ChoiYoun
      회원

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

  • #5293

    Sangwoo
    회원

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

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