Android Maps v2 API …如何计算两个位置之间的距离(经纬度)

在我的“原生”Android应用程序中,我试图计算地图上两个位置之间以英尺和/或米(如乌鸦)的距离。 理想情况下,将有一个方法,将需要两个LatLng值(因为这是我已经可用)作为输入,并以米和/或码返回距离。 如上所述,我正在使用Android Maps v2 API。

我已经看过很多贴子(20-30)关于计算距离,并没有发现有任何帮助我解决了我的问题。 这又是一个原生的Android应用程序,我正在使用Maps v2 API。

不知道这是否是最好的方法,但我正在尝试使用Location方法:

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

但不幸的是,应用程序每次崩溃,因为我得到一个空值的结果。 我已经通过调试器validation过,我传入的纬度和经度虚拟值是有效的,并且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.isb(Unknown Source) 04-04 23:48:25.100: E/AndroidRuntime(17970): at maps.yvc(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.dvonSingleTapConfirmed(Unknown Source) 04-04 23:48:25.100: E/AndroidRuntime(17970): at maps.djhandleMessage(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被定义为一个类variables: private float[] results = null;

不知道我在这里做错了什么。

再次,我宁愿有一个方法,将需要两个LatLng的输入参数,因为他们都是现成的…但也许更重要的是,我只有一个位置可用作为单独的经度,纬度值…第二个位置是只有LatLng值可用,因为我通过MapClick获取它(当用户点击屏幕时)。 所以要使用方法distanceBetween我需要将这个LatLng值转换成纬度/经度对能够使用它。 任何人都知道如何做到这一点?

希望有一个简单的方法来计算距离和一个简单的方法来从LatLng值“提取”经度/纬度。

那么从两个位置对象怎么样?

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

您可以使用以下函数接受两个LatLng来计算它们之间的距离。 但在使用这个之前,请确保您的LatLngvariables不为空。

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

private float[] results = null; 是错的。

你需要使用private float[] results = new float[1]; 并用results[0]读取距离。

是的,我认为MaciejGórski是对的。

计算出的距离存储在结果[0]中。 如果结果长度大于或等于2,则初始方位将存储在结果[1]中。 如果结果长度大于或等于3,则最终方位将存储在结果[2]中。

Kotlin ,你可以:

定义将LatLng转换为Location的方法:

 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()) } 
Interesting Posts