From 623b1f4544cd9ec8af3a680496eabff84b44de38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=9E=AC=EC=9A=B0?= <박재우@host.docker.internal> Date: Tue, 24 Oct 2023 16:09:24 +0900 Subject: [PATCH] =?UTF-8?q?coordinate=20convert=20util=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/palnet/comn/utils/DmsUtils.java | 180 ++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 pav-server/src/main/java/com/palnet/comn/utils/DmsUtils.java diff --git a/pav-server/src/main/java/com/palnet/comn/utils/DmsUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/DmsUtils.java new file mode 100644 index 0000000..a223a1e --- /dev/null +++ b/pav-server/src/main/java/com/palnet/comn/utils/DmsUtils.java @@ -0,0 +1,180 @@ +package com.palnet.comn.utils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.locationtech.jts.geom.Coordinate; + +public class DmsUtils { + + /* 아래의 3가지 형식에 해당하는 좌표들끼리 자유롭게 변환이 가능하도록 만든 유틸리티입니다. + * RQ Sample + * DD : 41.40338, 2.17403 + * DMS : 41°24'12.2"N 2°10'26.5"E / 36° 18′ 09″ N 128° 05′ 40″ E + * DMM : 41 24.2028, 2 10.4418 + * 결과값에 오차가 조금씩 발생 할 수 있으나 Google Map 좌표상으로 무시할 수 있는 범위 내에서 발생합니다. + */ + + public static Coordinate convertDMStoDD(String DMS) { + + String regex = "(\\d+\\.?\\d*)[°]?\\s*(\\d+\\.?\\d*)[′'′]?\\s*(\\d+\\.?\\d*)[″'\"“”]?\\s*([NSEW])\\s*(\\d+\\.?\\d*)[°]?\\s*(\\d+\\.?\\d*)[′'′]?\\s*(\\d+\\.?\\d*)[″'\"“”]?\\s*([NSEW])"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(DMS); + + Coordinate coord = new Coordinate(); + if (matcher.find()) { + double latitude = Double.parseDouble(matcher.group(1)) + Double.parseDouble(matcher.group(2)) / 60.0 + Double.parseDouble(matcher.group(3)) / 3600.0; + if (matcher.group(4).equals("S") || matcher.group(4).equals("W")) { + latitude = -latitude; + } + + double longitude = Double.parseDouble(matcher.group(5)) + Double.parseDouble(matcher.group(6)) / 60.0 + Double.parseDouble(matcher.group(7)) / 3600.0; + if (matcher.group(8).equals("S") || matcher.group(8).equals("W")) { + longitude = -longitude; + } + + coord.setX(latitude); + coord.setY(longitude); + + } + + return coord; + } + + public static String convertDMStoDMM(String DMS) { + + String regex = "(\\d+\\.?\\d*)[°]?\\s*(\\d+\\.?\\d*)[′'′]?\\s*(\\d+\\.?\\d*)[″'\"“”]?\\s*([NSEW])\\s*(\\d+\\.?\\d*)[°]?\\s*(\\d+\\.?\\d*)[′'′]?\\s*(\\d+\\.?\\d*)[″'\"“”]?\\s*([NSEW])"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(DMS); + + double latitude = 0.0; + double longitude = 0.0; + + if (matcher.find()) { + latitude = Double.parseDouble(matcher.group(1)) + Double.parseDouble(matcher.group(2)) / 60.0 + Double.parseDouble(matcher.group(3)) / 3600.0; + if (matcher.group(4).equals("S") || matcher.group(4).equals("W")) { + latitude = -latitude; + } + + longitude = Double.parseDouble(matcher.group(5)) + Double.parseDouble(matcher.group(6)) / 60.0 + Double.parseDouble(matcher.group(7)) / 3600.0; + if (matcher.group(8).equals("S") || matcher.group(8).equals("W")) { + longitude = -longitude; + } + } + + latitude = Math.abs(latitude); + longitude = Math.abs(longitude); + + int latitudeDegrees = (int) latitude; + int longitudeDegrees = (int) longitude; + + double latitudeMinutes = (latitude - latitudeDegrees) * 60.0; + double longitudeMinutes = (longitude - longitudeDegrees) * 60.0; + + String result = String.format("%d %02.4f %d %02.4f", latitudeDegrees, latitudeMinutes, longitudeDegrees, longitudeMinutes); + + return result; + + } + + public static String convertDDtoDMM(Coordinate DD) { + + double latitude = DD.x; + double longitude = DD.y; + char latitudeDirection = (latitude >= 0) ? 'N' : 'S'; + char longitudeDirection = (longitude >= 0) ? 'E' : 'W'; + + latitude = Math.abs(latitude); + longitude = Math.abs(longitude); + + int latitudeDegrees = (int) latitude; + int longitudeDegrees = (int) longitude; + + double latitudeMinutes = (latitude - latitudeDegrees) * 60.0; + double longitudeMinutes = (longitude - longitudeDegrees) * 60.0; + + String result = String.format("%d %02.4f %c %d %02.4f %c", latitudeDegrees, latitudeMinutes, latitudeDirection, longitudeDegrees, longitudeMinutes, longitudeDirection); + + return result; + + } + + public static String convertDDtoDMS(Coordinate DD) { + + double latitude = DD.x; + double longitude = DD.y; + + char latitudeDirection = (latitude >= 0) ? 'N' : 'S'; + char longitudeDirection = (longitude >= 0) ? 'E' : 'W'; + + latitude = Math.abs(latitude); + longitude = Math.abs(longitude); + + int latitudeDegrees = (int) Math.round(latitude); + int longitudeDegrees = (int) Math.round(longitude); + + double latitudeMinutes = (latitude - latitudeDegrees) * 60; + double longitudeMinutes = (longitude - longitudeDegrees) * 60; + + int latitudeSeconds = (int) ((latitudeMinutes - (int) latitudeMinutes) * 60); + int longitudeSeconds = (int) ((longitudeMinutes - (int) longitudeMinutes) * 60); + + String result = String.format("%d° %02d′ %02d″ %c %d° %02d′ %02d″ %c\n", latitudeDegrees, (int) latitudeMinutes, latitudeSeconds, latitudeDirection, longitudeDegrees, (int) longitudeMinutes, longitudeSeconds, longitudeDirection); + + return result; + } + + public static String convertDMMtoDD(String DMM) { + + String[] parts = DMM.split(", "); + + String result = ""; + if (parts.length == 2) { + String[] latParts = parts[0].split(" "); + String[] lonParts = parts[1].split(" "); + + if (latParts.length == 2 && lonParts.length == 2) { + int latDegrees = Integer.parseInt(latParts[0]); + double latMinutes = Double.parseDouble(latParts[1]); + + int lonDegrees = Integer.parseInt(lonParts[0]); + double lonMinutes = Double.parseDouble(lonParts[1]); + + double latitude = latDegrees + latMinutes / 60.0; + double longitude = lonDegrees + lonMinutes / 60.0; + + result = String.format("%.5f, %.5f%n", latitude, longitude); + } + } + return result; + } + + public static String convertDMMtoDMS(String DMM) { + + String[] parts = DMM.split(", "); + + String dmsCoordinates = ""; + + if (parts.length == 2) { + String[] latParts = parts[0].split(" "); + String[] lonParts = parts[1].split(" "); + + if (latParts.length == 2 && lonParts.length == 2) { + int latDegrees = Integer.parseInt(latParts[0]); + double latMinutes = Double.parseDouble(latParts[1]); + + int lonDegrees = Integer.parseInt(lonParts[0]); + double lonMinutes = Double.parseDouble(lonParts[1]); + + double latDMSMinutes = (latMinutes - (int) latMinutes) * 60.0; + double lonDMSMinutes = (lonMinutes - (int) lonMinutes) * 60.0; + + dmsCoordinates = String.format("%d°%02d'%04.1f\"N %d°%02d'%04.1f\"E", latDegrees, (int) latMinutes, latDMSMinutes, lonDegrees, (int) lonMinutes, lonDMSMinutes); + + } + } + + return dmsCoordinates; + } + +}