【发布时间】:2018-06-11 22:42:29
【问题描述】:
在我的 Android 应用中,我在 Google 地图上显示 KML。我还在地图上显示设备位置。
现在我想在 KML 上找到最接近地图上设备位置的点/线。怎样才能做到这一点?
另外,我想知道是否有任何 KML 点/线在设备位置的 10 米范围内。
【问题讨论】:
标签: android google-maps-api-3 kml
在我的 Android 应用中,我在 Google 地图上显示 KML。我还在地图上显示设备位置。
现在我想在 KML 上找到最接近地图上设备位置的点/线。怎样才能做到这一点?
另外,我想知道是否有任何 KML 点/线在设备位置的 10 米范围内。
【问题讨论】:
标签: android google-maps-api-3 kml
解决了。我按照以下步骤解决了第二部分:
Java 转换函数:
static boolean checkLineSegmentCircleIntersection(double x1, double y1, double x2 , double y2, double xc, double yc, double r) {
double xd = 0.0;
double yd = 0.0;
double t = 0.0;
double d = 0.0;
double dx_2_1 = 0.0;
double dy_2_1 = 0.0;
dx_2_1 = x2 - x1;
dy_2_1 = y2 - y1;
t = ((yc - y1) * dy_2_1 + (xc - x1) * dx_2_1) / (dy_2_1 * dy_2_1 + dx_2_1 * dx_2_1);
if( 0 <= t && t <=1) {
xd = x1 + t * dx_2_1;
yd = y1 + t * dy_2_1;
d = Math.sqrt((xd - xc) * (xd - xc) + (yd - yc) * (yd - yc));
return d <= r;
}
else {
d = Math.sqrt((xc - x1) * (xc - x1) + (yc - y1) * (yc - y1));
if (d <= r)
return true;
else {
d = Math.sqrt((xc - x2) * (xc - x2) + (yc - y2) * (yc - y2));
if (d <= r)
return true;
else
return false;
}
}
}
解析 KML 坐标并将线段的坐标传递给该函数,如:
boolean lineInRadius = checkLineSegmentCircleIntersection(points.get(i - 1).latitude, points.get(i - 1).longitude, points.get(i).latitude, points.get(i).longitude, latDecimal, lngDecimal, RADIUS);
注意:对于 1 米 (https://stackoverflow.com/a/39540339/1397821),您的半径可以是 aprx 0.000009。这不是精确的半径,它将是椭圆形的。
要解决第一部分,您可以编辑上述函数并找到最小距离。检查距离与半径进行比较的d <= r 行。
【讨论】: