多边形中的点php脚本在某些区域不起作用

多边形中的点php脚本在某些区域不起作用,php,polygon,point,point-in-polygon,Php,Polygon,Point,Point In Polygon,我正在开发一个应用程序,我需要找出一个点(纬度,液化天然气)是否在一个多边形(一组纬度和液化天然气点)内。一切正常。 但是在某些区域,如果我创建了一个复杂的多边形,那么它就不能提供正确的输出 这是一个简单的多边形,它正在工作 <?php function inside($point, $fenceArea) { $x = $point['lat']; $y = $point['lng']; $inside = false; for ($i = 0, $j =

我正在开发一个应用程序,我需要找出一个点(纬度,液化天然气)是否在一个多边形(一组纬度和液化天然气点)内。一切正常。 但是在某些区域,如果我创建了一个复杂的多边形,那么它就不能提供正确的输出

这是一个简单的多边形,它正在工作


<?php
function inside($point, $fenceArea) {
    $x = $point['lat']; $y = $point['lng'];

    $inside = false;
    for ($i = 0, $j = count($fenceArea) - 1; $i <  count($fenceArea); $j = $i++) {
        $xi = $fenceArea[$i]['lat']; $yi = $fenceArea[$i]['lng'];
        $xj = $fenceArea[$j]['lat']; $yj = $fenceArea[$j]['lng'];

        $intersect = (($yi > $y) != ($yj > $y))
            && ($x < ($xj - $xi) * ($y - $yi) / ($yj - $yi) + $xi);
        if ($intersect) $inside = !$inside;
    }

    return $inside;
}

//Australia (Inside)
$point = array("lat" => -24.87855066568728, "lng" => 126.56257074812599);
$fenceArea = '[{"lat":-19.87428528458033,"lng":104.58991449812599},{"lat":-8.302916217843437,"lng":128.496164498126},{"lat":3.6185873058405367,"lng":145.01960199812598},{"lat":-9.865054730919933,"lng":155.39069574812598},{"lat":-19.543318333901535,"lng":161.19147699812598},{"lat":-26.179191152208137,"lng":165.05866449812595},{"lat":-31.563642903583,"lng":168.22272699812592},{"lat":-34.79945105633346,"lng":168.92585199812598},{"lat":-39.55834713516464,"lng":157.32428949812598},{"lat":-49.76997599280237,"lng":116.89460199812599}]';
$fenceArea = json_decode($fenceArea, true); 

if(inside($point, $fenceArea)){
    exit('Inside');
}else{
    exit('Outside');
}
//prints Inside
<?php
function inside($point, $fenceArea) {
    $x = $point['lat']; $y = $point['lng'];

    $inside = false;
    for ($i = 0, $j = count($fenceArea) - 1; $i <  count($fenceArea); $j = $i++) {
        $xi = $fenceArea[$i]['lat']; $yi = $fenceArea[$i]['lng'];
        $xj = $fenceArea[$j]['lat']; $yj = $fenceArea[$j]['lng'];

        $intersect = (($yi > $y) != ($yj > $y))
            && ($x < ($xj - $xi) * ($y - $yi) / ($yj - $yi) + $xi);
        if ($intersect) $inside = !$inside;
    }

    return $inside;
}

//Australia (Outside)
$point = array("lat" => -24.87855066568728, "lng" => 126.56257074812599);
$fenceArea = '[{"lat":-19.87428528458033,"lng":104.58991449812599},{"lat":-8.302916217843437,"lng":128.496164498126},{"lat":3.6185873058405367,"lng":145.01960199812598},{"lat":-9.865054730919933,"lng":157.85163324812598},{"lat":-19.543318333901535,"lng":161.19147699812598},{"lat":-35.9460732248598,"lng":-179.82414800187405},{"lat":-48.62135528493185,"lng":177.71491449812598},{"lat":-49.76997599280237,"lng":155.56647699812598},{"lat":-44.76552676076747,"lng":112.67585199812599}]';

if(inside($point, $fenceArea)){
    exit('Inside');
}else{
    exit('Outside');
}
//prints Outside (but actually the lat and lng is inside the polygon)