【问题标题】:Point in KML Polygon - C / C++ codeKML 多边形中的点 - C/C++ 代码
【发布时间】:2013-04-24 11:32:26
【问题描述】:

我正在寻找 C 或 C++ 代码来识别点(坐标)是否位于 KML 多边形内。

我已经搜索过,但我得到的只是 javascript (google maps apis),它可以实现相同的功能。我什至不能直接移植它,因为我有一个轻微的修改要求:

  1. 确定给定坐标是否位于 KML 的多边形内(代码也应排除多边形中的孔!)。
  2. 如果点超出范围,则通知调用方到最近的多边形边缘的距离。

据我研究,第二点还没有实现。我想知道如何在 C 或 C++ 中实现这一点?或者,我是否错过了搜索任何现有资源?

希望有意见。

【问题讨论】:

标签: google-maps google-maps-api-3 kml point-in-polygon


【解决方案1】:

扩展了开源 libkml C++ 库并在其中实现了多边形中的点。这是源代码:

https://github.com/gumdal/libkml-pointinpolygon

我还没有达到上述问题的第二点。不过,在这件事上的任何线索都将不胜感激:)

【讨论】:

    【解决方案2】:

    我正在寻找 C/C++ 中的 KML 库,并看到了您的帖子。看起来它已经 6 岁以上了,但如果其他人来这里寻找您问题的第二部分......

    我不记得我在网络上是从哪里挖到这个的,所以我不能给予/承认。

    // *************************************************************************
    //
    //  Function:   distToLine
    //
    //  Usage:      Calculate the shortest distance to a line
    //
    //  Params:     x1      - Line start x
    //              y1      - Line start y
    //              x2      - Line end x
    //              y2      - Line end y
    //              ptX     - Observation Point x
    //              ptY     - Observation Point y
    //
    //  Returns:    Distance
    //
    //  Notes:
    //
    // *************************************************************************
    
    double distToLine(double x1, double y1, double x2, double y2, double ptX, double ptY)
    {
        double  dx;
        float   dy;
        float   t;
    
        dx = x2 - x1;
        dy = y2 - y1;
    
        if ((dx == 0) && (dy == 0))
        {
            dx = ptX - x1;
            dy = ptY - y1;
            return sqrt(dx * dx + dy * dy);
        }
    
        t = ((ptX - x1) * dx + (ptY - y1) * dy) / (dx * dx + dy * dy);
    
        if (t < 0)          // point is nearest to the first point i.e x1,y1
        {        
            dx = ptX - x1;
            dy = ptY - y1;
        }
        else if (t > 1)     // point is nearest to the end point i.e x2,y2
        {        
            dx = ptX - x2;
            dy = ptY - y2;
        }
        else                // if perpendicular line intersect the line segment.
        {        
            dx = ptX - (x1 + t * dx);
            dy = ptY - (y1 + t * dy);
        }
    
        return sqrt(dx * dx + dy * dy);     // returning shortest distance
    }
    // distToLine()
    

    【讨论】:

    • 感谢您的光临,但是您提供的是到线的距离,但是,我正在尝试到多边形的最近距离。我知道多边形是一组线,我们可以迭代多边形中的所有线,但是,这里的多边形甚至可以在内部有孔,并且 KML 的结构可能很复杂。记住这一点,我认为这对我不起作用。是的,它的代码已经 6 年多,但基于纯 C++ 构建,所以它仍然有效。
    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多