You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP点-in-多边形判断函数结果异常,求问题原因排查

多边形点内判断函数问题排查

我编写了一个PHP函数isPointInPolygon,用于判断传入的坐标点(例如[42.4694321,-93.8159149])是否落在给定的多边形坐标数组内,但该函数返回的结果不正确。以下是多边形的坐标数组以及我的函数代码,请问可能存在什么问题?

多边形坐标数组

[...] // 此处为多边形坐标数组内容

函数代码

public function isPointInPolygon($point, $polygon) {
    $x = $point[0];
    $y = $point[1];
    $inside = false;
    $n = count($polygon);
    $j = $n - 1;

    for ($i = 0; $i < $n; $i++) {
        if (($polygon[$i][1] < $y && $polygon[$j][1] >= $y || $polygon[$j][1] < $y && $polygon[$i][1] >= $y) &&
            ($polygon[$i][0] + ($y - $polygon[$i][1]) / ($polygon[$j][1] - $polygon[$i][1]) * ($polygon[$j][0] - $polygon[$i][0]) < $x)) {
            $inside = !$inside;
        }
        $j = $i;
    }

    return $inside; 
} 

可能的问题点

  • 坐标顺序不匹配:函数默认将传入点的第一个值作为x、第二个作为y,但如果你的多边形坐标或测试点是[纬度, 经度]的地理坐标顺序,而函数按平面坐标[x,y]处理,会导致整个判断逻辑错位,结果必然错误。先确认所有坐标的顺序是否统一。
  • 浮点数精度误差:PHP的浮点数运算存在精度损耗,当点刚好落在多边形边上,或者边的坐标值和点的y值非常接近时,$polygon[$i][1] < $y这类严格比较会出现误判。可以引入一个极小的epsilon值(比如1e-8),将比较改为模糊处理,避免精度问题。
  • 多边形未闭合:如果你的多边形坐标数组的第一个点和最后一个点不重合,函数循环时会漏掉最后一个点到第一个点的边的判断。需要确保多边形是闭合的,或者在函数开头自动将第一个点追加到数组末尾。
  • 未处理水平边的除数为零:当多边形的某条边是水平的(两个端点的y值相等),$polygon[$j][1] - $polygon[$i][1]会等于0,此时除法运算会产生错误。水平边不会和从点向右的水平射线相交,这种情况应该直接跳过该边的判断。

内容的提问来源于stack exchange,提问作者Benjamin Mwendwa Munyoki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:52:33