在我的Android应用中,我在Google地图上显示了KML。我还在地图上显示设备位置。
现在我想在KML上找到最接近地图上设备位置的点/线。怎么能实现呢?
另外,我想知道KML点/线是否在设备位置10米范围内。
答案 0 :(得分:0)
解决。我按照以下步骤解决了第二部分:
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。这不是精确的半径,它将是椭圆形的。
要解决第1部分,您可以编辑上述功能并找到最小距离。检查距离与半径进行比较的行d <= r
。