栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

radius

该方法

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

在此处输入图片说明

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 reliablePointF 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;    }

请享用!

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/391500.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号