Frage

Wenn ich eine Breite oder Länge in Standard NMEA-Format zu lesen ist es eine einfache Möglichkeit / Formel, dass das Lesen in Meter zu konvertieren, die ich dann in Java implementieren kann (J9)?

Edit: Ok scheint, was ich will nicht möglich zu tun ist leicht , aber was ich wirklich tun wollen ist:

Sagen wir, ich habe einen lat und lange einer Art und Weise Punkt und einen lat und lange eines Benutzers ist es eine einfache Möglichkeit, sie zu vergleichen, um zu entscheiden, wenn der Benutzer zu sagen, sie sind in einem vernünftig close Abstand des Weges Punkt? Mir ist klar, vernünftig unterliegt aber ist dies leicht tun können oder immer noch zu Mathe-y?

War es hilfreich?

Lösung

Hier ist eine JavaScript-Funktion:

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
}

Erläuterung: https://en.wikipedia.org/wiki/Haversine_formula

  

Die Haversine Formel bestimmt die Großkreisentfernung zwischen zwei Punkten auf einer Kugel aufgrund ihrer Längen- und Breitengrade.

Andere Tipps

Da Sie für eine einfache Formel suchen, ist dies wahrscheinlich der einfachste Weg, es zu tun, unter der Annahme, dass die Erde eine Kugel ist der Umfang 40075 km.

Länge in Metern von 1 ° Breite = immer 111.32 km

Länge in Metern von 1 ° Länge = 40.075 km * cos (Breite) / 360

Für kurze Strecken zwischen zwei Koordinaten Annäherung verwendet I Formeln aus   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 );

.

Im folgenden Code habe ich die rohen Zahlen verläßt ihre Beziehung zur Formel von wikipedia zu zeigen.

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) );

Der Wikipedia-Eintrag besagt, dass die Entfernung calcs innerhalb 0.6m ist für 100 km längs und 1 cm für 100 km latitudinally aber ich habe das nicht so überall prüft nahe, dass die Genauigkeit für meinen Einsatz in Ordnung ist.

Breiten- und Längen angeben Punkte, nicht Abstände, so dass Ihre Frage etwas unsinnig ist. Wenn Sie über die kürzeste Entfernung zwischen zwei sind gefragt (lat, lon) Punkte finden Sie unter dieser Wikipedia-Artikel auf Großkreisentfernungen.

Die Erde ist eine annoyingly unregelmäßige Oberfläche, so dass es keine einfache Formel genau dies zu tun. Sie haben mit einem ungefähren Modell der Erde zu leben, und Ihre Koordinaten auf sie projizieren. Das Modell, das ich für diese Regel verwendet, siehe WGS 84 . Dies ist, was GPS-Geräte in der Regel genau die gleiche Problem zu lösen, verwendet werden.

NOAA hat einige Software, die Sie herunterladen können mit diesem auf ihrer Website helfen .

Es gibt viele Tools, die diese leicht machen wird. Siehe Monjardin Antwort , um weitere Informationen über das, was beteiligt.

Dies ist jedoch tun, ist nicht unbedingt schwierig. Es klingt wie Sie Java verwenden, so würde ich empfehlen, sich in so etwas wie GDAL . Es Java-Wrapper für ihre Routinen bereitstellt, und sie haben alle Werkzeuge benötigt, um von Breite / Länge (geographische Koordinaten) zu UTM konvertieren (projizierte Koordinatensystem) oder eine andere vernünftige Kartenprojektion.

UTM ist schön, weil es m ist, so einfach, mit zu arbeiten. Allerdings müssen Sie die entsprechende UTM-Zone rel="nofollow für sie einen guten Job zu tun . Es gibt einige einfachen Codes verfügbar über googeln eine geeignete Zone für ein lat / long Paar zu finden.

Hier ist die R-Version von b-h-Funktion des , für alle Fälle:

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
}

