Browse Source

coordinate convert util 추가

pull/12/head
박재우 11 months ago
parent
commit
623b1f4544
  1. 180
      pav-server/src/main/java/com/palnet/comn/utils/DmsUtils.java

180
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;
}
}
Loading…
Cancel
Save