박재우
11 months ago
1 changed files with 180 additions and 0 deletions
@ -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…
Reference in new issue