指向KML Polygon - C / C ++代码

问题描述 投票:0回答:2

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

我搜索过,但我得到的只是javascript(谷歌地图apis),可以实现相同。我甚至无法直接移植它,因为我有一个略微修改的要求:

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

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

想有投入。

google-maps google-maps-api-3 kml point-in-polygon
2个回答
1
投票

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

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

我还没有达到上述问题的第二点。虽然这个问题的任何线索都会受到赞赏:)


0
投票

我正在寻找一个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()
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.