How to Sort Geo-points according to the distance from current location in Android(如何在Android中根据与当前位置的距离对地理点进行排序)
问题描述
我有一个Place"对象,每个对象都有一个 LatLng 坐标:
I have a "Place" object with a LatLng coordinate for each:
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,如下所示:
and I have an ArrayList of these Places, something like this:
    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:
and I have "my" LatLng:
    LatLng myLocation = new LatLng(10.0,10.0);
如何根据离我最近的对象对这些对象进行排序?感谢您的帮助
How can I sort these objects according to closest to me? Thanks for the help
推荐答案
从 this answer 来自@shieldstroy 发布的问题,它使用 大圆距离,我得到了这个例子.
Taking the algorithm from this answer from the question posted by @shieldstroy, that uses the Great Circle Distance, I got this example working.
这里是比较器:
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()中:
Here is the high level code, I just put this in 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.074  12963-12963/com.maptest.daniel.maptest I/Places before sorting﹕ Place: New York
04-17 23:04:16.074  12963-12963/com.maptest.daniel.maptest I/Places before sorting﹕ Place: Colorado
04-17 23:04:16.074  12963-12963/com.maptest.daniel.maptest I/Places before sorting﹕ Place: Los Angeles
04-17 23:04:16.074  12963-12963/com.maptest.daniel.maptest I/Places after sorting﹕ Place: Los Angeles
04-17 23:04:16.074  12963-12963/com.maptest.daniel.maptest I/Places after sorting﹕ Place: Colorado
04-17 23:04:16.074  12963-12963/com.maptest.daniel.maptest I/Places after sorting﹕ Place: New York
                        这篇关于如何在Android中根据与当前位置的距离对地理点进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何在Android中根据与当前位置的距离对地理点进
				
        
 
            
        - Android - 拆分 Drawable 2022-01-01
 - 想使用ViewPager,无法识别android.support.*? 2022-01-01
 - MalformedJsonException:在第1行第1列路径中使用JsonReader.setLenient(True)接受格式错误的JSON 2022-01-01
 - 如何检查发送到 Android 应用程序的 Firebase 消息的传递状态? 2022-01-01
 - Android viewpager检测滑动超出范围 2022-01-01
 - android 4中的android RadioButton问题 2022-01-01
 - Android - 我如何找出用户有多少未读电子邮件? 2022-01-01
 - 在测试浓缩咖啡时,Android设备不会在屏幕上启动活动 2022-01-01
 - 使用自定义动画时在 iOS9 上忽略 edgesForExtendedLayout 2022-01-01
 - 用 Swift 实现 UITextFieldDelegate 2022-01-01
 
				
				
				
				