Как определить, что точка находится внутри многоугольника с помощью Google Maps? - PullRequest
12 голосов
/ 14 июня 2010

Я хотел бы обнаружить, что google.maps.LatLng находится внутри google.maps.Polygon.

Как я могу это сделать?

Приветствия

Ответы [ 6 ]

22 голосов
/ 15 сентября 2012

Вы можете использовать это в Google Map V3 : -

google.maps.geometry.poly.containsLocation(google.maps.LatLng(latitude, longitude),polygons);

polygons - это объект, возвращаемый функцией после polygoncomplete .

var polygons=null;
google.maps.event.addDomListener(drawingManager, "polygoncomplete", function(polygon) {
        polygons=polygon;
});

ссылка по https://developers.google.com/maps/documentation/javascript/reference

11 голосов
/ 11 ноября 2010

Другое решение: Google-Maps-Point-in-Polygon

Расширение Javascript Google Maps v3 для класса Polygon, позволяющее определить, находится ли в нем точка ...

5 голосов
/ 29 февраля 2012

Google предоставляет свою собственную реализацию в библиотеке геометрии, которую я не проверял, но предположительно охватывает случаи ребер, обсуждаемые в других ответах.

См. Метод containsLocation , описанный здесь ,Обратите внимание, что вам придется явно импортировать библиотеку геометрии, поскольку она отсутствует в API базовой карты

4 голосов
/ 14 июня 2010

Я использовал этот алгоритм, чтобы определить, что точка находится внутри многоугольника: http://alienryderflex.com/polygon/

Я добавил новый метод contains к многоугольнику:

// Add a function contains(point) to the Google Maps API v.3

google.maps.Polygon.prototype.contains = function(point) {
  var j=0;
  var oddNodes = false;
  var x = point.lng();
  var y = point.lat();

  var paths = this.getPath();

  for (var i=0; i < paths.getLength(); i++) {
    j++;
    if (j == paths.getLength()) {j = 0;}
    if (((paths.getAt(i).lat() < y) && (paths.getAt(j).lat() >= y))
    || ((paths.getAt(j).lat() < y) && (paths.getAt(i).lat() >= y))) {
      if ( paths.getAt(i).lng() + (y - paths.getAt(i).lat())
      /  (paths.getAt(j).lat()-paths.getAt(i).lat())
      *  (paths.getAt(j).lng() - paths.getAt(i).lng())<x ) {
        oddNodes = !oddNodes
      }
    }
  }
  return oddNodes;
}

google.maps.Polyline.prototype.contains = google.maps.Polygon.prototype.contains;
2 голосов
/ 12 сентября 2014

Нет необходимости в сложных алгоритмах, я смог добиться этого с помощью метода isPointInPath () html canvas.

http://www.w3schools.com/tags/canvas_ispointinpath.asp

Создание элемента canvas.Нарисуйте многоугольник с несколькими конечными точками, используя методы moveTo (), lineTo ().Убедитесь, что точка (x, y) лежит внутри многоугольника, используя метод isPointInPath ().

<canvas id="canvas"></canvas>

//x,y are coordinate of the point that needs to be tested
//coordinates contains all endpoint of a polygon in format of x1,y1,x2,y2,x3,y3....
function isPointInPolygon(x, y, coordinates) {
var ctx = canvas.getContext("2d");
var coords = coordinates.split(',');

if (coords != null && coords.length > 4) {
    ctx.beginPath();
    ctx.moveTo(coords[0], coords[1]);
    for (j = 2; j < coords.length; j++) {
        ctx.lineTo(coords[j], coords[j + 1]);
        j++;
    }
    ctx.closePath();
    if (ctx.isPointInPath(x, y))
        return true;
    else
        return false;
}
return false;
}
2 голосов
/ 31 октября 2012

Каждый описанный здесь метод так или иначе дает сбой.

Методы, данные Андреем I и Натимом , не учитывают полигоны с геодезическими ребрами. Эти методы также не позволяют понять, что негеодезическое ребро в Картах Google является прямым только в проекции Меркатора. Эти методы предполагают, что вершины лежат на равном расстоянии широта широта / долгота, где одна широта градуса равна одному градусу долготы. В результате этой ошибки эти методы будут указывать, что точка находится за пределами многоугольника, а в некоторых случаях отображается внутри. Это легко наблюдается для длинных не вертикальных / не горизонтальных краев. Чтобы решить эту проблему, все точки должны быть сначала преобразованы из координат широты, долготы в координаты X, Y в проекции Меркатора. Вот метод преобразования координат из широты / долготы в х / у в Mercator. (Недостаток точности) Навигация по прямой линии может использоваться в качестве основы для альтернативного метода. Экспериментальная версия Google Maps 3.10 реализует этот метод.

Метод, упомянутый Полом Гиббсом, Swapnil Udare и Ади Лестером не учитывает геодезические границы, но в Google Maps v3.9 он использует тот же метод, который был упомянут выше для -геодезические полигоны. Как таковой он также страдает от той же проблемы, описанной выше.

Обновление - проблема с Google Maps была исправлена ​​в текущей экспериментальной версии Google Maps v3.10.

...