Как получить тип слоя формы листовки при нажатии на нее? - PullRequest
0 голосов
/ 11 июля 2019

Проект My Leaflet позволяет пользователям рисовать фигуры (линии, прямоугольники и многоугольники).Пользователь может нажимать на фигуры, чтобы получить их статистику (площадь, периметр и т. Д.).

Я попробовал событие click в моей FeatureGroup (), где добавлены все нарисованные мною фигуры.Я не уверен, что это лучший подход.Затем при нажатии вызывается функция, принимающая событие.Тип слоя выводится из объекта события.


 //Handlers for when drawn shapes are clicked
        editableLayers.on('click', onLayerClick);

        function onLayerClick(e)
        {
            let type = e.layerType,
                layer = e.layer;
            if (type === 'polygon') {
                polygons.push(e.layer);
                let area = L.GeometryUtil.geodesicArea(layer.getLatLngs()[0]);
                console.log("New polygon area: " + area);
            }

            if (type === 'rectangle') {
                rectangles.push(e.layer);
                let area = L.GeometryUtil.geodesicArea(layer.getLatLngs()[0]);
                console.log("New rectangle area: " + area);
            }     
        }

Объект типа возвращает неопределенное значение, а объект слоя возвращает набор параметров, не ссылающихся на тип фигуры.Из-за этого я не могу определить тип фигуры и выполнить правильные вычисления, чтобы получить их статистику.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Я бы использовал оператор instanceof для этой задачи, например:

function onLayerClick(ev) {
  var targetLayer = ev.sourceTarget;
  if (targetLayer instanceof L.Rectangle) {
     // Do something
  } else if (targetLayer instanceof L.Polygon) {
     // Do something
  } else if (targetLayer instanceof L.Polyline) {
     // Do something
  } else {
     // Do something
  }
}

Обратите внимание, что из-за , как работает наследование , любой экземпляр L.Rectangle также является экземпляром L.Polygon, L.Polyline и L.Path - поэтому код должен сначала проверять наиболее специфичные подклассы.

Не забудьте проверить ссылку на Leaflet, специально длябиты, которые сообщают вам о дереве наследования, например, :

Rectangle

Класс для рисования прямоугольных наложений на карте.Расширяет Polygon.

Диаграмма классов Leaflet также полезна для понимания дерева наследования.

0 голосов
/ 12 июля 2019

Основная причина в том, что event.layerType - это специальное свойство, добавляемое плагином Leaflet.draw, только когда пользователь создал новую функцию.

Когда вы присоединяете прослушиватель событий click к стандартной группе объектов Leaflet, объект события click не имеет такого свойства layerType, как вы можете проверить в docs .

Что касается решения, см. Ответ Ивана Санчеса.

...