I'm a beginner in Leaflet JS
and I have a polygon drawn on the map:
var coords= [
[27.40839959582344,-82.40601726602196],
[27.40859871554781,-82.40638191331237],
[27.40834938302612,-82.40652231229888]
];
L.polygon(coords, { fillColor: 'blue', fillOpacity: 0.5, weight: 75 / Math.pow(2, 19 - map.getZoom()), color: 'red', opacity: 0.5, fill: true}).addTo(map);
and I'm changing the border weight every time I change the zoom level, to keep it to about 20 meters
map.on('zoomend', function (e) {
map.eachLayer(function (layer) {
layer.setStyle({ weight: map.getZoom() > 16 ? (75 / Math.pow(2, 19 - map.getZoom())) : 15 });
layer.bringToFront();
});
}
What is best to use in order to increase the outer part of the border, from 10 m to 15 m but to keep the inside part (that overlaps the fill color) the same size of 10? Can it work with drawControl
when editing and deleting the polygon?
In the image the polygon filling is red and the border(stroke) blue. Half of the border is overlapping the filling (becoming a purplish color). That is the inner part of the polygon stroke that should remain in place/the same size. The other half (that has the default blue color – drawn on the outside) is the one that should increase in size to the zone marked with the pen. I need to increase the width only for half of the stroke
Best Answer
Since border dimensions are in map units, obvious candidate for custom border creation is turf.js library.
Basic principle to create polygon with custom inner and outer border, where each part of polygon (inner border, outer border, interior) has it's own style, would be:
turf.buffer
method, then create difference between buffer and polygon withturf.difference
method. Resulting polygon is outer border.turf.buffer
method, then create difference between polygon and bufferturf.difference
method. Resulting polygon is inner border. If negative buffer polygon is empty, whole polygon gets role of inner border.Polygon with custom border is then feature group consisting of those three polygons.
Up till here things are relatively simple, but if requirement is that such polygon can be created, edited and deleted via leaflet.draw plugin, things become quite complicated.
Code below is proof of concept that it can be done:
Below is an example of direct polygon creation:
Result looks like this:
Here is working JSFiddle: https://jsfiddle.net/TomazicM/p3hnk0tu/