프로그램/Java

좌표계 변환

milktea.kang 2021. 5. 14. 13:42

dependency

<dependency>
    <groupId>org.osgeo</groupId>
    <artifactId>proj4j</artifactId>
    <version>0.1.0</version>
</dependency>

 

service

import org.osgeo.proj4j.BasicCoordinateTransform;
import org.osgeo.proj4j.CRSFactory;
import org.osgeo.proj4j.CoordinateReferenceSystem;
import org.osgeo.proj4j.ProjCoordinate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

@Service
public class GpsService {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 좌표계 변환
     * @param locX
     * @param locY
     * @param crsFrom (EPSG:5179)
     * @param crsTo (EPSG:4326)
     * @return
     */
    public String[] convEpsg(String locX,String locY,String crsFrom,String crsTo) {
//        logger.info("convEpsg {},{},{},{}",locX,locY,crsFrom,crsTo);
        String[] result = null;
        try {
            double dX = Double.parseDouble(locX);
            double dY = Double.parseDouble(locY);

            CRSFactory factory = new CRSFactory();
            // CoordinateReferenceSystem srcCrs = factory.createFromName("EPSG:5179");//현재 좌표
            CoordinateReferenceSystem srcCrs = factory.createFromName(crsFrom);//현재 좌표
            if(ObjectUtils.isEmpty(crsTo) == true) {
                crsTo = "EPSG:4326";
            }
            CoordinateReferenceSystem dstCrs = factory.createFromName(crsTo);//변경할 좌표
//            CoordinateReferenceSystem dstCrs = factory.createFromName("EPSG:5181");//다음맵에서 사용중인 좌표계
            // https://devtalk.kakao.com/t/topic/35844/3

            BasicCoordinateTransform transform = new BasicCoordinateTransform(srcCrs, dstCrs);

            ProjCoordinate srcCoord = new ProjCoordinate(dX, dY);
            ProjCoordinate dstCoord = new ProjCoordinate();

            transform.transform(srcCoord, dstCoord);//좌표변환
            String lng = String.format("%.18f",dstCoord.x);
            String lat = String.format("%.18f",dstCoord.y);
//            logger.info("lat:{},lng:{}",lat,lng);
            if(ObjectUtils.isEmpty(lat) == false && ObjectUtils.isEmpty(lng) == false) {
                result = new String[] { lng,lat };
            }
        }catch(Exception ex) {
            logger.error("convEpsg",ex);
        }
        return result;
    }
}