检查多边形是否在 PHP 中的另一个多边形内
Check if a Polygon is inside another Polygon in PHP
我正在尝试在 PHP 中创建一个算法,如果一个多边形的面积与另一个多边形的面积相交,或者完全在里面,该算法应该 return 为真。
Sutherland–Hodgman algorithm 是我正在寻找的算法,但我在 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
我的多边形实际上是由纬度和经度坐标保存的,但我认为这不会对算法造成任何问题。
您认为我可以按照我描述的那样做吗?
或者,如果不是,请问我的逻辑错误是什么?
另一个问题是:如果我有一个多边形,所有边界都在另一个多边形内,它永远不会穿过它。那么算法在那种情况下会起作用吗?
祝你有愉快的一天!
2019 年 3 月 4 日更新
我发现了一个名为 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)
方法return错误,我不明白为什么...
这是我得到的结果:
我希望我一切顺利,我想了解为什么我不能使用我在 this documentation
上找到的 "crosses" 方法
终于找到解决我所有问题的方法了!
- 前往 https://geophp.net/ 并下载资源
- 安装软件包 php-geos 之后 link https://packages.debian.org/stretch-backports/amd64/php-geos/download
- 启用 php-geos 包 (geos.ini)
- "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";
}
我正在尝试在 PHP 中创建一个算法,如果一个多边形的面积与另一个多边形的面积相交,或者完全在里面,该算法应该 return 为真。
Sutherland–Hodgman algorithm 是我正在寻找的算法,但我在 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
我的多边形实际上是由纬度和经度坐标保存的,但我认为这不会对算法造成任何问题。
您认为我可以按照我描述的那样做吗? 或者,如果不是,请问我的逻辑错误是什么?
另一个问题是:如果我有一个多边形,所有边界都在另一个多边形内,它永远不会穿过它。那么算法在那种情况下会起作用吗?
祝你有愉快的一天!
2019 年 3 月 4 日更新
我发现了一个名为 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)
方法return错误,我不明白为什么...
这是我得到的结果:
我希望我一切顺利,我想了解为什么我不能使用我在 this documentation
上找到的 "crosses" 方法终于找到解决我所有问题的方法了!
- 前往 https://geophp.net/ 并下载资源
- 安装软件包 php-geos 之后 link https://packages.debian.org/stretch-backports/amd64/php-geos/download
- 启用 php-geos 包 (geos.ini)
- "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";
}