Google Maps — Как проверить, существует ли координата широта / долгота в полигоне или нет

Я хочу написать некоторый код на PHP, который будет проверять одну координату широты / долготы по отношению к координатам многоугольника. И вернуть true или false независимо от того, существует ли он внутри многоугольника.

например Я создал многоугольник здесь ..
http://www.geocodezip.com/polygonTool.asp

0: 53,34545, -6,255083
1: 53,340121, -6,239033
2: 53,338788, -6,238947
3: 53,337405, -6,240492
4: 53,334227, -6,245642
5: 53,332074, -6,252937
6: 53,330024, -6,264353
7: 53,333766, -6,264868
8: 53,33761, -6,265812
9: 53,338583, -6,266155
10: 53,341607, -6,265383
11: 53,342683, -6,264439
12: 53,344067, -6,264696
13: 53,344733, -6,259632

И у меня есть местоположение пользователя как …
53.338839, -6.249386 (который существует внутри этого многоугольника).

Есть ли простой способ проверить, что это внутри или снаружи многоугольника?

1

Решение

Один из способов определить, находится ли точка в многоугольнике, — это подсчитать, сколько раз линия, проведенная из точки (в любом направлении), пересекается с границей многоугольника. Если они пересекаются четное количество раз, то точка находится снаружи.

Следующий код PHP требует 2 массива $ polyX = массив точек долготы многоугольника. Повторите первую точку, чтобы закрыть многоугольник. $ polyy = массив точек широты многоугольника,

$polySides  = 13; //how many corners the polygon has
$polyX = array(53.34545,53.340121,53.338788,53.337405,53.334227,53.332074,53.330024,53.333766,53.33761,53.338583,53.341607,53.342683,53.344067,53.344733,53.34545);
$polyY = array(6.255083,-6.239033,-6.238947,-6.240492,-6.245642,-6.252937,-6.264353,-6.264868,-6.265812,-6.266155,-6.265383,-6.264439,-6.264696,-6.259632,6.255083);
$x =53.338839;//your coordinates
$y =-6.249386;function pointInPolygon($polySides,$polyX,$polyY,$x,$y) {
$j = $polySides-1 ;
$oddNodes = 0;
for ($i=0; $i<$polySides; $i++) {
if ($polyY[$i]<$y && $polyY[$j]>=$y
||  $polyY[$j]<$y && $polyY[$i]>=$y) {
if ($polyX[$i]+($y-$polyY[$i])/($polyY[$j]-$polyY[$i])*($polyX[$j]-$polyX[$i])<$x)    {
$oddNodes=!$oddNodes; }}
$j=$i; }

return $oddNodes; }if (pointInPolygon($polySides,$polyX,$polyY,$x,$y)){
echo "Is in polygon!";
}
else echo "Is not in polygon";

УВИДЕТЬ этот для реализации JavaScript.

1

Другие решения

От моего Геодезические классы, Основная функция:

function isInRegion(Geodetic_LatLong $position)
{
$latitude = $position->getLatitude()->getValue();
$longitude = $position->getLongitude()->getValue();
$perimeterNodeCount = count($this->_nodePoints);
$jIndex = $perimeterNodeCount - 1 ;
$oddNodes = FALSE;
for ($iIndex = 0; $iIndex < $perimeterNodeCount; ++$iIndex) {
$iLatitude = $this->_nodePoints[$iIndex]->getLatitude()->getValue();
$jLatitude = $this->_nodePoints[$jIndex]->getLatitude()->getValue();
if (($iLatitude < $latitude && $jLatitude >= $latitude) ||
($jLatitude < $latitude && $iLatitude >= $latitude)) {
$iLongitude = $this->_nodePoints[$iIndex]->getLongitude()->getValue();
$jLongitude = $this->_nodePoints[$jIndex]->getLongitude()->getValue();
if ($iLongitude +
($latitude - $iLatitude) /
($jLatitude - $iLatitude) * ($jLongitude - $iLongitude) < $longitude) {
$oddNodes = !$oddNodes;
}
}
$jIndex = $iIndex;
}
return $oddNodes;
}
0

По вопросам рекламы [email protected]