查找是否迟点/长点在由坐标定义的多边形内


Finding if lat/long point is inside a polygon defined by coordinates

我目前正在抓取用于定义这里所见多边形的KML。

我正在使用这个答案中详细的算法来确定点是否在多边形内。

我遇到的问题是,如果点在多边形的空部分内,如下所示。

点击查看图片!

如果我传递印第安纳波利斯的坐标(箭头所示),算法仍然说该点在浅绿色多边形内,这是假的。

当我使用定义上面图像的KML传入印第安纳波利斯的坐标时,结果如下:

string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Slight Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Slight Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is inside General Thunder

有没有人对我如何修改算法正确工作的想法?

在绿色边界内,但你只是想用另一个多边形覆盖它。

假设你有多个多边形,可能值得跟踪多边形是否着色(True)或不着色(False),或基于你的算法实际做的其他组合。

将阴影状态作为testpointInPolygon函数(类似于函数test($lat, $lng, $shaded))的参数传递,如果$shadedFalse,则反转pointInPolygon的输出。

function pointInPolygon($p, $polygon, $shaded) {
    //if you operates with (hundred)thousands of points
    //rest of code
    $output = $c%2!=0;
    if (!$shaded) { //if the area is not shaded, negate the output
        return !$output;
    } else {
        return $output;
    }
}

要找到外部循环,制作一个多边形数组,并进行迭代,检查所有组合,其中哪个在哪个里面(使用您已经拥有的算法)。检查一个点从一个到完整的其他多边形应该工作。从未在其他多边形内部的多边形将是外部循环(阴影)。其他的都在里面,而且是倒置的,没有阴影。

当然,这是假设循环不会交叉的。

您需要使用该算法测试所有折线中的点。如果它在外部循环内,而不在任何内部循环内,则显示阴影;如果它在外部循环中,并且在内部循环中,则不着色。