查找我附近半径内的地理位置 [英] Find geopoints in a radius near me

查看:256
本文介绍了查找我附近半径内的地理位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有Geopoints的数据库. 我需要查询以获取我X米半径内的所有地理位置.

I have a DB with Geopoints. I need to do a query to get all geopoints in the radius of X meters of me.

我该怎么做?

我认为最好的方法是获得最小纬度/经度点和最大纬度/经度点,并获得所有它们的对应值:geopoint > minPoint AND geopoint < MaxPoint

I think the best way is get the minimal lat/long possible point, and the max lat/long point and get all of them for which: geopoint > minPoint AND geopoint < MaxPoint

其他想法?

推荐答案

您可以使用此类获取点之间的距离:

You can use this class to get de distance between to points:

使用方法:

double distInKm = GeoMath.getDistance(12.345, -8.788, 12.33, -8.77);  

或者,如果point1和point2是GeoPoint:

Or, if point1 and point2 are GeoPoint:

double distInKm = GeoMath.getDistance(point1, point2);  

您还可以计算一个Geopoint,即您与轴承之间的距离.

You can also calculate a Geopoint that is a distance of you and along a bearing.

这将计算出一个从point1向北5公里的点:

This computes a point that is 5 km northward from point1:

GeoPoint northPointAt5 = GeoMath.getGeoPointAlongBearing(point1, 0, 5);

您可以计算90度,180度和270度的其他点,以计算minPoint和MaxPoint.

You can calculate the other points at 90 degrees, 180 degrees and 270 degrees to calculate minPoint AND MaxPoint.

GeoMath类:

public class GeoMath {

    public static final int EARTH_MEAN_RADIUS = 6371; // earth's mean radius in Km

    public static double getDistance(double startLatitude, double startLongitude,
                                     double endLatitude, double endLongitude){

        return distHaversine(startLatitude,startLongitude,endLatitude,endLongitude);
    }

    public static double getDistance(GeoPoint point1, GeoPoint point2){

        return distHaversine(point1.getLatitudeE6()/1E6, point1.getLongitudeE6()/1E6,
                             point2.getLatitudeE6()/1E6, point2.getLongitudeE6()/1E6);
    }

    private static double getSpanInRadians(double max, double min){

        return Math.toRadians(max - min);
    }

    //Distance in Km between point1 (lat1,lon1) and point2 (lat2,lon2) Haversine formula
    private static double distHaversine(double lat1, double lon1, double lat2, double lon2) {

        double dLat = getSpanInRadians(lat2,lat1);
        double dLon = getSpanInRadians(lon2,lon1);
        lat1 = Math.toRadians(lat1);
        lat2 = Math.toRadians(lat2);
        double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2) * Math.sin(dLon/2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        double dist = EARTH_MEAN_RADIUS * c;
        return Math.round(dist * 1000)/1000; //3 decimal places
    }

    // Get GeoPoint at distance along a bearing
    // bearing in degrees
    // distance in Km
    public static GeoPoint getGeoPointAlongBearing(GeoPoint location, double bearing, double distance){

        double PI = Math.PI;
        double NM = 1.852; //1 nm = 1.852 Km -> nm = Km/NM

        GeoPoint geoPointAlongBearing;

        double locationLatRad = Math.toRadians(location.getLatitudeE6()/1E6);
        double locationLongRad = Math.toRadians(location.getLongitudeE6()/1E6)*(-1.0d);

        double distanceRad = distance/NM * PI/(180*60);

        double bearingRad = Math.toRadians(bearing);

        double latAlongBearingRad = Math.asin(Math.sin(locationLatRad) * 
                                    Math.cos(distanceRad) +
                                    Math.cos(locationLatRad) *
                                    Math.sin(distanceRad) * 
                                    Math.cos(bearingRad));

        double lonAlongBearingRad = mod(locationLongRad - 
                                    Math.asin(Math.sin(bearingRad) * 
                                    Math.sin(distanceRad) / 
                                    Math.cos(latAlongBearingRad)) + PI, 2 * PI) - PI;

        double latAlongBearing = rad2lat(latAlongBearingRad);
        double lonAlongBearing = rad2lng(lonAlongBearingRad) * (-1);

        geoPointAlongBearing = new GeoPoint((int)(latAlongBearing*1E6),(int)(lonAlongBearing*1E6));
        return geoPointAlongBearing;
    }

    private static double mod(double y, double x) {

        return y - x * Math.floor(y/x);
    }

}

这篇关于查找我附近半径内的地理位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