检查一个多边形是否在PHP中的另一个多边形内

shqnks

我正在尝试在PHP中创建一种算法,如果一个多边形的区域与另一个多边形的区域相交,或者该多边形完全在内部,则该算法应返回true。

Sutherland–Hodgman算法是我正在寻找的一种算法,但是我需要在php中使用它。

这是维基百科的伪代码:

List outputList = subjectPolygon;  

  for (Edge clipEdge in clipPolygon) do
     List inputList = outputList;
     outputList.clear();
     //
     for(int i = 0 ; i < inputList.count ; i += 1) do
        Point current_point = inputList[i];
        Point prev_point = inputList[((i % inputList.count) + inputList.count) % inputList.count];

        Point Intersecting_point = ComputeIntersection(prev_point,current_point,clipEdge)

        if (current_point inside clipEdge) then
           if (prev_point not inside clipEdge) then
              outputList.add(Intersecting_point);
           end if
           outputList.add(current_point);

        else if (prev_point inside clipEdge) then
           outputList.add(Intersecting_point);
        end if

     done
  done

实际上,我的多边形是通过纬度和经度坐标保存的,但是我认为这不会对算法造成任何问题。

您认为我可以按照我的描述去做吗?或者如果不是,请问我的逻辑错误是什么?

另一个问题是:如果我有一个多边形,而该多边形的所有边界都在另一个多边形内,则它将永远不会穿过该多边形。那么该算法在那种情况下会起作用吗?

祝你今天愉快 !


更新03/04/2019

我找到了一个名为GEOPHP的漂亮工具,它使用GEOS库。我已经将其安装在服务器上,并且可以部分运行。

这是我的测试代码:

         if (geoPHP::geosInstalled()) {
            print "GEOS installed :)<hr>";
          }
          else {
            print "GEOS not installed :(<hr>";
          }

        $polygon = geoPHP::load('POLYGON((1 1,5 1,5 5,1 1))','wkt');
        $area = $polygon->getArea();
        $centroid = $polygon->getCentroid();
        $centX = $centroid->getX();
        $centY = $centroid->getY();
        print "Polygon 1: <br>";
        print "Area: ".$area." <br> Center :  X=".$centX." and Y=".$centY;

        $polygon2 = geoPHP::load('POLYGON((2 2,2 3,3 3,3 2,2 2))','wkt');
        $area = $polygon2->getArea();
        $centroid = $polygon2->getCentroid();
        $centX = $centroid->getX();
        $centY = $centroid->getY();
        print "<hr>Polygon 2: <br>";
        print "Area: ".$area." <br> Center :  X=".$centX." and Y=".$centY;

        print "<hr>";

        if($polygon2->crosses($polygon)){
            print "IT CROSSES";
        }else{
            print "IT DOESN'T CROSSES";
        }

它应该交叉,但是$polygon2->crosses($polygon)方法返回false,我不明白为什么...

这是我得到的结果:

该代码的结果

希望我过得很好,我想了解为什么我不能使用在本文档中找到的“十字架”方法

shqnks

终于发现了如何解决我所有的问题!

  1. 转到https://geophp.net/并下载源
  2. 通过此链接https://packages.debian.org/stretch-backports/amd64/php-geos/download安装软件包php-geos
  3. 启用php-geos软件包(geos.ini)
  4. “ crosses”方法不是我正在寻找的方法!好人是“相交

正确的代码是:

         include("geophp/geoPHP.inc");

         if (geoPHP::geosInstalled()) {
           print "GEOS installed :)<hr>";
         }
         else {
           print "GEOS not installed :(<hr>";
         }

        $polygon = geoPHP::load('POLYGON((1 1, 4 1, 4 4, 1 4, 1 1))','wkt');
        $area = $polygon->getArea();
        $centroid = $polygon->getCentroid();
        $centX = $centroid->getX();
        $centY = $centroid->getY();
        print "Polygon 1: <br>";
        print "Area: ".$area." <br> Center :  X=".$centX." and Y=".$centY;

        $polygon2 = geoPHP::load('POLYGON((2 2, 3 2, 3 3, 2 3, 2 2))','wkt');
        $area = $polygon2->getArea();
        $centroid = $polygon2->getCentroid();
        $centX = $centroid->getX();
        $centY = $centroid->getY();
        print "<hr>Polygon 2: <br>";
        print "Area: ".$area." <br> Center :  X=".$centX." and Y=".$centY;

        print "<hr>";

        if($polygon2->intersects($polygon)){
            print "OK";
        }else{
            print "NOT OK";
        }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

检查多边形点是否在传单中的另一个点内

用另一个多边形分割一个多边形

选择与另一个多边形相交(或完全在另一个多边形内)的多边形[R sf]

确定一个多边形是否包含另一个

如何从R中的另一个shapefile中获取包含多边形质心的shapefile的多边形?

XML/KML - 如何在 bash 脚本中测试多边形是否“接触”另一个多边形

是否可以仅使用平行平移和比例缩放将一个多边形转换为另一个多边形?

OpenLayers 4如何检测一个多边形是否碰到另一个多边形的侧面

通过减去与另一个多边形的交点来创建新的形状多边形

如何在python文件中从一个多边形移动到另一个多边形?

分割自相交多边形仅在Shapely中返回一个多边形

用R中的另一个变量填充sp映射对象的多边形

ShaderLab 偏移不渲染一个多边形在另一个上方

将一个2D多边形完全带入另一个2D多边形的翻译是什么?

当一个多边形位于另一个多边形之上时,无法触发点击事件

剪辑路径多边形覆盖另一个

如何判断一个点是否在纹理的多边形内

如何确定一个点是否在2D凸多边形内?

如何找出一个点是否在Matlab中的固定多边形中?

问题裁剪SF对象到R中另一个SF多边形的范围

pygame 中是否有一个类来表示非 AABB 多边形?

从用户中选择一个多边形的算法

如何创建一个适合多边形的圆?

在R相交-错过一个多边形

将许多小多边形组合成一个(一些)大多边形

jQuery和生成的SVG多边形-创建循环以给每个多边形一个唯一的类?

将多边形重复区域(重叠)仅分配给一个多边形

Skimage多边形功能:为什么在多边形文档示例中最后一个顶点重复?

Postgis得到一个最小面积的多边形,它将覆盖所有定义的多边形