2015-08-03 2 views
6

Предположим, что я рисовать polygan используя листовку, как и в последующих демо: http://leaflet.github.io/Leaflet.draw/Определите, если точка находиться внутри многоугольника листовка

Мой вопрос, как я могу определить, является ли данная точка находиться внутри многоугольника или нет.

+0

Если многоугольник затем вы можете ориентировать каждый сегмент (внутри/снаружи). Рисование полупрямой от любой точки до бесконечности закончится нечетным или четным числом пересечений сегментов (всегда нечетным или всегда даже для каждого направления): четное число пересечений - это точки вне полигона и нечетные внутри. Таким образом, вы можете выбрать любое направление, например. ось x: проверьте пересекающиеся сегменты на '[pt.x, pt.y] - [inf, pt.y]' (вы также можете привязать полупрямую к ограничивающей рамке многоугольника). Есть, конечно, способы сделать это более эффективно: https://en.wikipedia.org/wiki/Point_location – BeyelerStudios

+0

Я спрашиваю, есть ли метод, который позволяет мне определить широту и долготу многоугольника, а затем определить, точка находится внутри многоугольника или не используется javascript –

+0

Я предлагаю вам усовершенствовать свой вопрос: а) проблема, которая у вас есть, и ожидаемое решение, которое вы хотите, б) полное описание того, что вы пробовали, и c) код, который у вас есть до сих пор – BeyelerStudios

ответ

19

Используйте алгоритм Casting Ray для проверки, если точка (маркер) лежит внутри многоугольника:

function isMarkerInsidePolygon(marker, poly) { 
    var polyPoints = poly.getLatLngs();  
    var x = marker.getLatLng().lat, y = marker.getLatLng().lng; 

    var inside = false; 
    for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) { 
     var xi = polyPoints[i].lat, yi = polyPoints[i].lng; 
     var xj = polyPoints[j].lat, yj = polyPoints[j].lng; 

     var intersect = ((yi > y) != (yj > y)) 
      && (x < (xj - xi) * (y - yi)/(yj - yi) + xi); 
     if (intersect) inside = !inside; 
    } 

    return inside; 
}; 

jsfiddle См, например.

Оригинальный источник для кода: https://github.com/substack/point-in-polygon/blob/master/index.js

+0

Спасибо вам очень, отлично работаю –

+0

@MajdiTaleb Приятно слышать! Пожалуйста, проголосуйте за полезные ответы (и хорошие вопросы) и отметьте ответ, который решает вашу проблему как «принятую». Это поможет другим пользователям. – gusper

+0

Большое спасибо. Действительно отличная работа! – Mirage

3

Вот модифицированный (с @Sumit намеков) версия @gusper ответ, который работал для меня: (я имел пончики)

 function isMarkerInsidePolygon(marker, poly) { 
      var inside = false; 
      var x = marker.getLatLng().lat, y = marker.getLatLng().lng; 
      for (var ii=0;ii<poly.getLatLngs().length;ii++){ 
       var polyPoints = poly.getLatLngs()[ii]; 
       for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) { 
        var xi = polyPoints[i].lat, yi = polyPoints[i].lng; 
        var xj = polyPoints[j].lat, yj = polyPoints[j].lng; 

        var intersect = ((yi > y) != (yj > y)) 
         && (x < (xj - xi) * (y - yi)/(yj - yi) + xi); 
        if (intersect) inside = !inside; 
       } 
      } 

      return inside; 
     }; 
Смежные вопросы