2010-06-14 3 views

ответ

11

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

Javascript Google Maps v3 e xtension для класса Polygon для определения того, находится ли в нем точка или нет ...

+0

По какой-то нечетной причине это работает, но я так и не смог получить Google containsLocation () для работы ..... – WildBill

+0

@WildBill - вам понадобится библиотека геометрии, чтобы заставить ее работать. Пример:? Sensor = false & libraries = рисунок, геометрия – jjwdesign

+0

Я добавил библиотеку геометрии из Google, но она по-прежнему не работает для меня – AllJs

4

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

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

// 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; 
+0

Очень красивый, он работает. Просто измените 'var x = point.getPosition(). Lng();' и 'var y = point.getPosition(). Lat();' –

5

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

См. ContainsLocation method described here. Обратите внимание, что вам придется import the geometry library explicitly, as it is not in the base map API

21

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

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

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

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

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

2

Каждый метод, описанный здесь, не может в той или иной форме.

Методы, приведенная Андрей I и Natim не рассматривать многоугольники с геодезическими краями. Эти методы также не понимают, что негеодезический край в Картах Google находится прямо в проекции Меркатора. Эти методы предполагают, что вершины лежат на сетке равных расстояний lat/lon, где одна градусная широта равна одной градусу долготы. В результате этой ошибки эти методы укажут, что точка находится за пределами многоугольника, в то время как для некоторых случаев отображается внутри. Это легко наблюдать для длинных не вертикальных/не горизонтальных кромок. Для решения этой проблемы все точки сначала должны быть преобразованы из координат широты, долготы в X, Y в проекции Меркатора. Here is the method to convert the coordinates from lat/lon to x/y in Mercator. (Недостаток точности) Rhumb line navigation can be used as a basis for an alternative method. Экспериментальная версия Google Maps 3.10 реализует этот метод.

Упомянутый Пол Гиббс, Swapnil udare и Ади Lester метод делает рассматривать геодезические края, но на Google Maps v3.9 использует тот же метод, упомянутый выше для негеодезических полигонов. Таким образом, он также страдает от той же проблемы, описанной выше.

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

2

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

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

Создать брезентовый элемент. Нарисуйте многоугольник с несколькими конечными точками, используя методы 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; 
} 
+0

Плакат задавал вопрос о полигонах на картах Google. Не все браузеры поддерживают холст, и вышеупомянутый метод предполагает стандартную сетку X, Y. Если вы рисуете на холсте, вышеупомянутый метод совершенен, иначе это просто расточительно. Другие методы, упомянутые выше, могут вычислять это без накладных расходов на холст. Лучший способ Google Maps v3.10 - google.maps.geometry.poly.containsLocation(), поскольку он обрабатывает геодезические полигоны, а также полигоны меркатора. – deAtog

+0

Согласен. Он точно не отвечает на этот вопрос, но может помочь людям, которые работают в среде html5, и попадает в этот пост, чтобы обнаружить точку в полигоне. Я пришел на этот пост и попытался реализовать все алгоритмы, но ничего не получилось. Я в основном реализовал пользовательскую карту на изображении плана этажа, используя холст. Мне пришлось показывать подсказки на разных частях изображения и имитировать html-графическую функциональность. –

Смежные вопросы