我有一个典型的问题,关于mysql的几何数据类型,多边形。
我有一个纬度和经度数组形式的多边形数据,例如:
[["x":37.628134, "y":-77.458334],
["x":37.629867, "y":-77.449021],
["x":37.62324, "y":-77.445416],
["x":37.622424, "y":-77.457819]]
我有一个点(Vertex),坐标是纬度和经度,例如:
$location = new vertex($_GET["longitude"], $_GET["latitude"]);
现在我想知道这个顶点(点)是否在多边形内部。我如何在php中做到这一点?
发布于 2012-05-15 08:11:25
上面流行的答案包含打字错误。在其他地方,这段代码已经被清理了。修正后的代码如下:
<?php
/**
From: http://www.daniweb.com/web-development/php/threads/366489
Also see http://en.wikipedia.org/wiki/Point_in_polygon
*/
$vertices_x = array(37.628134, 37.629867, 37.62324, 37.622424); // x-coordinates of the vertices of the polygon
$vertices_y = array(-77.458334,-77.449021,-77.445416,-77.457819); // y-coordinates of the vertices of the polygon
$points_polygon = count($vertices_x); // number vertices
$longitude_x = $_GET["longitude"]; // x-coordinate of the point to test
$latitude_y = $_GET["latitude"]; // y-coordinate of the point to test
//// For testing. This point lies inside the test polygon.
// $longitude_x = 37.62850;
// $latitude_y = -77.4499;
if (is_in_polygon($points_polygon, $vertices_x, $vertices_y, $longitude_x, $latitude_y)){
echo "Is in polygon!";
}
else echo "Is not in polygon";
function is_in_polygon($points_polygon, $vertices_x, $vertices_y, $longitude_x, $latitude_y)
{
$i = $j = $c = 0;
for ($i = 0, $j = $points_polygon-1 ; $i < $points_polygon; $j = $i++) {
if ( (($vertices_y[$i] > $latitude_y != ($vertices_y[$j] > $latitude_y)) &&
($longitude_x < ($vertices_x[$j] - $vertices_x[$i]) * ($latitude_y - $vertices_y[$i]) / ($vertices_y[$j] - $vertices_y[$i]) + $vertices_x[$i]) ) )
$c = !$c;
}
return $c;
}
?>
发布于 2020-04-16 15:58:37
更新了代码,以便我可以更容易地使用google地图:它接受如下数组:
Array
(
[0] => stdClass Object
(
[lat] => 43.685927
[lng] => -79.745829
)
[1] => stdClass Object
(
[lat] => 43.686004
[lng] => -79.745954
)
[2] => stdClass Object
(
[lat] => 43.686429
[lng] => -79.746642
)
因此,它将更容易与谷歌地图一起使用:
function is_in_polygon2($longitude_x, $latitude_y,$polygon)
{
$i = $j = $c = 0;
$points_polygon = count($polygon)-1;
for ($i = 0, $j = $points_polygon ; $i < $points_polygon; $j = $i++) {
if ( (($polygon[$i]->lat > $latitude_y != ($polygon[$j]->lat > $latitude_y)) &&
($longitude_x < ($polygon[$j]->lng - $polygon[$i]->lng) * ($latitude_y - $polygon[$i]->lat) / ($polygon[$j]->lat - $polygon[$i]->lat) + $polygon[$i]->lng) ) )
$c = !$c;
}
return $c;
}
https://stackoverflow.com/questions/5065039
复制相似问题