Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查找lat/long点是否位于由坐标定义的多边形内_Php_Codeigniter_Coordinates_Kml_Geojson - Fatal编程技术网

Php 查找lat/long点是否位于由坐标定义的多边形内

Php 查找lat/long点是否位于由坐标定义的多边形内,php,codeigniter,coordinates,kml,geojson,Php,Codeigniter,Coordinates,Kml,Geojson,我目前正在抓取用于定义所见多边形的KML 我使用算法来确定点是否在多边形内 我的问题是,如果该点位于多边形的空白部分内,如下图所示 如果我传递印第安纳波利斯的坐标(箭头所示),算法仍然表示该点位于浅绿色多边形内,这是错误的 当我使用定义上面图像的KML传递印第安纳波利斯的坐标时,这些就是结果 string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk string(22) "39.777

我目前正在抓取用于定义所见多边形的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
),或者其他组合可能是值得的

test
pointInPolygon
函数(类似于function
test($lat,$lng,$shaded)
)中将着色状态作为参数传递,如果
$shaded
False,则反转
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;
    }
}
要找到外部循环,请创建一个多边形数组,并进行迭代,检查其中的所有组合(使用已有的算法)。将一个点从一个多边形检入完整的另一个多边形应该可行。不在其他多边形内部的多边形将是外部循环(着色)。所有其他的都在里面,倒置,没有阴影

当然,这是假设循环永远不会交叉


您需要使用该算法测试所有多段线中的点。如果它在外部循环内,而不在任何内部循环内,则会对其进行着色处理;如果它在外部循环内,而在内部循环内,则不会着色。

我不确定如何确定多边形是否着色。我要传递到
pointInPolygon
函数的多边形都是着色的,我要传递到
$lat
$lng
的点不在任何多边形中。确定。图中风暴或其他物体的多边形由多个环组成。你必须知道哪些是规则的,哪些是反转的(里面的阴影)。你只需要知道最外面的边界(你需要找出这个),然后你就可以假设其他的边界在里面,因此是反向的。如果该点位于外边界内,但不在内边界内,则该点为真。我刚刚想到了查找循环状态。循环本身不交叉,您可以看到当前KML。然后,我的想法是比较其他多段线内的多段线点。之后,您可以实现我最初的解决方案。