如何根据Android中当前位置的距离对地理点进行排序

沉舟侧畔千帆进,病树前头万木春。这篇文章主要讲述如何根据Android中当前位置的距离对地理点进行排序相关的知识,希望能为你提供帮助。
我有一个“Place”对象,每个对象都有一个LatLng坐标:

import com.google.android.gms.maps.model.LatLng; public class Place{ public String name; public LatLng latlng; public Restaurant(String name, LatLng latlng) { this.name = name; this.latlng = latlng; } }

我有这些地方的ArrayList,如下所示:
ArrayList< Place> places = new ArrayList< Place> (); places.add("Place 1", LatLng(90.0,90.0)); places.add("Place 2", LatLng(93.0,93.0)); places.add("Place 3", LatLng(83.0,92.0)); places.add("Place 4", LatLng(93.0,91.0));

我有“我的”LatLng:
LatLng myLocation = new LatLng(10.0,10.0);

如何根据离我最近的方式对这些物体进行排序?谢谢您的帮助
答案从使用this answer的@shieldstroy发布的问题中获取Great Circle Distance的算法,我得到了这个例子。
这是Comparator
public class SortPlaces implements Comparator< Place> { LatLng currentLoc; public SortPlaces(LatLng current){ currentLoc = current; } @Override public int compare(final Place place1, final Place place2) { double lat1 = place1.latlng.latitude; double lon1 = place1.latlng.longitude; double lat2 = place2.latlng.latitude; double lon2 = place2.latlng.longitude; double distanceToPlace1 = distance(currentLoc.latitude, currentLoc.longitude, lat1, lon1); double distanceToPlace2 = distance(currentLoc.latitude, currentLoc.longitude, lat2, lon2); return (int) (distanceToPlace1 - distanceToPlace2); }public double distance(double fromLat, double fromLon, double toLat, double toLon) { double radius = 6378137; // approximate Earth radius, *in meters* double deltaLat = toLat - fromLat; double deltaLon = toLon - fromLon; double angle = 2 * Math.asin( Math.sqrt( Math.pow(Math.sin(deltaLat/2), 2) + Math.cos(fromLat) * Math.cos(toLat) * Math.pow(Math.sin(deltaLon/2), 2) ) ); return radius * angle; } }

这是高级代码,我把它放在onCreate()中:
//My location, San Francisco double lat = 37.77657; double lng = -122.417506; LatLng latLng = new LatLng(lat, lng); //set up list ArrayList< Place> places = new ArrayList< Place> (); places.add(new Place("New York", new LatLng(40.571256,73.98369))); places.add(new Place("Colorado", new LatLng(39.260658,-105.101615))); places.add(new Place("Los Angeles", new LatLng(33.986816,118.473819))); for (Place p: places){ Log.i("Places before sorting", "Place: " + p.name); }//sort the list, give the Comparator the current location Collections.sort(places, new SortPlaces(latLng)); for (Place p: places){ Log.i("Places after sorting", "Place: " + p.name); }

这是日志输出:
04-17 23:04:16.07412963-12963/com.maptest.daniel.maptest I/Places before sorting﹕ Place: New York 04-17 23:04:16.07412963-12963/com.maptest.daniel.maptest I/Places before sorting﹕ Place: Colorado 04-17 23:04:16.07412963-12963/com.maptest.daniel.maptest I/Places before sorting﹕ Place: Los Angeles 04-17 23:04:16.07412963-12963/com.maptest.daniel.maptest I/Places after sorting﹕ Place: Los Angeles 04-17 23:04:16.07412963-12963/com.maptest.daniel.maptest I/Places after sorting﹕ Place: Colorado 04-17 23:04:16.07412963-12963/com.maptest.daniel.maptest I/Places after sorting﹕ Place: New York

另一答案为了计算距离,可以使用不同的方法。一个非常简单的是Haversine Formula(http://rosettacode.org/wiki/Haversine_formula#Java)。一个更准确的计算是Vincenty公式。如果这两个位置不远,那么Haversine解决方案就足够了。
计算距离后,您只需使用比较器对数组进行排序,例如:
Collections.sort(places, new Comparator< Place> () { public int compare(Place p1, Place p2) { return Double.compare(p1.getDistance(), p2.getDistance()); } });

另一答案当您获得当前位置时,您可以通过计算行驶距离(最适合餐馆等场所)进行排序,如下所示:
  1. 计算每个对象的距离 http://maps.googleapis.com/maps/api/directions/json?origin="+yourLat+","+yourLong+"& destination="+toLat+","+toLong+"& sensor=false& mode=DRIVING
  2. 计算每个距离后,对这些距离应用一些简单的排序算法。
另一答案你可以使用
distanceInMeters = (loc1.distanceTo(loc2));

【如何根据Android中当前位置的距离对地理点进行排序】从谷歌地图API,然后将结果添加到TreeMap中的键

    推荐阅读