Карта Google: это лат /lng в полигоне?

Учитывая пару значений lat/lng, как определить, находится ли пара в полигоне? Мне нужно сделать это на PHP. Я вижу, что API Карт Google имеет метод containsLocation: https://developers.google.com/maps/documentation/javascript/reference. Есть ли способ использовать это из PHP?

Ответ 1

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

Я реализовал код C из этой статьи Point in Polygon в php и использовал многоугольник ниже, чтобы проиллюстрировать.

polygon

<?php
//Point-In-Polygon Algorithm
$polySides  = 4; //how many corners the polygon has
$polyX    =  array(4,9,11,2);//horizontal coordinates of corners
$polyY    =  array(10,7,2,2);//vertical coordinates of corners
$x = 3.5;
$y = 13.5;//Outside
//$y = 3.5;//Inside

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";
?>

Ответ 2

очень большой благодаря Давиду Страчану и Дарел Рекс Финли

Я хочу поделиться своей версией PHP, немного отличается от beacause, поскольку она принимает точку в виде массива ([lat, lng]) и многоугольника как массив точки ([[lat, lng], [lat, lng],...])

  function pointInPolygon($point, $polygon){//http://alienryderflex.com/polygon/
     $return = false;
     foreach($polygon as $k=>$p){
        if(!$k) $k_prev = count($polygon)-1;
        else $k_prev = $k-1;

        if(($p[1]< $point[1] && $polygon[$k_prev][1]>=$point[1] || $polygon[$k_prev][1]< $point[1] && $p[1]>=$point[1]) && ($p[0]<=$point[0] || $polygon[$k_prev][0]<=$point[0])){
           if($p[0]+($point[1]-$p[1])/($polygon[$k_prev][1]-$p[1])*($polygon[$k_prev][0]-$p[0])<$point[0]){
              $return = !$return;
           }
        }
     }
     return $return;
  }

Ответ 3

Как вы сказали в своем вопросе, этот метод связан с геометрической библиотекой API-интерфейсов Google Maps V3, поэтому объекты не могут обрабатываться с PHP, это решение может работать, чтобы сделать аякс, вызываемый сервером, запрашивая для вашего lat и long, возвращает данные (перейдите к базе данных, сделайте свой материал), и в случае успеха (с уже загруженной библиотекой карт google) проверьте, содержит ли точки эту точку. И, возможно, если вам нужно сохранить это в какой-то момент, сделайте еще один ajax, отправляющий результат для текущей позиции.

Ответ 4

Есть, по-моему, совокупность способов сделать это. Первым было бы использовать это расширение или что-то вроде этого, чтобы определить, находится ли точка внутри многоугольника:

Расширение Google-Maps-Point-in-Polygon

Вот объяснение алгоритма литья, который также поможет вам немного:

Точка в полигоне

Простой пример из расширения показывает, что он довольно прямолинейный:

        var coordinate = new google.maps.LatLng(40, -90);                                                                                                                                                                                                       
        var polygon = new google.maps.Polygon([], "#000000", 1, 1, "#336699", 0.3);
        var isWithinPolygon = polygon.containsLatLng(coordinate);