找到距离地理位置最近的KML点

时间:2018-01-02 07:46:56

标签: android google-maps-api-3 kml

在我的Android应用中,我在Google地图上显示了KML。我还在地图上显示设备位置。

  1. 现在我想在KML上找到最接近地图上设备位置的点/线。怎么能实现呢?

  2. 另外,我想知道KML点/线是否在设备位置10米范围内。

1 个答案:

答案 0 :(得分:0)

解决。我按照以下步骤解决了第二部分:

  1. 添加了检测线段是否与圆碰撞的功能: 参考:https://stackoverflow.com/a/21989358/1397821
  2. 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;
                }
            }
        }
    
    1. 解析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);

    2. 注意:对于1米(https://stackoverflow.com/a/39540339/1397821),您的半径可以是aprx 0.000009。这不是精确的半径,它将是椭圆形的。

      要解决第1部分,您可以编辑上述功能并找到最小距离。检查距离与半径进行比较的行d <= r