Отображение Leaflet.draw: как запустить функцию рисования без панели инструментов?

Для тех, кто имеет опыт работы с листовкой или плагином leaflet.draw:

Я хочу инициировать рисование многоугольника без использования панели инструментов из leaflet.draw. Мне удалось найти свойство, позволяющее редактировать без использования панели инструментов (layer.editing.enable();), с помощью поиска в Интернете (его нет в основной документации). Я не могу найти, как начать рисовать многоугольник без кнопки на панели инструментов. Любая помощь приветствуется!

Спасибо :)


person Sam    schedule 02.04.2013    source источник
comment
Мне нужно разобраться и в этом. Если вы нашли ответ, пожалуйста, напишите его здесь, спасибо.   -  person Gowiem    schedule 31.05.2013
comment
Мне еще предстоит найти ответ самому себе.   -  person Sam    schedule 12.06.2013
comment
См. этот вопрос для простой рабочей демонстрации: the-leaflet-draw-ui" title="как нажать кнопку и начать новый многоугольник без использования пользовательского интерфейса для рисования листовок"> stackoverflow.com/questions/22730888/   -  person Ground Hog    schedule 30.03.2014


Ответы (4)


Этот простой код работает для меня:

new L.Draw.Polyline(map, drawControl.options.polyline).enable();

Просто поместите его в обработчик onclick вашей пользовательской кнопки (или куда угодно).

Переменные map и drawControl являются ссылками на вашу карту листовки и элемент управления отрисовкой.

Погрузившись в исходный код (leaflet.draw-src.js), вы можете найти функции для рисования других элементов и их редактирования или удаления.

new L.Draw.Polygon(map, drawControl.options.polygon).enable()
new L.Draw.Rectangle(map, drawControl.options.rectangle).enable()
new L.Draw.Circle(map, drawControl.options.circle).enable()
new L.Draw.Marker(map, drawControl.options.marker).enable()

new L.EditToolbar.Edit(map, {
                featureGroup: drawControl.options.featureGroup,
                selectedPathOptions: drawControl.options.edit.selectedPathOptions
            })
new L.EditToolbar.Delete(map, {
                featureGroup: drawControl.options.featureGroup
            })

Я надеюсь, что это будет полезно и для вас.

РЕДАКТИРОВАТЬ: классы L.EditToolbar.Edit и L.EditToolbar.Delete предоставляют следующие полезные методы:

  • enable(): запустить режим редактирования/удаления
  • disable(): вернуться в стандартный режим
  • save(): для сохранения изменений (вызывает события draw:edited / draw:deleted)
  • revertLayers(): отменить изменения
person BaCH    schedule 17.06.2013
comment
Спасибо дружище, очень признателен. Я сдался и решил сообщить пользователю, когда нажимать на панель инструментов. Я вернусь к этому и рефакторинг моей страницы :) - person Sam; 19.07.2013
comment
Если вы хотите узнать, как программно создать маркер, который можно редактировать с помощью leaflet.draw, см.: github.com/Leaflet/Leaflet.draw/issues/159 - person Ruut; 06.05.2014
comment
Можно ли использовать этот метод для создания многоугольников с другим стилем? т.е. одна кнопка создает зеленый многоугольник, другая создает синий. Если да, то как бы вы это сделали? - person Marty.H; 13.04.2015
comment
Да, вы можете передать в качестве второго параметра L.Draw.* различные наборы опций. Вот ссылка на параметр option: github.com/Leaflet/Leaflet.draw #параметры-обработчика. Свойство, которое вам нужно установить, это shapeOptions. - person BaCH; 13.04.2015
comment
Могу ли я прослушивать события кликов из вершины без использования панели инструментов Draw? - person Es Noguera; 19.02.2018
comment
Спасатель жизни! Единственная странная проблема заключается в том, что я больше не вижу область при рисовании многоугольника. - person JohnGIS; 02.07.2019
comment
Я не разобрался, как получить переменную drawControl, не могли бы вы привести пример? - person Rayann Nayran; 10.11.2020
comment
@RayannNayran drawControl — это объект класса L.Control.Draw, определенный плагином Leaflet.draw. Вы можете просто создать его как: var drawControl = new L.Control.Draw(options); Вот пример: github.com/Leaflet/Leaflet.draw - person BaCH; 13.11.2020

Я думаю, стоит упомянуть ответ Джейкоба Тойеса на эту проблему. Вы всегда рисуете с помощью обработчиков в leaflet.draw, а не напрямую со слоями. Если вы хотите отредактировать слой, вы используете обработчик, сохраненный в поле слоев editing, например: layer.editing.enable();. И если вы хотите создать новый слой, сначала создайте новый обработчик:

// Define you draw handler somewhere where you click handler can access it. N.B. pass any draw options into the handler
var polygonDrawer = new L.Draw.Polyline(map);

