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

时间:2015-06-10 01:06:24

标签: php codeigniter coordinates kml geojson

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

我使用算法detailed in this answer来确定该点是否在多边形内。

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

Click to see the image!

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

当我使用定义上图的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

是否有人知道如何修改算法才能正常工作?

1 个答案:

答案 0 :(得分:0)

绿色边界内的点,但您只想用另一个多边形覆盖它。

假设您有多个多边形,可能值得跟踪多边形是否有阴影(True)或没有阴影(False),或者根据您的算法实际存在的其他组合确实

将着色状态作为参数传递到testpointInPolygon函数(类似函数test($lat, $lng, $shaded))中,如果pointInPolygon则反转$shaded的输出是False

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

要找到外部循环,请创建一个多边形数组,然后迭代,检查其中的所有组合(使用您已有的算法)。检查一个点到一个完整的其他多边形应该工作。从不在其他内部的多边形将是外部循环(阴影)。所有其他人都在里面,倒置而不是阴影。

当然,这是假设循环永远不会跨越自己。

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