您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

JavaSQlite获取最近的位置(经度和纬度)

JavaSQlite获取最近的位置(经度和纬度)

1)首先,以近似值过滤sqlite数据,并减少需要在Java代码中评估的数据量。为此,请使用以下过程:

为了具有确定性的阈值并更准确地过滤数据,最好在Java代码中计算以中心点的北,西,东和南为单位的4个位置,然后轻松检查小于和等于sql运算符(>,<)确定数据库中的点是否在该矩形中。radius

方法calculateDerivedPosition(...)为你计算这些点(图片中的p1,p2,p3,p4)。

在此处输入图片说明

/**
* Calculates the end-point from a given source at a given range (meters)
* and bearing (degrees). This methods uses simple geometry equations to
* calculate the end-point.
* 
* @param point
*           Point of origin
* @param range
*           Range in meters
* @param bearing
*           Bearing in degrees
* @return End-point from the source given the desired range and bearing.
*/
public static PointF calculateDerivedPosition(PointF point,
            double range, double bearing)
    {
        double EarthRadius = 6371000; // m

        double latA = Math.toradians(point.x);
        double lonA = Math.toradians(point.y);
        double angularDistance = range / EarthRadius;
        double trueCourse = Math.toradians(bearing);

        double lat = Math.asin(
                Math.sin(latA) * Math.cos(angularDistance) +
                        Math.cos(latA) * Math.sin(angularDistance)
                        * Math.cos(trueCourse));

        double dlon = Math.atan2(
                Math.sin(trueCourse) * Math.sin(angularDistance)
                        * Math.cos(latA),
                Math.cos(angularDistance) - Math.sin(latA) * Math.sin(lat));

        double lon = ((lonA + dlon + Math.PI) % (Math.PI * 2)) - Math.PI;

        lat = Math.todegrees(lat);
        lon = Math.todegrees(lon);

        PointF newPoint = new PointF((float) lat, (float) lon);

        return newPoint;

    }

现在创建你的查询

PointF center = new PointF(x, y);
final double mult = 1; // mult = 1.1; is more reliable
PointF p1 = calculateDerivedPosition(center, mult * radius, 0);
PointF p2 = calculateDerivedPosition(center, mult * radius, 90);
PointF p3 = calculateDerivedPosition(center, mult * radius, 180);
PointF p4 = calculateDerivedPosition(center, mult * radius, 270);

strWhere =  " WHERE "
        + COL_X + " > " + String.valueOf(p3.x) + " AND "
        + COL_X + " < " + String.valueOf(p1.x) + " AND "
        + COL_Y + " < " + String.valueOf(p2.y) + " AND "
        + COL_Y + " > " + String.valueOf(p4.y);
    +

COL_X是数据库中存储纬度值且COL_Y用于经度的列的名称

因此,你可以得到一些近似于中心点的数据。

2)现在,你可以循环使用这些过滤后的数据,并使用以下方法确定它们是否真的在你的点附近(圆圈中):

public static boolean pointIsInCircle(PointF pointForCheck, PointF center,
            double radius) {
        if (getDistanceBetweenTwoPoints(pointForCheck, center) <= radius)
            return true;
        else
            return false;
    }

public static double getDistanceBetweenTwoPoints(PointF p1, PointF p2) {
        double R = 6371000; // m
        double dLat = Math.toradians(p2.x - p1.x);
        double dLon = Math.toradians(p2.y - p1.y);
        double lat1 = Math.toradians(p1.x);
        double lat2 = Math.toradians(p2.x);

        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2)
                * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double d = R * c;

        return d;
    }

请享用!

我使用并定制了此参考资料并完成了它。

SQLServer 2022/1/1 18:20:43 有527人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