2013-04-05 253 views
5

在我的「原生」Android應用程序中,我試圖計算以英尺和/或米爲單位的距離(如烏鴉)地圖上的兩個位置。理想情況下,將會有一個方法需要兩個LatLng值(因爲這是我已經可用的)作爲輸入,並以米和/或碼返回距離。如上所述,我正在使用Android Maps v2 API。Android Maps v2 API ...如何計算兩個位置之間的距離(經緯度)

我已經看過很多貼子(20-30)關於計算距離,並沒有發現有任何幫助我解決了我的問題。這又是一個原生的Android應用程序,我正在使用Maps v2 API。

不知道這是最好的辦法,但我目前正試圖用Location方法:

distanceBetween(double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results) 

但不幸的是應用程序崩潰,每次都因爲我得到的結果爲空值。我通過調試器驗證過我傳入的緯度和經度虛擬值是有效的,並且results的值爲空(因此是問題)。這裏是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) 

這裏是我目前使用嘗試並計算距離的方法:

  Location.distanceBetween(Double.parseDouble(user_latitude), Double.parseDouble(user_longitude), 
       fxdLatitude, fxdLongitude, results); 

results被定義爲一類變量:private float[] results = null;

不確定我在這裏做錯了什麼。

再次我寧願有一個方法,將採取兩個LatLng作爲輸入參數,因爲他們都是現成的...但也許更重要的是,我只有一個位置可用作爲單獨的經度,緯度值...第二個位置只能作爲LatLng值使用,因爲我通過MapClick獲取它(當用戶點擊屏幕時)。因此,要使用方法distanceBetween,我需要將此LatLng值轉換爲緯度/經度對以便能夠使用它。任何人都知道如何做到這一點?

希望有一個簡單的方法來計算距離和一個簡單的方法來從LatLng值「提取」經度/緯度。

回答

1

private float[] results = null;是錯誤的。

您需要使用private float[] results = new float[1];並使用results[0]來讀取距離。

3

您可以使用以下函數接受兩個LatLng來計算它們之間的距離。但在使用此功能之前,請確保您的LatLng變量不爲空。

public static double distance(LatLng StartP, LatLng EndP) { 
    double lat1 = StartP.latitude; 
    double lat2 = EndP.latitude; 
    double lon1 = StartP.longitude; 
    double lon2 = EndP.longitude; 
    double dLat = Math.toRadians(lat2-lat1); 
    double dLon = Math.toRadians(lon2-lon1); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 2 * Math.asin(Math.sqrt(a)); 
    return 6366000 * c; 
} 
+0

如何獲得與中心在谷歌地圖V2經緯度半徑? – 2013-07-18 11:32:57

+0

@KetanMehta如果您指的是可見區域的半徑,則可以通過LatLngBounds bbox = GoogleMap.getProjection()。getVisibleRegion()。latLngBounds獲取視口。之後只需使用Sharj距離計算方法來獲得bbox.southwest和bbox.northeast之間的距離(視口的直徑是多少)。 – Marco 2014-08-29 10:41:04

0

是的,我認爲MaciejGórski是正確的。

計算出的距離存儲在結果[0]中。如果結果長度大於或等於2,則初始方位將存儲在結果[1]中。如果結果長度爲3或更大,則最終方位將存儲在結果[2]中。

11

如何使兩個位置對象?

private float distanceBetween(LatLng latLng1, LatLng latLng2) { 

     Location loc1 = new Location(LocationManager.GPS_PROVIDER); 
     Location loc2 = new Location(LocationManager.GPS_PROVIDER); 

     loc1.setLatitude(latLng1.latitude); 
     loc1.setLongitude(latLng1.longitude); 

     loc2.setLatitude(latLng2.latitude); 
     loc2.setLongitude(latLng2.longitude); 


     return loc1.distanceTo(loc2); 
    } 
+0

難道你不需要轉換經度和緯度,因爲它們是微觀的? – Snake 2015-01-20 19:07:24

+0

如果它們不是浮動格式(如27.132235),則必須進行轉換。 – MSaudi 2015-01-21 08:25:38

+0

有趣的..謝謝 – Snake 2015-01-21 16:02:51

0

科特林,您可以:

定義的方法來轉換LatLngLocation

fun LatLng.toLocation() = Location(LocationManager.GPS_PROVIDER).also { 
    it.latitude = latitude 
    it.longitude = longitude 
} 

說它每個LatLng和使用Location#distanceTo(...)方法:

val distance = coords1.toLocation().distanceTo(coords2.toLocation()) 

定義LatLngBounds擴展方法:

fun LatLngBounds.computeDistance(): Float { 
    return northeast.toLocation().distanceTo(southwest.toLocation()) 
} 
相關問題