W mojej "natywnej" aplikacji na Androida próbuję obliczyć odległość w stopach i/lub metrach (w linii prostej) między dwie lokalizacje na mapie. Idealnie byłoby zastosować metodę, która przyniosłaby dwie wartości LatLng (jako że to, co mam łatwo dostępne) jako dane wejściowe i zwróci odległość w metrach i/lub stoczniach. Jak wspomniano powyżej, używam Androida Maps v2 API.Android Maps v2 API ... Jak obliczyć odległość między dwoma lokalizacjami (Lat, Long)
Przyjrzałem się WIELU postów (20-30) dotyczących obliczania odległości i nie znalazłem żadnych, które pomogłyby mi rozwiązać mój problem. Ponownie jest to natywna aplikacja na Androida i korzystam z interfejsu API Map V2.
Nie wiem, czy jest to najlepsze podejście, ale jestem obecnie próbuje użyć metody Location
:
distanceBetween(double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results)
Ale niestety aplikacja wywala za każdym razem, bo uzyskać wartość null dla wyników. Sprawdziłem za pomocą debugera, że wartości atrapa długości i szerokości geograficznej, które przekazuję są poprawne i że wartość results
jest zerowa (stąd problem). Oto LogCat:
04-04 23:48:04.770: D/onMapClick(17970): lat/lng: (32.90843038503306,-117.22537234425546)
04-04 23:48:08.710: D/dalvikvm(17970): threadid=1: still suspended after undo (sc=1 dc=1 s=Y)
04-04 23:48:08.710: D/dalvikvm(17970): GC_FOR_MALLOC freed 7010 objects/641712 bytes in 121ms
04-04 23:48:24.980: D/AndroidRuntime(17970): Shutting down VM
04-04 23:48:24.980: W/dalvikvm(17970): threadid=1: thread exiting with uncaught exception (group=0x40020950)
04-04 23:48:25.100: E/AndroidRuntime(17970): FATAL EXCEPTION: main
04-04 23:48:25.100: E/AndroidRuntime(17970): java.lang.IllegalArgumentException: results is null or has length < 1
04-04 23:48:25.100: E/AndroidRuntime(17970): at android.location.Location.distanceBetween(Location.java:394)
04-04 23:48:25.100: E/AndroidRuntime(17970): at com.example.googleplacesandmaps.PlacesMapActivity$1.onMapClick(PlacesMapActivity.java:259)
04-04 23:48:25.100: E/AndroidRuntime(17970): at com.google.android.gms.maps.GoogleMap$6.onMapClick(Unknown Source)
04-04 23:48:25.100: E/AndroidRuntime(17970): at com.google.android.gms.internal.t$a.onTransact(Unknown Source)
04-04 23:48:25.100: E/AndroidRuntime(17970): at android.os.Binder.transact(Binder.java:249)
04-04 23:48:25.100: E/AndroidRuntime(17970): at com.google.android.gms.maps.internal.IOnMapClickListener$Stub$Proxy.onMapClick(IOnMapClickListener.java:93)
04-04 23:48:25.100: E/AndroidRuntime(17970): at maps.i.s.b(Unknown Source)
04-04 23:48:25.100: E/AndroidRuntime(17970): at maps.y.v.c(Unknown Source)
04-04 23:48:25.100: E/AndroidRuntime(17970): at maps.y.bf.onSingleTapConfirmed(Unknown Source)
04-04 23:48:25.100: E/AndroidRuntime(17970): at maps.d.v.onSingleTapConfirmed(Unknown Source)
04-04 23:48:25.100: E/AndroidRuntime(17970): at maps.d.j.handleMessage(Unknown Source)
04-04 23:48:25.100: E/AndroidRuntime(17970): at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 23:48:25.100: E/AndroidRuntime(17970): at android.os.Looper.loop(Looper.java:123)
04-04 23:48:25.100: E/AndroidRuntime(17970): at android.app.ActivityThread.main(ActivityThread.java:4627)
04-04 23:48:25.100: E/AndroidRuntime(17970): at java.lang.reflect.Method.invokeNative(Native Method)
04-04 23:48:25.100: E/AndroidRuntime(17970): at java.lang.reflect.Method.invoke(Method.java:521)
04-04 23:48:25.100: E/AndroidRuntime(17970): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893)
04-04 23:48:25.100: E/AndroidRuntime(17970): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:651)
04-04 23:48:25.100: E/AndroidRuntime(17970): at dalvik.system.NativeStart.main(Native Method)
Oto metoda obecnie używam, aby spróbować obliczyć odległość:
Location.distanceBetween(Double.parseDouble(user_latitude), Double.parseDouble(user_longitude),
fxdLatitude, fxdLongitude, results);
results
została zdefiniowana jako zmienna Klasa: private float[] results = null;
Nie pewnie, co robię źle tutaj.
Znowu wolałbym metodę, która wymagałaby dwóch LatLng jako parametrów wejściowych, ponieważ oba są łatwo dostępne ... ale być może ważniejsze jest to, że mam jedną z lokalizacji dostępnych jako oddzielne wartości długości, szerokości geograficznej ... druga lokalizacja jest dostępna tylko jako wartość LatLng, ponieważ otrzymuję ją za pomocą onMapClick (gdy użytkownik klika ekran). Tak więc, aby użyć metody distanceBetween
, potrzebowałbym jakiejś konwersji tej wartości LatLng na parę Latitude/Longitude, aby móc z niej korzystać. Czy ktoś wie, jak to zrobić?
Mamy nadzieję, że istnieje prosty sposób obliczania odległości i prosty sposób "wyodrębnienia" szerokości/długości geograficznej z wartości LatLng.
Jak zdobyć promień z centrum LatLong w Google Maps v2? –
@ KetanMehta Jeśli masz na myśli promień widocznego obszaru, możesz uzyskać widok za pomocą funkcji LatLngBounds bbox = GoogleMap.getProjection(). GetVisibleRegion(). LatLngBounds. Następnie użyj metody Sharj distance calc, aby uzyskać odległość między bbox.southwest i bbox.northeast (jaka byłaby średnica widocznego obszaru). – Marco