개인프로젝트 또는 현업에서 종종 공공데이터포털의 데이터를 활용할 일이 꽤나 있습니다.
특히 최근에는 지도API를 활용한 업무가 많아졌습니다.
그런데..! 데이터 제공처마다 각각 다른 좌표 투영계를 사용하여 좌표를 제공하여 (표준통일같은건 없는거니..)
현재 사용중인 카카오맵SDK에서 기본으로하는 위경도 좌표계(위도 38.xxxx, 경도 126.xxx의 표시방법)로 좌표계 변환이 필요했습니다.
사실 지도 투영과 좌표계에 대한 내용은 GIS에 대한 좀 더 깊은 공부가 필요하지만, 저는 라이브러리를 사용하여 빠르고 간단하게 변환하는 방법을 선택해보겠습니다.😏
사용한 라이브러리는 proj.js라는 JavaScript 라이브러리로 지리 좌표 변환 소프트웨어입니다.
현재는 8버전까지 나와있으나, 릴리즈 4버전으로도 충분하여 proj4를 사용하도록 하겠습니다.
변환하실 좌표계의 EPSG 코드는 여기를 참고하시면 됩니다!
Node.js 샘플코드
node.js 환경에서 사용할 경우 npm으로 proj4 라이브러리를 설치해줍니다.
npm install --save proj4
proj.js의 기본구문은 아래와 같습니다.
let coord = proj4(proj4(fromProjection, toProjection, coordinates);
//fromProjection : 변환 대상 좌표계
//toProjection : 변환 목표 좌표계
//coordinates : 객체 또는 배열 형태 (예시 {x:'x', y:'y'} 또는 [x,y])
기본구문을 바탕으로 좌표변환하는 코드는 아래처럼 활용할 수 있습니다.
var proj4 = require('proj4');
//UTM-K 좌표계
var eps2097 = "+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs";
//GRS80(중부원점) 좌표계
var grs80 = "+proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.9996 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs";
//wgs84(위경도)좌표계
var wgs84 = "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees";
var grs80P = proj4(grs80, wgs84, [893204, 1652210]);
console.log(grs80P);
var eps2097p = proj4(eps2097, wgs84, [188387.5628, 183119.8984]);
console.log(eps2097p);
Java 샘플코드
아래의 External JAR파일을 lib폴더에 import하시고 사용하시면 proj4를 Java환경에서 이용하실 모든 준비가 끝났습니다.😄
jar파일은 추후에 이 게시글에 다시 첨부하도록 하겠습니다!😎
proj 기본 구문은 동일하며 Java에서는 ProjCoordinate 클래스를 이용하여 좌표를 변환합니다!
import org.locationtech.proj4j.BasicCoordinateTransform;
import org.locationtech.proj4j.CRSFactory;
import org.locationtech.proj4j.CoordinateReferenceSystem;
import org.locationtech.proj4j.ProjCoordinate;
public class TransCoord {
public ProjCoordinate transform(String strLon, String strLat) {
//parse to Double
Double dblLon = Double.parseDouble(strLon);
Double dblLat = Double.parseDouble(strLat);
CRSFactory factory = new CRSFactory();
CoordinateReferenceSystem grs80 = factory.createFromName("EPSG:5179");
CoordinateReferenceSystem wgs84 = factory.createFromName("EPSG:4326");
BasicCoordinateTransform transformer = new BasicCoordinateTransform(grs80, wgs84);
ProjCoordinate beforeCoord = new ProjCoordinate(dblLon, dblLat);
ProjCoordinate afterCoord = new ProjCoordinate();
//변환된 좌표
System.out.println(afterCoord.x + "," + afterCoord.y);
return transformer.transform(beforeCoord, afterCoord);
}
}
좌표변환 코드를 보면 세상짧고 별거없어 보이는 코드이지만....
저 라이브러리와 코드를 찾기위해 몇번이고 구글을 떠돌던 며칠전의 저와 같은 모습을 하고 계실 또 다른 분들이 도움이 되셨기를...!🙋♀️
'Today, I ()' 카테고리의 다른 글
[TIL-에러일기] TypeScript left-hand side of an arithmetic operation must be of type 'any' 'number' or an enum type Error (0) | 2024.06.13 |
---|---|
코드품질관리 분석툴 SonarQube 도입기 (2) (0) | 2022.01.13 |
3년차 주니어 개발자의 2021 회고 (0) | 2021.12.27 |
코드품질관리 분석툴 SonarQube 도입기 (1) (0) | 2021.11.25 |
다꾸? 아니 깃꾸! 뽄새 넘치는 Github 프로필 꾸미기 (0) | 2021.11.17 |