【问题标题】:Find nearest KML point to a Geo-location查找离地理位置最近的 KML 点
【发布时间】:2018-06-11 22:42:29
【问题描述】:

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

  1. 现在我想在 KML 上找到最接近地图上设备位置的点/线。怎样才能做到这一点?

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

【问题讨论】:

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


    【解决方案1】:

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

    1. 添加了检测线段是否与圆碰撞的功能: 参考:https://stackoverflow.com/a/21989358/1397821

    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);

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

    要解决第一部分,您可以编辑上述函数并找到最小距离。检查距离与半径进行比较的d &lt;= r 行。

    【讨论】:

      猜你喜欢
      • 2011-02-13
      • 2014-03-05
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多