5

Ich habe ein LatLng Objekt und ich möchte seine Koordinaten 500 Meter nach Osten verschieben. Ich konnte dafür keine integrierte Methode finden. Ich habe https://gis.stackexchange.com/a/2964 gesehen, aber meine Ergebnisse sind einfach zu ungenau (ca. 15%) praktisch zu verwenden. Wie kann ich eine genaue Verschiebung in Metern vornehmen?Offset LatLng durch eine gewisse Anzahl von Metern in Android

Hinweis: Ich bin NICHT Suche nach Verschiebung einer Google Maps-Kamera, ich weiß, wie das geht.

Ich habe versucht:

static final double KILOMETERS_PER_DEGREE = 111.111; 

static LatLng offsetLongitude(LatLng initialCoords, float horizontalOffsetInMeters){ 
    double degreeOffset = 1.0/KILOMETERS_PER_DEGREE * horizontalOffsetInMeters/1000.0; 
    double longitudeOffset = Math.cos(initialCoords.latitude * Math.PI/180.0) * degreeOffset; 
    return new LatLng(initialCoords.latitude, initialCoords.longitude + longitudeOffset); 
} 

public static LatLngBounds boundsForSpanWidth(LatLng midpoint, float targetSpanWidth){ 
    LatLng east = offsetLongitude(midpoint, -targetSpanWidth); 
    LatLng west = offsetLongitude(midpoint, targetSpanWidth); 
    LatLngBounds newBounds = new LatLngBounds(west, east); 
    return newBounds; 
} 

Allerdings, wenn ich es mit einem Punkt nennen (nicht in der Nähe Pole oder irgendetwas) mit einer Zielspanne von 5000 Metern, erhalte ich zwei Punkte, die im Begriff sind, 6170 Meter auseinander. Warum?

Antwort

9

Sie können die computeOffset Methode aus dem Google Maps Android API Utility Library (https://developers.google.com/maps/documentation/android-api/utility/):

public static LatLng computeOffset (LatLng aus, doppelter Distanz, Doppel Überschrift)

Gibt die LatLng ergibt sich aus der Verschiebung einer Entfernung von einem Ursprung in der angegebenen Richtung (ausgedrückt in Grad im Uhrzeigersinn von Norden).

Parameter:

  • aus - The LatLng, von dem beginnen.
  • Entfernung - Die Entfernung zu reisen.
  • Überschrift - Die Überschrift in Grad im Uhrzeigersinn von Norden.

In Ihrem Fall (der Abstand Parameter in Metern gemessen wird):

LatLng east = SphericalUtil.computeOffset(midpoint, 500, 90); // Shift 500 meters to the east 
LatLng west = SphericalUtil.computeOffset(midpoint, 500, 270); // Shift 500 meters to the west 
+0

Bibliothek gearbeitet. Ich frage mich, warum mein Code nicht funktionierte, aber trotzdem, Problem gelöst. –

2

Es ist nicht möglich, einen genauen Offset in Metern vom Längen- und Breitengrad zu erhalten. Dies würde annehmen, dass die Erde eine perfekte und glatte Kugel ist, was nicht wahr ist.

Wenn Sie reduzieren möchten Ihren Fehler sollten Sie die Anzahl der Kilometer pro Grad nach Ihrem Breitengrad anpassen. Die Antwort, die Sie eingaben, hat eine Schätzung von 111 km pro Grad, aber das hängt von Ihrer geografischen Breite ab (besonders in der Richtung der Länge). Siehe Tabelle:

Lat 1°Lat≃  1°Lon≃ 
0° 110.574 km 111.320 km 
15° 110.649 km 107.550 km 
30° 110.852 km 96.486 km 
45° 111.132 km 78.847 km 
60° 111.412 km 55.800 km 
75° 111.618 km 28.902 km 
90° 111.694 km 0.000 km 

Ref: wikipedia :P

Ich hoffe, das hilft!

Verwandte Themen