표준 NMEA 형식의 위도 또는 경도 판독 값이있는 경우 해당 판독 값을 미터로 변환하는 쉬운 방법 / 공식이 있습니까? 그런 다음 Java (J9)에서 구현할 수 있습니까?
편집 : 좋아 내가하고 싶은 것이 쉽게 불가능한 것 같지만 내가 정말로하고 싶은 것은 다음과 같습니다.
경유지의 위도와 경도가 있고 사용자의 위도와 경도를 비교하여 사용자에게 합리적 으로 알릴시기를 결정할 수있는 쉬운 방법이 있다고 가정 해 보겠습니다. 가까운 거리 있는 방법이 있습니까? 나는 합리적이라는 것을 알고 있지만 이것은 쉽게 할 수 있는가 아니면 여전히 지나치게 수학적인가?
답변
다음은 자바 스크립트 함수입니다.
function measure(lat1, lon1, lat2, lon2){ // generally used geo measurement function
var R = 6378.137; // Radius of earth in KM
var dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
var dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d * 1000; // meters
}
설명 : https://en.wikipedia.org/wiki/Haversine_formula
haversine 공식은 경도와 위도가 주어진 구의 두 점 사이의 대원 거리를 결정합니다.
답변
간단한 공식을 찾고 있다면 지구가 둘레가 40075km 인 구체라고 가정 할 때 이것이 아마도 가장 간단한 방법 일 것입니다.
위도 1 °의 길이 (미터) = 항상 111.32km
경도 1 °의 길이 (미터) = 40075km * cos (latitude) / 360
답변
두 좌표 사이의 짧은 거리를 대략적으로 계산하기 위해 http://en.wikipedia.org/wiki/Lat-lon의 공식을 사용했습니다
.
m_per_deg_lat = 111132.954 - 559.822 * cos( 2 * latMid ) + 1.175 * cos( 4 * latMid);
m_per_deg_lon = 111132.954 * cos ( latMid );
.
아래 코드에서 나는 위키피디아의 공식과의 관계를 보여주기 위해 원시 숫자를 남겼습니다.
double latMid, m_per_deg_lat, m_per_deg_lon, deltaLat, deltaLon,dist_m;
latMid = (Lat1+Lat2 )/2.0; // or just use Lat1 for slightly less accurate estimate
m_per_deg_lat = 111132.954 - 559.822 * cos( 2.0 * latMid ) + 1.175 * cos( 4.0 * latMid);
m_per_deg_lon = (3.14159265359/180 ) * 6367449 * cos ( latMid );
deltaLat = fabs(Lat1 - Lat2);
deltaLon = fabs(Lon1 - Lon2);
dist_m = sqrt ( pow( deltaLat * m_per_deg_lat,2) + pow( deltaLon * m_per_deg_lon , 2) );
위키 백과 항목에 따르면 거리 계산은 세로 100km의 경우 0.6m, 위도 100km의 경우 1cm 이내이지만 정확도 근처의 어느 곳에서도 사용하기에 괜찮다는 것을 확인하지 않았습니다.
답변
위도와 경도는 거리가 아닌 지점을 지정하므로 질문은 다소 무의미합니다. 두 점 (위도, 경도) 사이의 최단 거리에 대해 묻는 경우 대원 거리에 대한 이 Wikipedia 기사 를 참조하십시오 .
답변
이 작업을 쉽게 할 수있는 많은 도구가 있습니다. 참조 monjardin의 답변을 관련 기능에 대한 자세한 내용을.
그러나이를 수행하는 것이 반드시 어려운 것은 아닙니다. Java를 사용하는 것 같으므로 GDAL 과 같은 것을 살펴 보는 것이 좋습니다. . 루틴에 대한 자바 래퍼를 제공하며 Lat / Lon (지리 좌표)에서 UTM (투영 좌표계) 또는 기타 합리적인지도 투영으로 변환하는 데 필요한 모든 도구를 갖추고 있습니다.
UTM은 미터이기 때문에 작업하기가 매우 쉽습니다. 그러나 제대로 작동하려면 적절한 UTM 영역 을 가져와야합니다 . 위도 / 경도 쌍에 적합한 구역을 찾기 위해 인터넷 검색을 통해 사용할 수있는 몇 가지 간단한 코드가 있습니다.
답변
지구는 성가 시게 불규칙한 표면이므로이를 정확하게 수행하는 간단한 공식은 없습니다. 당신은 지구에 대한 대략적인 모델을 가지고 살아 가야하고, 당신의 좌표를 그 위에 투영해야합니다. 내가 일반적으로 사용하는 모델은 WGS 84 입니다. 이것은 GPS 장치가 똑같은 문제를 해결하기 위해 일반적으로 사용하는 것입니다.
NOAA에는 웹 사이트에서 이를 지원하기 위해 다운로드 할 수있는 소프트웨어가 있습니다 .
답변
다음은 bh- 함수 의 R 버전입니다 .
measure <- function(lon1,lat1,lon2,lat2) {
R <- 6378.137 # radius of earth in Km
dLat <- (lat2-lat1)*pi/180
dLon <- (lon2-lon1)*pi/180
a <- sin((dLat/2))^2 + cos(lat1*pi/180)*cos(lat2*pi/180)*(sin(dLon/2))^2
c <- 2 * atan2(sqrt(a), sqrt(1-a))
d <- R * c
return (d * 1000) # distance in meters
}