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

标签 android geolocation latitude-longitude

我有一个“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 ,我让这个例子工作了。

这是比较器:

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.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中根据距当前位置的距离对地理点进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58191940/

相关文章:

javascript - 组合地理定位框架

r - 将加拿大邮政编码转换为经度和纬度

javascript - 使用 Google Map V3 进行地理定位

binary - Maxmind 的二进制 DAT 是如何工作的?

c# - 在巴基斯坦的 Twitter Streaming API 中传递经度和纬度

r - 为什么 geoshere 给出错误的距离?

android - 未找到 CheckBoxPreference 依赖项错误

android - 当编辑文本超过二十个时,如何知道我的编辑文本没有改变

android - 用于关机的 HDMI CEC 命令在 Android 上不起作用

android - 如何在移动设备上为用户代理使用元重定向