// Assumming you have a Leaflet map accessible
map.on('draw:created', function (e) {
    var type = e.layerType,
        layer = e.layer;

    // Do whatever you want with the layer.
    // e.type will be the type of layer that has been draw (polyline, marker, polygon, rectangle, circle)
    // E.g. add it to the map
    layer.addTo(map);
});

// Click handler for you button to start drawing polygons
$('#draw_poly').click(function() {
    polygonDrawer.enable();
});

К настоящему времени на странице github leaflet.draw уже есть пример: https://github.com/Leaflet/Leaflet.draw/blob/develop/docs/examples/edithandlers.html

Тем не менее, я думаю, что обработчики там еще недостаточно хорошо документированы.

Как указано выше, L.EditToolbar.Edit и L.EditToolbar.Delete предоставляют интересные методы и события, такие как editstart и editstop. Что не упоминается, так это то, что сами эти два класса являются производными от L.Handler.

person schmijos    schedule 22.10.2014
comment
Привет, @schmijos, у меня не получается. Я скопировал ваш код, но когда я закончу рисовать, я не смогу его редактировать. что мне добавить в ваш код, чтобы я мог редактировать? - person Nika Kurashvili; 04.06.2019
comment
Привет, @NikaKhurashvili, извини, я уже совсем не в этом контексте. Я бы посоветовал вам задать ТАК собственный вопрос о том, что вы уже пробовали. - person schmijos; 04.06.2019

Итак, я понял это для кругов, но то же самое должно быть и для многоугольников. Это на самом деле очень просто. Надеюсь, следующий код ответит на ваш вопрос, но если нет, дайте мне знать, и я могу опубликовать больше информации или что-то в этом роде.

// Creates the circle on the map for the given latLng and Radius
// If the createdWithAddress flag is true, the circle will not update 
// it's address according to its position. 
createCircle: function(latLng, radius, createdWithAddress) {
if (!this.circle) {
  var self = this,
      centerIcon,
      centerMarker;

  centerIcon = new L.Icon({
    iconUrl: '/assets/location_pin_24px.png',
    iconSize: [24, 24],
    iconAnchor: [12, 24],
    shadowUrl: '/assets/marker-shadow.png',
    shadowSize: [20, 20],
    shadowAnchor:[6, 20]
  })

  // Setup the options for the circle -> Override icons, immediately editable
  options = {
    stroke: true,
    color: '#333333',
    opacity: 1.0,
    weight: 4,
    fillColor: '#FFFFFF',
    moveIcon: centerIcon,
    resizeIcon: new L.Icon({
      iconUrl: '/assets/radius_handle_18px.png',
      iconSize: [12, 12],
      iconAnchor: [0,0]
    })
  }

  if (someConfigVarYouDontNeedToKnow) {
    options.editable = false
    centerMarker = new L.Marker(latLng, { icon:centerIcon })
  } else {
    options.editable = true
  }

  // Create our location circle 
  // NOTE: I believe I had to modify Leaflet or Leaflet.draw to allow for passing in
  // options, but you can make it editable with circle.editing.enable()
  this.circle = L.circle([latLng.lat, latLng.lng], radius, options)

  // Add event handlers to update the location
  this.circle.on('add', function() {
    if (!createdWithAddress) {
      self.reverseGeocode(this.getLatLng())
    }
    self.updateCircleLocation(this.getLatLng(), this.getRadius())
    self.updateMapView()
  })            
  this.circle.on('edit', function() {
    if (self.convertLatLngToString(this.getLatLng()) !== self.getLocationLatLng()) {
      self.reverseGeocode(this.getLatLng())
    }
    self.updateCircleLocation(this.getLatLng(), this.getRadius())
    self.updateMapView()
  })

  this.map.addLayer(this.circle)
  if (centerMarker) {
    centerMarker.addTo(this.map)
    this.circle.redraw()
    centerMarker.update()
  }
}
},

Извините, что это просто шум, но он должен дать вам представление о том, как это сделать. Вы можете управлять редактированием, как вы сказали, с помощью edit.enable()/.disable().

Обязательно комментируйте любые вопросы. Удачи чувак.

person Gowiem    schedule 14.06.2013
comment
Спасибо друг. Очень признателен. - person Sam; 19.07.2013

Хотя решение BaCH, вероятно, является лучшим, я хотел бы добавить однострочный решение, которое на самом деле более ориентировано на будущее (чем копаться в недокументированных методах рисования листовок) и самое простое.

document.querySelector('.leaflet-draw-draw-polygon').click();

Вот и все. Вы просто пользуетесь существованием панели инструментов, но на самом деле вы ее не используете. Вы можете инициировать рисование программно любым способом. И вы также можете скрыть панель инструментов с помощью CSS.

Если вы хотите инициировать рисование другой формы, используйте один из следующих классов:

.leaflet-draw-draw-polyline
.leaflet-draw-draw-rectangle
.leaflet-draw-draw-circle
.leaflet-draw-draw-marker
.leaflet-draw-draw-circlemarker
person treecon    schedule 16.01.2021