Eine nautische Meile (1852 Meter) ist definiert als ein arcminute der Länge am Äquator . Allerdings müssen Sie eine Kartenprojektion (siehe auch definieren UTM ), in der Sie für die Umwandlung arbeiten, um wirklich Sinn zu machen.

Es gibt durchaus ein paar Möglichkeiten, dies zu berechnen. Alle von ihnen aproximations der sphärischen Trigonometrie verwenden, wo der Radius derjenige der Erde ist.

http://www.movable-type.co.uk/ scripts / latlong.html für ein bisschen von Methoden und Codes in verschiedenen Sprachen.

Bei einem durchschnittlichen Abstand für degress in der Erde.

1 ° = 111km;

Konvertieren dies für Radianten und Dividieren für Meter nehmen ist eine magische Zahl für das RAD in Metern: 0,000008998719243599958;

dann:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;
    'below is from
'http://www.zipcodeworld.com/samples/distance.vbnet.html
Public Function distance(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim theta As Double = lon1 - lon2
    Dim dist As Double = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + _
                            Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * _
                            Math.Cos(deg2rad(theta))
    dist = Math.Acos(dist)
    dist = rad2deg(dist)
    dist = dist * 60 * 1.1515
    If unit = "K" Then
        dist = dist * 1.609344
    ElseIf unit = "N" Then
        dist = dist * 0.8684
    End If
    Return dist
End Function
Public Function Haversine(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim R As Double = 6371 'earth radius in km
    Dim dLat As Double
    Dim dLon As Double
    Dim a As Double
    Dim c As Double
    Dim d As Double
    dLat = deg2rad(lat2 - lat1)
    dLon = deg2rad((lon2 - lon1))
    a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(deg2rad(lat1)) * _
            Math.Cos(deg2rad(lat2)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2)
    c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a))
    d = R * c
    Select Case unit.ToString.ToUpper
        Case "M"c
            d = d * 0.62137119
        Case "N"c
            d = d * 0.5399568
    End Select
    Return d
End Function
Private Function deg2rad(ByVal deg As Double) As Double
    Return (deg * Math.PI / 180.0)
End Function
Private Function rad2deg(ByVal rad As Double) As Double
    Return rad / Math.PI * 180.0
End Function

Um Breite und Länge in x- und y-Darstellung zu konvertieren müssen Sie entscheiden, welche Art von Kartenprojektion zu verwenden. Was mich betrifft, scheint Elliptical Mercator sehr gut. Hier Sie eine Implementierung finden (in Java auch).

Wenn seine nahe genug können Sie weg sie mit der Behandlung als auf einer flachen Ebene koordiniert. Dies funktioniert auf etwa Straßen- oder Stadtebene, wenn perfekte Genauigkeit ist nicht erforderlich, und alles, was Sie brauchen, ist eine grobe Schätzung auf der Strecke mit einer willkürlichen Grenze vergleichen beteiligt.

Wenn Sie möchten, eine einfache Lösung dann die Verwendung Haversine Formel wie die anderen Kommentare skizzierte . Wenn Sie eine Genauigkeit sensible Anwendung im Auge hat die Haversine Formel halten haben keine Garantie für eine Genauigkeit besser als 0,5%, wie es die Erde unter der Annahme, ein Kreis ist. Zu berücksichtigen, dass die Erde ein abgeplatteten Sphäroid prüfen, ist mit Vincenty Formeln . Außerdem bin ich nicht sicher, welche Radius wir mit der Haversine Formel verwenden sollte: {Equator: 6,378.137 km, Polar: 6,356.752 km, Volumetric: 6,371.0088 km}.

Sie müssen die Koordinaten in Radiant konvertieren die sphärische Geometrie zu tun. Nach der Konvertierung, dann können Sie einen Abstand zwischen den beiden Punkten berechnen. Der Abstand kann dann auf jede Maßnahme, die Sie wollen umgewandelt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top