Отображение Leaflet.draw: как запустить функцию рисования без панели инструментов?
Для тех, кто имеет опыт работы с плакатом буклета или плаката .draw:
Я хочу инициировать рисование многоугольника без использования панели инструментов с leaflet.draw
. Мне удалось найти свойство, которое позволяет редактировать без использования панели инструментов (layer.editing.enable();
) путем поиска в Интернете (это не в основной документации). Кажется, я не могу найти, как начать рисовать многоугольник без кнопки панели инструментов. Любая помощь будет высоко оценена!
Спасибо:)
Ответы
Ответ 1
Этот простой код работает для меня:
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
})
Я надеюсь, что это тоже будет полезно для вас.
EDIT:
Классы L.EditToolbar.Edit
и L.EditToolbar.Delete
предоставляют следующие полезные методы:
- enable(): запуск режима редактирования/удаления
- disable(): возврат в стандартный режим
- save(): для сохранения изменений (он запускает ничью: отредактировал/отрисовал: удаленные события)
- revertLayers(): для отмены изменений
Ответ 2
Итак, я понял это для кругов, но для полигонов он должен быть одинаковым. Это на самом деле очень просто. Надеюсь, следующий код ответит на ваш вопрос, но если не дайте мне знать, и я могу опубликовать его более подробно.
// Creates the circle on the map for the given latLng and Radius
// If the createdWithAddress flag is true, the circle will not update
// it 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().
Обязательно прокомментируйте любые вопросы. Удачи чувак.
Ответ 3
Я думаю, что стоит упомянуть ответ Джейкоба Тойеса на эту проблему. Вы всегда рисуете с помощью обработчиков в 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();
});
К настоящему времени на странице leaflet.draw github действительно есть пример: https://github.com/Leaflet/Leaflet.draw/blob/master/examples/edithandlers.html
Тем не менее, я считаю, что обработчики пока еще не документированы.
Как указано выше, L.EditToolbar.Edit
и L.EditToolbar.Delete
выставляют интересные методы и события, такие как editstart и editstop. Что не упомянуто, так это то, что эти два класса являются производными от L.Handler
.