2014-11-20 2 views
2

У меня есть один вопрос, связанный с плагином листинга Draw. Я могу понять, если многоугольник содержит маркеры внутри или, если маркер находится внутри многоугольника, когда я нарисовать многоугольник или маркер, как:Листовая диаграмма Нарисуйте фигуру, если многоугольник включает в себя еще один

polygon.getBounds().contains([latitude, longitude]) 

Я ищу для любого примера, что делает что-то подобное , Я хочу знать, когда я рисую многоугольник, если он касается, или внутри другого полигона, или пересекает другой.

¿Есть ли способ сделать это простым способом?

Спасибо вам всем за ваше время. Bests!

ответ

2

Несмотря на то, что iH8 прав, и в листе нет поддержки, чтобы проверить, содержится ли многоугольник внутри другого, я мог бы предложить, возможно, немного лучший ответ с примером, который следует ниже.

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

Именно поэтому для таких вещей я всегда использую JTS (или это порт JavaScript JSTS). Для того, чтобы использовать методы, которые имеют там листовку или Google Map координаты, вам сначала нужно будет преобразовать их в JSTS координат, просто:

function _leafletLatLng2JTS (polygon) { 
     var coordinates = []; 
     var length = 0; 
     if (polygon && polygon.length) { 
      length = polygon.length; 
     } 
     for (var i = 0; i < length; i++) { 
      if (polygon.length) { 
       coordinates.push(new jsts.geom.Coordinate(polygon[i].lat, polygon[i].lng)); 
      } 
     } 
     return coordinates; 
} 

Теперь вам просто нужно создать два JSTS многоугольники и проверить, если один содержится внутри другой:

function _isWithin (firstLayer, secondLayer) { 

     var firstInput = _leafletLatLng2JTS(firstLayer.getLatLngs()[0]), 
       secondInput = _leafletLatLng2JTS(secondLayer.getLatLngs()[0]), 
       geometryFactory = new jsts.geom.GeometryFactory(); 
     //add last point to the end to create a closed polygon 
     firstInput.push(firstInput[0]); 
     secondInput.push(secondInput[0]); 

     var firstPolygon = geometryFactory.createPolygon(firstInput), 
       secondPolygon = geometryFactory.createPolygon(secondInput); 

     var isWithin = firstPolygon.contains(secondPolygon); 

     return isWithin; 
} 

Как это работает с Leaflet.Draw плагин вы можете увидеть в этом jsFiddle я создал. В этом примере вы можете нарисовать только два слоя на карте (это работает для прямоугольников и многоугольников), а затем проверяет, содержится ли второй в первом. Если вы удалите один, все будут удалены, чтобы вы могли рисовать с самого начала.

ОБНОВЛЕНИЕ 30.10.2017.:

Теперь вы можете использовать turf.js для этих вещей (метод booleanContains)

+0

Высоких, спасибо за продолжение. Это было недоступно в то время, когда я написал свой ответ. Довольно классный материал :) – iH8

+0

не может использовать в ES6, есть ли вообще импорт в ES6? – AhammadaliPK

+0

Вы проверили turf.js? Я обновил ответ. –

1

Листовка не имеет функциональных возможностей для проведения таких расчетов. Вы можете использовать библиотеку, такую ​​как GeoScript. Класс geom.Geometry содержит метод contains, который может вычислять, содержит ли геометрия другую геометрию. Он также имеет встроенный метод, который выполняет точно противоположный и метод пересечений. Практически все, что вам нужно, а затем некоторым нравится: обложки, кресты, перекрытия и прикосновения.