5

Mam obiekt LatLng i chcę przesunąć jego współrzędne o 500 metrów na wschód. Nie mogłem znaleźć wbudowanej metody. Widziałem https://gis.stackexchange.com/a/2964, ale moje wyniki są po prostu zbyt niedokładne (około 15%), aby można je było praktycznie zastosować. Jak mogę dokonać dokładnego przesunięcia w metrach?Przesunięcie LatLng o pewną ilość metrów w Androidzie

Uwaga: Jestem NOT szukam możliwości przesunięcia kamery Google Maps, wiem, jak to zrobić.

Próbowałem:

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

Jednak, kiedy nazywają go z punktem (nie w pobliżu biegunów lub cokolwiek) o rozpiętości docelowym 5000 metrów, Dostaję dwa punkty, które są o 6170 metrów oddzielnie. Czemu?

Odpowiedz

9

Można użyć metody computeOffset z Map Google Android API Utility Library (https://developers.google.com/maps/documentation/android-api/utility/):

public static poĹ,oĹĽenia geograficznego computeOffset (długość i szerokość geograficzną z, podwójnej odległości, podwójne pozycji)

zwraca LatLng wynikający z przesunięcia odległości od punktu początkowego w określonym nagłówku (wyrażony w stopniach w prawo od północy).

Parametry:

  • z - długość i szerokość geograficzną, od którego zacząć.
  • odległość - odległość do pokonania.
  • nagłówek - Nagłówek w stopniach w kierunku zgodnym z ruchem wskazówek zegara z północy.

W twoim przypadku (parametr odległość jest mierzona w metrach):

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

Biblioteka pracował. Zastanawiam się, dlaczego mój kod nie działa, ale w każdym razie problem został rozwiązany. –

2

Nie można uzyskać dokładnego przesunięcia w metrach od szerokości i długości geograficznej. Zakładałoby to, że ziemia jest idealną i gładką kulą, która nie jest prawdziwa.

Jeśli chcesz, aby zmniejszyć swój błąd, powinieneś dostosować ilość kilometrów na stopień zgodnie z twoją szerokością geograficzną. Odpowiedź, którą łączysz, ma szacunkową wartość 111 km na stopień, ale zależy to od twojej szerokości geograficznej (szczególnie w kierunku długości geograficznej). Patrz tabela:

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

Mam nadzieję, że to pomoże!

Powiązane problemy