[GIS] 가벼운 좌표 변환 Java 오픈소스

오픈소스를 검색하고 사용할만하다.. 라는 항목 중에 하나가 “가볍다”입니다. 필요한 기능은 “딱” 하나인데.. 이 하나의 기능을 사용하기 위해 다른 라이브러리가 덕지 덕지 붙어야만 하는 라이브러리는 아무리 기능이 좋아도 사용할 수 없는 상황(모바일 GIS 개발)입니다..

GPS로부터 받은 WGS84 경위도좌표를 우리나라에서 흔히 사용하는 좌표계로 변환하기 위한 자바 기반의 오픈소스를 검색하던 중.. 가벼운 녀석을 찾았고.. 다시 몇일 동안의 검증을 통해 사용하기로 결정된 좌표변환 오픈소스가 바로 Java Map Projection Library입니다.

이 오픈소스가 참조하고 있는 또 다른 오픈소스 라이브러리는 행렬계산을 위한 Jama라는 오픈소스 라이브러리입니다. Jama는 이미 행렬계산을 위해 제가 예전부터 사용하고 있던터라.. 문제가 없었습니다. 아래는 간단히 경위도 좌표를 카텍 좌표계로 투영하는 코드의 예입니다.

import java.awt.geom.Point2D;
import com.jhlabs.map.proj.Projection;
import com.jhlabs.map.proj.ProjectionFactory;

public class EntryMain { 
    public static void main(String[] args) {
        String[] params = {
            "+proj=tmerc",
            "+lat_0=38N",
            "+lon_0=128E",
            "+ellps=bessel",
            "+x_0=400000",
            "+y_0=600000",
            "+k=0.9999",
            "+unit=m"
        };
  
        Projection katec = ProjectionFactory.fromPROJ4Specification(params);
        Point2D.Double pKatec = new Point2D.Double();
        katec.transform(128, 38, pKatec);
        System.out.println("result(" + pKatec.getX() +", " + pKatec.getY() +")");
    }
}

경도 128, 위도 38이 (400000, 600000)으로 투영되는 카텍좌표 투영에 대한 정보에 대한 인자로써 7~16라인의 코드에 params라는 문자 배열로 정의하고 있습니다. 이러한 인자값은 C언어 기반의 PROJ.4의 인자.. 바로 그것입니다. PROJ.4를 유용하고 사용하고 있는 저에게는 매우 반가운 방법입니다. 실제로 투영을 위한 Projection이라는 클래스의 객체를 생성하는 코드는 18번으로 앞서 정의한 인자값을 인자로 받습니다. 그리고 경도 128, 위도 38에 대한 좌표 변환은 20번 코드이고.. 21번 코드를 통해 화면에 출력해 확인하고 있습니다.

사용자 삽입 이미지

네, 위의 화면이 실행결과입니다. 그런데 석연치 않은 부분이 있습니다. 바로 20번 코드의 transform의 입력 인자로 받은 경도 128, 위도 38에 해당하는 타원체가 무엇인지에 대한 것입니다. WGS84 타원체일까… 아니면 Bessel 타원체 일까… 답은 Bessel인데요. 이유는 Projection 클래스의 객체를 생성하기 위해 정의했던 인자들 중 11번째 코드의 +ellips=bessel에 따릅니다. 그렇다면 앞서 말씀드렸던 목표.. GPS에서 수신받은 좌표체계인 WGS84 경위도가 아니라는 것입니다.

그렇다면 WGS84 경위도좌표계를 Bessel 경위도좌표계로 변환하고 이렇게 변환된 경위좌표를 카텍으로 변환해 주면 되겠군요. 하지만 여기서 문제는 이 Java Map Porjection 오픈소스가 타원체 간의 경위도 좌표 변환을 지원하지 않는다는 점입니다. 여기에 대한 해결점은 또 다른 포스팅(타원체간의 경위도 좌표계 변환 오픈소스 라이브러리)을 통해 공유해 드리겠습니다.

“[GIS] 가벼운 좌표 변환 Java 오픈소스”에 대한 7개의 댓글

  1. 안녕하세요. 덕분에 많은 도움이 되었습니다.
    요즘 좌표변환때문에 자료를 찾고 있는데 많은 도움이 되었구요
    올히신 JAMA라는 라이브러리를 활용해 보려하는데 위 소스와 반대로 WGS84좌표를 카텍좌표로 바꾸는방법은 어떻게 될까요? 오픈소스라 그런지 자료가 많지 않네요 ^.^

  2. 동부->중부 좌표변환할 일이 생겨서 사용했는데 잘되네요 ^^
    동부에서 중부로 좌표변환을 하기위해서 동부->경위도->중부 이렇게 경위도로 변환후 다시 변환하는 방법으로 좌표변환을 했는데요.. 혹시 경위도를 거치지않고 바로 변환할수 있는 방법이 있는지 궁굼하네요.. lon_0, lon_1 이렇게 사용하는 부분이 보여서 이런걸 이용해서 어떻게 하는것이 있는지 궁굼해서 여쭙게 되었습니다. ^^
    활지찬 한주 되세요 ^^

    1. 안녕하세요~ 코봉히님.
      위의 툴은 타원체간의 변환은 지원하지 않습니다.
      동부->경위도->중부로 변환했다고 하셨는데…
      경위도로의 변환은 이 글의 라이브러리만으로는 않됩니다.
      이 글의 하단 부분을 읽어보시길 바랍니다. ^^

  3. 앗~! 안되는거였나요;; 동부좌표의 파라메터를 이용한 Projection에서 tm좌표를 inverseTransform으로 경위도를 구하고 이를 다시 중부좌표의 파라메터를 이용한 Projection에서 transform해서 tm좌표를 구했는데… 다시 한번 확인해봐야겠네요;;

  4. 안녕하세요 제가 wgs84안드로이드 gps로받는 좌표를 tm중부로 변경하려고 검새중에 이글을 찾았았는데요 질문드려도될까요? 위의예제를 돌리기위해 proj4라이브러리를 추가하고 Point2D사용을 위해 자바jdk1.6 을 추가해쥤는데 빌드오류는없는데 빌드하고 안드로이드에서 위예제를 실행하면 projection 이 있는 18번에서 바로 오류나요 ..우선 제가하는벙법이 틀린건지 안드로이드에서 proj4를 사용할수없는건지가 제일궁굼합니다 이것때운에 3일째날새고있어요 ㅠ 답변 좀부탁드릴께요

    1. 답변이 많이 늦었습니다. proj4는 C언어 기반의 라이브러리인데.. 안드로이드에서 어떻게 사용하셨다는 것인지 먼저 궁금하구요.. 저 같은 경우는 Java Map Porjection라는 자바 기반의 오픈소스를 사용했습니다. 그러나 Java Map Porjection는 다른 타원체 간의 경위도좌표 변환은 지원하지 않아 이에 대해서는 별도의 라이브러리를 직접 개발해서 Java Map Porjection와 함께 사용했답니다. 위의 포스트는 이러한 내용에 대해 언급한 글입니다..

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다