leaflet-draw
Advanced tools
Comparing version 0.4.1 to 0.4.2
{ | ||
"name": "leaflet-draw", | ||
"description": "Vector drawing plugin for Leaflet", | ||
"version": "0.4.1", | ||
"version": "0.4.2", | ||
"main": [ | ||
@@ -54,3 +54,3 @@ "dist/leaflet.draw-src.js", | ||
"devDependencies": { | ||
"jshint": "~2.9.3", | ||
"eslint": "~3.5.0", | ||
"uglify-js": "~2.7.3", | ||
@@ -57,0 +57,0 @@ "jake": "~8.0.15", |
@@ -32,3 +32,3 @@ # How to upgrade from 0.3 to 0.4 | ||
```js | ||
map.on('draw:created', function (e) { | ||
map.on(L.Draw.Event.CREATED, function (e) { | ||
var type = e.layerType, | ||
@@ -35,0 +35,0 @@ layer = e.layer; |
var fs = require('fs'), | ||
jshint = require('jshint'), | ||
UglifyJS = require('uglify-js'), | ||
zlib = require('zlib'), | ||
UglifyJS = require('uglify-js'), | ||
zlib = require('zlib'), | ||
SourceNode = require( 'source-map' ).SourceNode; | ||
deps = require('./deps.js').deps; | ||
deps = require('./deps.js').deps; | ||
function getFiles(compsBase32) { | ||
var memo = {}, | ||
comps; | ||
var memo = {}, | ||
comps; | ||
if (compsBase32) { | ||
comps = parseInt(compsBase32, 32).toString(2).split(''); | ||
console.log('Managing dependencies...'); | ||
} | ||
if (compsBase32) { | ||
comps = parseInt(compsBase32, 32).toString(2).split(''); | ||
console.log('Managing dependencies...'); | ||
} | ||
function addFiles(srcs) { | ||
for (var j = 0, len = srcs.length; j < len; j++) { | ||
memo[srcs[j]] = true; | ||
} | ||
} | ||
function addFiles(srcs) { | ||
for (var j = 0, len = srcs.length; j < len; j++) { | ||
memo[srcs[j]] = true; | ||
} | ||
} | ||
for (var i in deps) { | ||
if (comps) { | ||
if (parseInt(comps.pop(), 2) === 1) { | ||
console.log(' * ' + i); | ||
addFiles(deps[i].src); | ||
} else { | ||
console.log(' ' + i); | ||
} | ||
} else { | ||
addFiles(deps[i].src); | ||
} | ||
} | ||
for (var i in deps) { | ||
if (comps) { | ||
if (parseInt(comps.pop(), 2) === 1) { | ||
console.log(' * ' + i); | ||
addFiles(deps[i].src); | ||
} else { | ||
console.log(' ' + i); | ||
} | ||
} else { | ||
addFiles(deps[i].src); | ||
} | ||
} | ||
console.log(''); | ||
console.log(''); | ||
var files = []; | ||
var files = []; | ||
for (var src in memo) { | ||
files.push('src/' + src); | ||
} | ||
for (var src in memo) { | ||
files.push('src/' + src); | ||
} | ||
return files; | ||
return files; | ||
} | ||
@@ -50,139 +50,189 @@ | ||
function getSizeDelta(newContent, oldContent, fixCRLF) { | ||
if (!oldContent) { | ||
return ' (new)'; | ||
} | ||
if (newContent === oldContent) { | ||
return ' (unchanged)'; | ||
} | ||
if (fixCRLF) { | ||
newContent = newContent.replace(/\r\n?/g, '\n'); | ||
oldContent = oldContent.replace(/\r\n?/g, '\n'); | ||
} | ||
var delta = newContent.length - oldContent.length; | ||
if (!oldContent) { | ||
return ' (new)'; | ||
} | ||
if (newContent === oldContent) { | ||
return ' (unchanged)'; | ||
} | ||
if (fixCRLF) { | ||
newContent = newContent.replace(/\r\n?/g, '\n'); | ||
oldContent = oldContent.replace(/\r\n?/g, '\n'); | ||
} | ||
var delta = newContent.length - oldContent.length; | ||
return delta === 0 ? '' : ' (' + (delta > 0 ? '+' : '') + delta + ' bytes)'; | ||
return delta === 0 ? '' : ' (' + (delta > 0 ? '+' : '') + delta + ' bytes)'; | ||
} | ||
function loadSilently(path) { | ||
try { | ||
return fs.readFileSync(path, 'utf8'); | ||
} catch (e) { | ||
return null; | ||
} | ||
try { | ||
return fs.readFileSync(path, 'utf8'); | ||
} catch (e) { | ||
return null; | ||
} | ||
} | ||
function combineFiles(files) { | ||
var content = ''; | ||
for (var i = 0, len = files.length; i < len; i++) { | ||
content += fs.readFileSync(files[i], 'utf8') + '\n\n'; | ||
} | ||
return content; | ||
// Concatenate the files while building up a sourcemap for the concatenation, | ||
// and replace the line defining L.version with the string prepared in the jakefile | ||
function bundleFiles(files, copy, version) { | ||
var node = new SourceNode(null, null, null, ''); | ||
node.add(new SourceNode(null, null, null, copy + '(function (window, document, undefined) {')); | ||
for (var i = 0, len = files.length; i < len; i++) { | ||
var contents = fs.readFileSync(files[i], 'utf8'); | ||
if (files[i] === 'src/Leaflet.draw.js') { | ||
contents = contents.replace( | ||
new RegExp('drawVersion = \'.*\''), | ||
'drawVersion = ' + JSON.stringify(version) | ||
); | ||
} | ||
var lines = contents.split('\n'); | ||
var lineCount = lines.length; | ||
var fileNode = new SourceNode(null, null, null, ''); | ||
fileNode.setSourceContent(files[i], contents); | ||
for (var j=0; j<lineCount; j++) { | ||
fileNode.add(new SourceNode(j+1, 0, files[i], lines[j] + '\n')); | ||
} | ||
node.add(fileNode); | ||
node.add(new SourceNode(null, null, null, '\n\n')); | ||
} | ||
node.add(new SourceNode(null, null, null, '}(window, document));')); | ||
var bundle = node.toStringWithSourceMap(); | ||
return { | ||
src: bundle.code, | ||
srcmap: bundle.map.toString() | ||
}; | ||
} | ||
function bytesToKB(bytes) { | ||
return (bytes / 1024).toFixed(2) + ' KB'; | ||
} | ||
return (bytes / 1024).toFixed(2) + ' KB'; | ||
}; | ||
exports.build = function (callback, compsBase32, buildName) { | ||
var files = getFiles(compsBase32); | ||
exports.build = function (callback, version, compsBase32, buildName) { | ||
console.log('Concatenating and compressing ' + files.length + ' files...'); | ||
var files = getFiles(compsBase32); | ||
var copy = fs.readFileSync('src/copyright.js', 'utf8'), | ||
intro = '(function (window, document, undefined) {', | ||
outro = '}(window, document));', | ||
newSrc = copy + intro + combineFiles(files) + outro, | ||
console.log('Bundling and compressing ' + files.length + ' files...'); | ||
pathPart = 'dist/leaflet.draw' + (buildName ? '-' + buildName : ''), | ||
srcPath = pathPart + '-src.js', | ||
var copy = fs.readFileSync('src/copyright.js', 'utf8').replace('{VERSION}', version), | ||
oldSrc = loadSilently(srcPath), | ||
srcDelta = getSizeDelta(newSrc, oldSrc, true); | ||
filenamePart = 'leaflet.draw' + (buildName ? '-' + buildName : ''), | ||
pathPart = 'dist/' + filenamePart, | ||
srcPath = pathPart + '-src.js', | ||
mapPath = pathPart + '-src.map', | ||
srcFilename = filenamePart + '-src.js', | ||
mapFilename = filenamePart + '-src.map', | ||
console.log('\tUncompressed: ' + bytesToKB(newSrc.length) + srcDelta); | ||
bundle = bundleFiles(files, copy, version), | ||
newSrc = bundle.src + '\n//# sourceMappingURL=' + mapFilename, | ||
if (newSrc !== oldSrc) { | ||
fs.writeFileSync(srcPath, newSrc); | ||
console.log('\tSaved to ' + srcPath); | ||
} | ||
oldSrc = loadSilently(srcPath), | ||
srcDelta = getSizeDelta(newSrc, oldSrc, true); | ||
var path = pathPart + '.js', | ||
oldCompressed = loadSilently(path), | ||
newCompressed = copy + UglifyJS.minify(newSrc, { | ||
warnings: true, | ||
fromString: true | ||
}).code, | ||
delta = getSizeDelta(newCompressed, oldCompressed); | ||
console.log('\tUncompressed: ' + bytesToKB(newSrc.length) + srcDelta); | ||
console.log('\tCompressed: ' + bytesToKB(newCompressed.length) + delta); | ||
if (newSrc !== oldSrc) { | ||
fs.writeFileSync(srcPath, newSrc); | ||
fs.writeFileSync(mapPath, bundle.srcmap); | ||
console.log('\tSaved to ' + srcPath); | ||
} | ||
var newGzipped, | ||
gzippedDelta = ''; | ||
var path = pathPart + '.js', | ||
oldCompressed = loadSilently(path), | ||
newCompressed; | ||
function done() { | ||
if (newCompressed !== oldCompressed) { | ||
fs.writeFileSync(path, newCompressed); | ||
console.log('\tSaved to ' + path); | ||
} | ||
console.log('\tGzipped: ' + bytesToKB(newGzipped.length) + gzippedDelta); | ||
callback(); | ||
} | ||
try { | ||
newCompressed = copy + UglifyJS.minify(newSrc, { | ||
warnings: true, | ||
fromString: true | ||
}).code; | ||
} catch(err) { | ||
console.error('UglifyJS failed to minify the files'); | ||
console.error(err); | ||
callback(err); | ||
} | ||
zlib.gzip(newCompressed, function (err, gzipped) { | ||
if (err) { return; } | ||
newGzipped = gzipped; | ||
if (oldCompressed && (oldCompressed !== newCompressed)) { | ||
zlib.gzip(oldCompressed, function (err, oldGzipped) { | ||
if (err) { return; } | ||
gzippedDelta = getSizeDelta(gzipped, oldGzipped); | ||
done(); | ||
}); | ||
} else { | ||
done(); | ||
} | ||
}); | ||
var delta = getSizeDelta(newCompressed, oldCompressed); | ||
console.log('\tCompressed: ' + bytesToKB(newCompressed.length) + delta); | ||
var newGzipped, | ||
gzippedDelta = ''; | ||
function done() { | ||
if (newCompressed !== oldCompressed) { | ||
fs.writeFileSync(path, newCompressed); | ||
console.log('\tSaved to ' + path); | ||
} | ||
console.log('\tGzipped: ' + bytesToKB(newGzipped.length) + gzippedDelta); | ||
callback(); | ||
} | ||
zlib.gzip(newCompressed, function (err, gzipped) { | ||
if (err) { return; } | ||
newGzipped = gzipped; | ||
if (oldCompressed && (oldCompressed !== newCompressed)) { | ||
zlib.gzip(oldCompressed, function (err, oldGzipped) { | ||
if (err) { return; } | ||
gzippedDelta = getSizeDelta(gzipped, oldGzipped); | ||
done(); | ||
}); | ||
} else { | ||
done(); | ||
} | ||
}); | ||
}; | ||
exports.test = function(callback) { | ||
var karma = require('karma'), | ||
testConfig = {configFile : __dirname + '/../spec/karma.conf.js'}; | ||
exports.test = function(complete, fail) { | ||
var karma = require('karma'), | ||
testConfig = {configFile : __dirname + '/../spec/karma.conf.js'}; | ||
testConfig.browsers = ['PhantomJS']; | ||
testConfig.browsers = ['PhantomJSCustom']; | ||
function isArgv(optName) { | ||
return process.argv.indexOf(optName) !== -1; | ||
} | ||
function isArgv(optName) { | ||
return process.argv.indexOf(optName) !== -1; | ||
} | ||
if (isArgv('--chrome')) { | ||
testConfig.browsers.push('Chrome'); | ||
} | ||
if (isArgv('--safari')) { | ||
testConfig.browsers.push('Safari'); | ||
} | ||
if (isArgv('--ff')) { | ||
testConfig.browsers.push('Firefox'); | ||
} | ||
if (isArgv('--ie')) { | ||
testConfig.browsers.push('IE'); | ||
} | ||
if (isArgv('--chrome')) { | ||
testConfig.browsers.push('Chrome'); | ||
} | ||
if (isArgv('--safari')) { | ||
testConfig.browsers.push('Safari'); | ||
} | ||
if (isArgv('--ff')) { | ||
testConfig.browsers.push('Firefox'); | ||
} | ||
if (isArgv('--ie')) { | ||
testConfig.browsers.push('IE'); | ||
} | ||
if (isArgv('--cov')) { | ||
testConfig.preprocessors = { | ||
'src/**/*.js': 'coverage' | ||
}; | ||
testConfig.coverageReporter = { | ||
type : 'html', | ||
dir : 'coverage/' | ||
}; | ||
testConfig.reporters = ['coverage']; | ||
} | ||
if (isArgv('--cov')) { | ||
testConfig.preprocessors = { | ||
'src/**/*.js': 'coverage' | ||
}; | ||
testConfig.coverageReporter = { | ||
type : 'html', | ||
dir : 'coverage/' | ||
}; | ||
testConfig.reporters = ['coverage']; | ||
} | ||
console.log('Running tests...'); | ||
console.log('Running tests...'); | ||
karma.server.start(testConfig, function(exitCode) { | ||
if (!exitCode) { | ||
console.log('\tTests ran successfully.\n'); | ||
} | ||
callback(); | ||
}); | ||
}; | ||
var server = new karma.Server(testConfig, function(exitCode) { | ||
if (!exitCode) { | ||
console.log('\tTests ran successfully.\n'); | ||
complete(); | ||
} else { | ||
process.exit(exitCode); | ||
} | ||
}); | ||
server.start(); | ||
}; |
var deps = { | ||
Core: { | ||
src: [ | ||
'Leaflet.draw.js' | ||
'Leaflet.draw.js', | ||
'Leaflet.Draw.Event.js' | ||
], | ||
@@ -6,0 +7,0 @@ desc: 'The core of the plugin. Currently only includes the version.' |
@@ -8,2 +8,21 @@ Leaflet.draw Changelog | ||
## 0.4.2 (November 7, 2016) | ||
### Improvements | ||
* Documentation is now automatically generated | ||
* L.Draw.Event is new, has all events in string format | ||
### Bugfixes | ||
* Travis tests | ||
## 0.4.1 (October 21, 2016) | ||
### Bugfixes | ||
* fix markers becomming invisible when in edit mode | ||
* Fix linking for EditPolyOptions | ||
* Fixes very minor issue in readme with invalid variable name | ||
## 0.4.0 (October 13, 2016) | ||
@@ -10,0 +29,0 @@ |
/* | ||
Leaflet.draw, a plugin that adds drawing and editing tools to Leaflet powered maps. | ||
(c) 2012-2016, Jacob Toye, Smartrak, Leaflet | ||
Leaflet.draw 0.4.2, a plugin that adds drawing and editing tools to Leaflet powered maps. | ||
(c) 2012-2017, Jacob Toye, Jon West, Smartrak, Leaflet | ||
https://github.com/Leaflet/Leaflet.draw | ||
http://leafletjs.com | ||
*/ | ||
!function(t,e,i){L.drawVersion="0.4.0",L.drawLocal={draw:{toolbar:{actions:{title:"Cancel drawing",text:"Cancel"},finish:{title:"Finish drawing",text:"Finish"},undo:{title:"Delete last point drawn",text:"Delete last point"},buttons:{polyline:"Draw a polyline",polygon:"Draw a polygon",rectangle:"Draw a rectangle",circle:"Draw a circle",marker:"Draw a marker"}},handlers:{circle:{tooltip:{start:"Click and drag to draw circle."},radius:"Radius"},marker:{tooltip:{start:"Click map to place marker."}},polygon:{tooltip:{start:"Click to start drawing shape.",cont:"Click to continue drawing shape.",end:"Click first point to close this shape."}},polyline:{error:"<strong>Error:</strong> shape edges cannot cross!",tooltip:{start:"Click to start drawing line.",cont:"Click to continue drawing line.",end:"Click last point to finish line."}},rectangle:{tooltip:{start:"Click and drag to draw rectangle."}},simpleshape:{tooltip:{end:"Release mouse to finish drawing."}}}},edit:{toolbar:{actions:{save:{title:"Save changes.",text:"Save"},cancel:{title:"Cancel editing, discards all changes.",text:"Cancel"}},buttons:{edit:"Edit layers.",editDisabled:"No layers to edit.",remove:"Delete layers.",removeDisabled:"No layers to delete."}},handlers:{edit:{tooltip:{text:"Drag handles, or marker to edit feature.",subtext:"Click cancel to undo changes."}},remove:{tooltip:{text:"Click on a feature to remove"}}}}},L.Draw=L.Draw||{},L.Draw.Feature=L.Handler.extend({includes:L.Mixin.Events,initialize:function(t,e){this._map=t,this._container=t._container,this._overlayPane=t._panes.overlayPane,this._popupPane=t._panes.popupPane,e&&e.shapeOptions&&(e.shapeOptions=L.Util.extend({},this.options.shapeOptions,e.shapeOptions)),L.setOptions(this,e)},enable:function(){this._enabled||(L.Handler.prototype.enable.call(this),this.fire("enabled",{handler:this.type}),this._map.fire("draw:drawstart",{layerType:this.type}))},disable:function(){this._enabled&&(L.Handler.prototype.disable.call(this),this._map.fire("draw:drawstop",{layerType:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(L.DomUtil.disableTextSelection(),t.getContainer().focus(),this._tooltip=new L.Draw.Tooltip(this._map),L.DomEvent.on(this._container,"keyup",this._cancelDrawing,this))},removeHooks:function(){this._map&&(L.DomUtil.enableTextSelection(),this._tooltip.dispose(),this._tooltip=null,L.DomEvent.off(this._container,"keyup",this._cancelDrawing,this))},setOptions:function(t){L.setOptions(this,t)},_fireCreatedEvent:function(t){this._map.fire("draw:created",{layer:t,layerType:this.type})},_cancelDrawing:function(t){this._map.fire("draw:canceled",{layerType:this.type}),27===t.keyCode&&this.disable()}}),L.Draw.Polyline=L.Draw.Feature.extend({statics:{TYPE:"polyline"},Poly:L.Polyline,options:{allowIntersection:!0,repeatMode:!1,drawError:{color:"#b00b00",timeout:2500},icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),guidelineDistance:20,maxGuideLineLength:4e3,shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!1,clickable:!0},metric:!0,feet:!0,showLength:!0,zIndexOffset:2e3},initialize:function(t,e){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this.options.drawError.message=L.drawLocal.draw.handlers.polyline.error,e&&e.drawError&&(e.drawError=L.Util.extend({},this.options.drawError,e.drawError)),this.type=L.Draw.Polyline.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._markers=[],this._markerGroup=new L.LayerGroup,this._map.addLayer(this._markerGroup),this._poly=new L.Polyline([],this.options.shapeOptions),this._tooltip.updateContent(this._getTooltipText()),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),L.Browser.touch||this._map.on("mouseup",this._onMouseUp,this),this._mouseMarker.on("mousedown",this._onMouseDown,this).on("mouseout",this._onMouseOut,this).on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).addTo(this._map),this._map.on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).on("zoomlevelschange",this._onZoomEnd,this).on("click",this._onTouch,this).on("zoomend",this._onZoomEnd,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._clearHideErrorTimeout(),this._cleanUpShape(),this._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers,this._map.removeLayer(this._poly),delete this._poly,this._mouseMarker.off("mousedown",this._onMouseDown,this).off("mouseout",this._onMouseOut,this).off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._clearGuides(),this._map.off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this).off("zoomlevelschange",this._onZoomEnd,this).off("zoomend",this._onZoomEnd,this).off("click",this._onTouch,this)},deleteLastVertex:function(){if(!(this._markers.length<=1)){var t=this._markers.pop(),e=this._poly,i=e.getLatLngs(),o=i.splice(-1,1)[0];this._poly.setLatLngs(i),this._markerGroup.removeLayer(t),e.getLatLngs().length<2&&this._map.removeLayer(e),this._vertexChanged(o,!1)}},addVertex:function(t){var e=this._markers.length;return e>0&&!this.options.allowIntersection&&this._poly.newLatLngIntersects(t)?void this._showErrorTooltip():(this._errorShown&&this._hideErrorTooltip(),this._markers.push(this._createMarker(t)),this._poly.addLatLng(t),2===this._poly.getLatLngs().length&&this._map.addLayer(this._poly),void this._vertexChanged(t,!0))},completeShape:function(){this._markers.length<=1||(this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable())},_finishShape:function(){var t=this._poly._defaultShape?this._poly._defaultShape():this._poly.getLatLngs(),e=this._poly.newLatLngIntersects(t[t.length-1]);return!this.options.allowIntersection&&e||!this._shapeIsValid()?void this._showErrorTooltip():(this._fireCreatedEvent(),this.disable(),void(this.options.repeatMode&&this.enable()))},_shapeIsValid:function(){return!0},_onZoomEnd:function(){null!==this._markers&&this._updateGuide()},_onMouseMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent),i=this._map.layerPointToLatLng(e);this._currentLatLng=i,this._updateTooltip(i),this._updateGuide(e),this._mouseMarker.setLatLng(i),L.DomEvent.preventDefault(t.originalEvent)},_vertexChanged:function(t,e){this._map.fire("draw:drawvertex",{layers:this._markerGroup}),this._updateFinishHandler(),this._updateRunningMeasure(t,e),this._clearGuides(),this._updateTooltip()},_onMouseDown:function(t){var e=t.originalEvent;this._mouseDownOrigin=L.point(e.clientX,e.clientY)},_onMouseUp:function(e){if(this._mouseDownOrigin){var i=L.point(e.originalEvent.clientX,e.originalEvent.clientY).distanceTo(this._mouseDownOrigin);Math.abs(i)<9*(t.devicePixelRatio||1)&&this.addVertex(e.latlng)}this._mouseDownOrigin=null},_onTouch:function(t){L.Browser.touch&&(this._onMouseDown(t),this._onMouseUp(t))},_onMouseOut:function(){this._tooltip&&this._tooltip._onMouseOut.call(this._tooltip)},_updateFinishHandler:function(){var t=this._markers.length;t>1&&this._markers[t-1].on("click",this._finishShape,this),t>2&&this._markers[t-2].off("click",this._finishShape,this)},_createMarker:function(t){var e=new L.Marker(t,{icon:this.options.icon,zIndexOffset:2*this.options.zIndexOffset});return this._markerGroup.addLayer(e),e},_updateGuide:function(t){var e=this._markers?this._markers.length:0;e>0&&(t=t||this._map.latLngToLayerPoint(this._currentLatLng),this._clearGuides(),this._drawGuide(this._map.latLngToLayerPoint(this._markers[e-1].getLatLng()),t))},_updateTooltip:function(t){var e=this._getTooltipText();t&&this._tooltip.updatePosition(t),this._errorShown||this._tooltip.updateContent(e)},_drawGuide:function(t,e){var i,o,n,s=Math.floor(Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))),a=this.options.guidelineDistance,r=this.options.maxGuideLineLength,h=s>r?s-r:a;for(this._guidesContainer||(this._guidesContainer=L.DomUtil.create("div","leaflet-draw-guides",this._overlayPane));h<s;h+=this.options.guidelineDistance)i=h/s,o={x:Math.floor(t.x*(1-i)+i*e.x),y:Math.floor(t.y*(1-i)+i*e.y)},n=L.DomUtil.create("div","leaflet-draw-guide-dash",this._guidesContainer),n.style.backgroundColor=this._errorShown?this.options.drawError.color:this.options.shapeOptions.color,L.DomUtil.setPosition(n,o)},_updateGuideColor:function(t){if(this._guidesContainer)for(var e=0,i=this._guidesContainer.childNodes.length;e<i;e++)this._guidesContainer.childNodes[e].style.backgroundColor=t},_clearGuides:function(){if(this._guidesContainer)for(;this._guidesContainer.firstChild;)this._guidesContainer.removeChild(this._guidesContainer.firstChild)},_getTooltipText:function(){var t,e,i=this.options.showLength;return 0===this._markers.length?t={text:L.drawLocal.draw.handlers.polyline.tooltip.start}:(e=i?this._getMeasurementString():"",t=1===this._markers.length?{text:L.drawLocal.draw.handlers.polyline.tooltip.cont,subtext:e}:{text:L.drawLocal.draw.handlers.polyline.tooltip.end,subtext:e}),t},_updateRunningMeasure:function(t,e){var i,o,n=this._markers.length;1===this._markers.length?this._measurementRunningTotal=0:(i=n-(e?2:1),o=t.distanceTo(this._markers[i].getLatLng()),this._measurementRunningTotal+=o*(e?1:-1))},_getMeasurementString:function(){var t,e=this._currentLatLng,i=this._markers[this._markers.length-1].getLatLng();return t=this._measurementRunningTotal+e.distanceTo(i),L.GeometryUtil.readableDistance(t,this.options.metric,this.options.feet)},_showErrorTooltip:function(){this._errorShown=!0,this._tooltip.showAsError().updateContent({text:this.options.drawError.message}),this._updateGuideColor(this.options.drawError.color),this._poly.setStyle({color:this.options.drawError.color}),this._clearHideErrorTimeout(),this._hideErrorTimeout=setTimeout(L.Util.bind(this._hideErrorTooltip,this),this.options.drawError.timeout)},_hideErrorTooltip:function(){this._errorShown=!1,this._clearHideErrorTimeout(),this._tooltip.removeError().updateContent(this._getTooltipText()),this._updateGuideColor(this.options.shapeOptions.color),this._poly.setStyle({color:this.options.shapeOptions.color})},_clearHideErrorTimeout:function(){this._hideErrorTimeout&&(clearTimeout(this._hideErrorTimeout),this._hideErrorTimeout=null)},_cleanUpShape:function(){this._markers.length>1&&this._markers[this._markers.length-1].off("click",this._finishShape,this)},_fireCreatedEvent:function(){var t=new this.Poly(this._poly.getLatLngs(),this.options.shapeOptions);L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Draw.Polygon=L.Draw.Polyline.extend({statics:{TYPE:"polygon"},Poly:L.Polygon,options:{showArea:!1,shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},metric:!0},initialize:function(t,e){L.Draw.Polyline.prototype.initialize.call(this,t,e),this.type=L.Draw.Polygon.TYPE},_updateFinishHandler:function(){var t=this._markers.length;1===t&&this._markers[0].on("click",this._finishShape,this),t>2&&(this._markers[t-1].on("dblclick",this._finishShape,this),t>3&&this._markers[t-2].off("dblclick",this._finishShape,this))},_getTooltipText:function(){var t,e;return 0===this._markers.length?t=L.drawLocal.draw.handlers.polygon.tooltip.start:this._markers.length<3?t=L.drawLocal.draw.handlers.polygon.tooltip.cont:(t=L.drawLocal.draw.handlers.polygon.tooltip.end,e=this._getMeasurementString()),{text:t,subtext:e}},_getMeasurementString:function(){var t=this._area;return t?L.GeometryUtil.readableArea(t,this.options.metric):null},_shapeIsValid:function(){return this._markers.length>=3},_vertexChanged:function(t,e){var i;!this.options.allowIntersection&&this.options.showArea&&(i=this._poly.getLatLngs(),this._area=L.GeometryUtil.geodesicArea(i)),L.Draw.Polyline.prototype._vertexChanged.call(this,t,e)},_cleanUpShape:function(){var t=this._markers.length;t>0&&(this._markers[0].off("click",this._finishShape,this),t>2&&this._markers[t-1].off("dblclick",this._finishShape,this))}}),L.SimpleShape={},L.Draw.SimpleShape=L.Draw.Feature.extend({options:{repeatMode:!1},initialize:function(t,e){this._endLabelText=L.drawLocal.draw.handlers.simpleshape.tooltip.end,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._mapDraggable=this._map.dragging.enabled(),this._mapDraggable&&this._map.dragging.disable(),this._container.style.cursor="crosshair",this._tooltip.updateContent({text:this._initialLabelText}),this._map.on("mousedown",this._onMouseDown,this).on("mousemove",this._onMouseMove,this).on("touchstart",this._onMouseDown,this).on("touchmove",this._onMouseMove,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._mapDraggable&&this._map.dragging.enable(),this._container.style.cursor="",this._map.off("mousedown",this._onMouseDown,this).off("mousemove",this._onMouseMove,this).off("touchstart",this._onMouseDown,this).off("touchmove",this._onMouseMove,this),L.DomEvent.off(e,"mouseup",this._onMouseUp,this),L.DomEvent.off(e,"touchend",this._onMouseUp,this),this._shape&&(this._map.removeLayer(this._shape),delete this._shape)),this._isDrawing=!1},_getTooltipText:function(){return{text:this._endLabelText}},_onMouseDown:function(t){this._isDrawing=!0,this._startLatLng=t.latlng,L.DomEvent.on(e,"mouseup",this._onMouseUp,this).on(e,"touchend",this._onMouseUp,this).preventDefault(t.originalEvent)},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._isDrawing&&(this._tooltip.updateContent(this._getTooltipText()),this._drawShape(e))},_onMouseUp:function(){this._shape&&this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()}}),L.Draw.Rectangle=L.Draw.SimpleShape.extend({statics:{TYPE:"rectangle"},options:{shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},metric:!0},initialize:function(t,e){this.type=L.Draw.Rectangle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.rectangle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},_drawShape:function(t){this._shape?this._shape.setBounds(new L.LatLngBounds(this._startLatLng,t)):(this._shape=new L.Rectangle(new L.LatLngBounds(this._startLatLng,t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Rectangle(this._shape.getBounds(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_getTooltipText:function(){var t,e,i,o=L.Draw.SimpleShape.prototype._getTooltipText.call(this),n=this._shape;return n&&(t=this._shape._defaultShape?this._shape._defaultShape():this._shape.getLatLngs(),e=L.GeometryUtil.geodesicArea(t),i=L.GeometryUtil.readableArea(e,this.options.metric)),{text:o.text,subtext:i}}}),L.Draw.Circle=L.Draw.SimpleShape.extend({statics:{TYPE:"circle"},options:{shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},showRadius:!0,metric:!0,feet:!0},initialize:function(t,e){this.type=L.Draw.Circle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.circle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},_drawShape:function(t){this._shape?this._shape.setRadius(this._startLatLng.distanceTo(t)):(this._shape=new L.Circle(this._startLatLng,this._startLatLng.distanceTo(t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Circle(this._startLatLng,this._shape.getRadius(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_onMouseMove:function(t){var e,i=t.latlng,o=this.options.showRadius,n=this.options.metric;this._tooltip.updatePosition(i),this._isDrawing&&(this._drawShape(i),e=this._shape.getRadius().toFixed(1),this._tooltip.updateContent({text:this._endLabelText,subtext:o?L.drawLocal.draw.handlers.circle.radius+": "+L.GeometryUtil.readableDistance(e,n,this.options.feet):""}))}}),L.Draw.Marker=L.Draw.Feature.extend({statics:{TYPE:"marker"},options:{icon:new L.Icon.Default,repeatMode:!1,zIndexOffset:2e3},initialize:function(t,e){this.type=L.Draw.Marker.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._tooltip.updateContent({text:L.drawLocal.draw.handlers.marker.tooltip.start}),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("click",this._onClick,this).addTo(this._map),this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onTouch,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._marker&&(this._marker.off("click",this._onClick,this),this._map.off("click",this._onClick,this).off("click",this._onTouch,this).removeLayer(this._marker),delete this._marker),this._mouseMarker.off("click",this._onClick,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._map.off("mousemove",this._onMouseMove,this))},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._mouseMarker.setLatLng(e),this._marker?(e=this._mouseMarker.getLatLng(),this._marker.setLatLng(e)):(this._marker=new L.Marker(e,{icon:this.options.icon,zIndexOffset:this.options.zIndexOffset}),this._marker.on("click",this._onClick,this),this._map.on("click",this._onClick,this).addLayer(this._marker))},_onClick:function(){this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()},_onTouch:function(t){this._onMouseMove(t),this._onClick()},_fireCreatedEvent:function(){var t=new L.Marker.Touch(this._marker.getLatLng(),{icon:this.options.icon});L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Edit=L.Edit||{},L.Edit.Marker=L.Handler.extend({initialize:function(t,e){this._marker=t,L.setOptions(this,e)},addHooks:function(){var t=this._marker;t.dragging.enable(),t.on("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},removeHooks:function(){var t=this._marker;t.dragging.disable(),t.off("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},_onDragEnd:function(t){var e=t.target;e.edited=!0,this._map.fire("draw:editmove",{layer:e})},_toggleMarkerHighlight:function(){var t=this._marker._icon;t&&(t.style.display="none",L.DomUtil.hasClass(t,"leaflet-edit-marker-selected")?(L.DomUtil.removeClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,-4)):(L.DomUtil.addClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,4)),t.style.display="")},_offsetMarker:function(t,e){var i=parseInt(t.style.marginTop,10)-e,o=parseInt(t.style.marginLeft,10)-e;t.style.marginTop=i+"px",t.style.marginLeft=o+"px"}}),L.Marker.addInitHook(function(){L.Edit.Marker&&(this.editing=new L.Edit.Marker(this),this.options.editable&&this.editing.enable())}),L.Edit=L.Edit||{},L.Edit.Poly=L.Handler.extend({options:{},initialize:function(t,e){this.latlngs=[t._latlngs],t._holes&&(this.latlngs=this.latlngs.concat(t._holes)),this._poly=t,L.setOptions(this,e),this._poly.on("revert-edited",this._updateLatLngs,this)},_defaultShape:function(){return L.Polyline._flat?L.Polyline._flat(this._poly._latlngs)?this._poly._latlngs:this._poly._latlngs[0]:this._poly._latlngs},_eachVertexHandler:function(t){for(var e=0;e<this._verticesHandlers.length;e++)t(this._verticesHandlers[e])},addHooks:function(){this._initHandlers(),this._eachVertexHandler(function(t){t.addHooks()})},removeHooks:function(){this._eachVertexHandler(function(t){t.removeHooks()})},updateMarkers:function(){this._eachVertexHandler(function(t){t.updateMarkers()})},_initHandlers:function(){this._verticesHandlers=[];for(var t=0;t<this.latlngs.length;t++)this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly,this.latlngs[t],this.options))},_updateLatLngs:function(t){this.latlngs=[t.layer._latlngs],t.layer._holes&&(this.latlngs=this.latlngs.concat(t.layer._holes))}}),L.Edit.PolyVerticesEdit=L.Handler.extend({options:{icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),drawError:{color:"#b00b00",timeout:1e3}},initialize:function(t,e,i){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this._poly=t,i&&i.drawError&&(i.drawError=L.Util.extend({},this.options.drawError,i.drawError)),this._latlngs=e,L.setOptions(this,i)},_defaultShape:function(){return L.Polyline._flat?L.Polyline._flat(this._latlngs)?this._latlngs:this._latlngs[0]:this._latlngs},addHooks:function(){var t=this._poly;t instanceof L.Polygon||(t.options.fill=!1,t.options.editing&&(t.options.editing.fill=!1)),t.setStyle(t.options.editing),this._poly._map&&(this._map=this._poly._map,this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){var t=this._poly;t.setStyle(t.options.original),t._map&&(t._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._markers=[];var t,e,i,o,n=this._defaultShape();for(t=0,i=n.length;t<i;t++)o=this._createMarker(n[t],t),o.on("click",this._onMarkerClick,this),this._markers.push(o);var s,a;for(t=0,e=i-1;t<i;e=t++)(0!==t||L.Polygon&&this._poly instanceof L.Polygon)&&(s=this._markers[e],a=this._markers[t],this._createMiddleMarker(s,a),this._updatePrevNext(s,a))},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._fireEdit,this).on("touchmove",this._onTouchMove,this).on("touchend",this._fireEdit,this).on("MSPointerMove",this._onTouchMove,this).on("MSPointerUp",this._fireEdit,this),this._markerGroup.addLayer(i),i},_onMarkerDragStart:function(){this._poly.fire("editstart")},_spliceLatLngs:function(){var t=this._defaultShape(),e=[].splice.apply(t,arguments);return this._poly._convertLatLngs(t,!0),this._poly.redraw(),e},_removeMarker:function(t){var e=t._index;this._markerGroup.removeLayer(t),this._markers.splice(e,1),this._spliceLatLngs(e,1),this._updateIndexes(e,-1),t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._fireEdit,this).off("touchmove",this._onMarkerDrag,this).off("touchend",this._fireEdit,this).off("click",this._onMarkerClick,this).off("MSPointerMove",this._onTouchMove,this).off("MSPointerUp",this._fireEdit,this)},_fireEdit:function(){this._poly.edited=!0,this._poly.fire("edit"),this._poly._map.fire("draw:editvertex",{layers:this._markerGroup})},_onMarkerDrag:function(t){var e=t.target,i=this._poly;if(L.extend(e._origLatLng,e._latlng),e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),i.options.poly){var o=i._map._editTooltip;if(!i.options.poly.allowIntersection&&i.intersects()){var n=i.options.color;i.setStyle({color:this.options.drawError.color}),0!==L.version.indexOf("0.7")&&e.dragging._draggable._onUp(t),this._onMarkerClick(t),o&&o.updateContent({text:L.drawLocal.draw.handlers.polyline.error}),setTimeout(function(){i.setStyle({color:n}),o&&o.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext})},1e3)}}this._poly.redraw(),this._poly.fire("editdrag")},_onMarkerClick:function(t){var e=L.Polygon&&this._poly instanceof L.Polygon?4:3,i=t.target;this._defaultShape().length<e||(this._removeMarker(i),this._updatePrevNext(i._prev,i._next),i._middleLeft&&this._markerGroup.removeLayer(i._middleLeft),i._middleRight&&this._markerGroup.removeLayer(i._middleRight),i._prev&&i._next?this._createMiddleMarker(i._prev,i._next):i._prev?i._next||(i._prev._middleRight=null):i._next._middleLeft=null,this._fireEdit())},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e),o=t.target;L.extend(o._origLatLng,i),o._middleLeft&&o._middleLeft.setLatLng(this._getMiddleLatLng(o._prev,o)),o._middleRight&&o._middleRight.setLatLng(this._getMiddleLatLng(o,o._next)),this._poly.redraw(),this.updateMarkers()},_updateIndexes:function(t,e){this._markerGroup.eachLayer(function(i){i._index>t&&(i._index+=e)})},_createMiddleMarker:function(t,e){var i,o,n,s=this._getMiddleLatLng(t,e),a=this._createMarker(s);a.setOpacity(.6),t._middleRight=e._middleLeft=a,o=function(){a.off("touchmove",o,this);var n=e._index;a._index=n,a.off("click",i,this).on("click",this._onMarkerClick,this),s.lat=a.getLatLng().lat,s.lng=a.getLatLng().lng,this._spliceLatLngs(n,0,s),this._markers.splice(n,0,a),a.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,a),this._updatePrevNext(a,e),this._poly.fire("editstart")},n=function(){a.off("dragstart",o,this),a.off("dragend",n,this),a.off("touchmove",o,this),this._createMiddleMarker(t,a),this._createMiddleMarker(a,e)},i=function(){o.call(this),n.call(this),this._fireEdit()},a.on("click",i,this).on("dragstart",o,this).on("dragend",n,this).on("touchmove",o,this),this._markerGroup.addLayer(a)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,o=i.project(t.getLatLng()),n=i.project(e.getLatLng());return i.unproject(o._add(n)._divideBy(2))}}),L.Polyline.addInitHook(function(){this.editing||(L.Edit.Poly&&(this.editing=new L.Edit.Poly(this,this.options.poly),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()}))}),L.Edit=L.Edit||{},L.Edit.SimpleShape=L.Handler.extend({options:{moveIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move"}),resizeIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize"}),touchMoveIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon"}),touchResizeIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon"})},initialize:function(t,e){L.Browser.touch&&(this.options.moveIcon=this.options.touchMoveIcon,this.options.resizeIcon=this.options.touchResizeIcon),this._shape=t,L.Util.setOptions(this,e)},addHooks:function(){var t=this._shape;this._shape._map&&(this._map=this._shape._map,t.setStyle(t.options.editing),t._map&&(this._map=t._map,this._markerGroup||this._initMarkers(),this._map.addLayer(this._markerGroup)))},removeHooks:function(){var t=this._shape;if(t.setStyle(t.options.original),t._map){this._unbindMarker(this._moveMarker);for(var e=0,i=this._resizeMarkers.length;e<i;e++)this._unbindMarker(this._resizeMarkers[e]);this._resizeMarkers=null,this._map.removeLayer(this._markerGroup),delete this._markerGroup}this._map=null},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._createMoveMarker(),this._createResizeMarker()},_createMoveMarker:function(){},_createResizeMarker:function(){},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:e,zIndexOffset:10});return this._bindMarker(i),this._markerGroup.addLayer(i),i},_bindMarker:function(t){t.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._onMarkerDragEnd,this).on("touchstart",this._onTouchStart,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onTouchEnd,this).on("MSPointerUp",this._onTouchEnd,this)},_unbindMarker:function(t){t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._onMarkerDragEnd,this).off("touchstart",this._onTouchStart,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onTouchEnd,this).off("MSPointerUp",this._onTouchEnd,this)},_onMarkerDragStart:function(t){var e=t.target;e.setOpacity(0),this._shape.fire("editstart")},_fireEdit:function(){this._shape.edited=!0,this._shape.fire("edit")},_onMarkerDrag:function(t){var e=t.target,i=e.getLatLng();e===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),this._shape.fire("editdrag")},_onMarkerDragEnd:function(t){var e=t.target;e.setOpacity(1),this._fireEdit()},_onTouchStart:function(t){if(L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t),"function"==typeof this._getCorners){var e=this._getCorners(),i=t.target,o=i._cornerIndex;i.setOpacity(0),this._oppositeCorner=e[(o+2)%4],this._toggleCornerMarkers(0,o)}this._shape.fire("editstart")},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e),o=t.target;return o===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),!1},_onTouchEnd:function(t){var e=t.target;e.setOpacity(1),this.updateMarkers(),this._fireEdit()},_move:function(){},_resize:function(){}}),L.Edit=L.Edit||{},L.Edit.Rectangle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getBounds(),e=t.getCenter();this._moveMarker=this._createMarker(e,this.options.moveIcon)},_createResizeMarker:function(){var t=this._getCorners();this._resizeMarkers=[];for(var e=0,i=t.length;e<i;e++)this._resizeMarkers.push(this._createMarker(t[e],this.options.resizeIcon)),this._resizeMarkers[e]._cornerIndex=e},_onMarkerDragStart:function(t){L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t);var e=this._getCorners(),i=t.target,o=i._cornerIndex;this._oppositeCorner=e[(o+2)%4],this._toggleCornerMarkers(0,o)},_onMarkerDragEnd:function(t){var e,i,o=t.target;o===this._moveMarker&&(e=this._shape.getBounds(),i=e.getCenter(),o.setLatLng(i)),this._toggleCornerMarkers(1),this._repositionCornerMarkers(),L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this,t)},_move:function(t){for(var e,i=this._shape._defaultShape?this._shape._defaultShape():this._shape.getLatLngs(),o=this._shape.getBounds(),n=o.getCenter(),s=[],a=0,r=i.length;a<r;a++)e=[i[a].lat-n.lat,i[a].lng-n.lng],s.push([t.lat+e[0],t.lng+e[1]]);this._shape.setLatLngs(s),this._repositionCornerMarkers(),this._map.fire("draw:editmove",{layer:this._shape})},_resize:function(t){var e;this._shape.setBounds(L.latLngBounds(t,this._oppositeCorner)),e=this._shape.getBounds(),this._moveMarker.setLatLng(e.getCenter()),this._map.fire("draw:editresize",{layer:this._shape})},_getCorners:function(){var t=this._shape.getBounds(),e=t.getNorthWest(),i=t.getNorthEast(),o=t.getSouthEast(),n=t.getSouthWest();return[e,i,o,n]},_toggleCornerMarkers:function(t){for(var e=0,i=this._resizeMarkers.length;e<i;e++)this._resizeMarkers[e].setOpacity(t)},_repositionCornerMarkers:function(){for(var t=this._getCorners(),e=0,i=this._resizeMarkers.length;e<i;e++)this._resizeMarkers[e].setLatLng(t[e])}}),L.Rectangle.addInitHook(function(){L.Edit.Rectangle&&(this.editing=new L.Edit.Rectangle(this),this.options.editable&&this.editing.enable())}),L.Edit=L.Edit||{},L.Edit.Circle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getLatLng();this._moveMarker=this._createMarker(t,this.options.moveIcon); | ||
},_createResizeMarker:function(){var t=this._shape.getLatLng(),e=this._getResizeMarkerPoint(t);this._resizeMarkers=[],this._resizeMarkers.push(this._createMarker(e,this.options.resizeIcon))},_getResizeMarkerPoint:function(t){var e=this._shape._radius*Math.cos(Math.PI/4),i=this._map.project(t);return this._map.unproject([i.x+e,i.y-e])},_move:function(t){var e=this._getResizeMarkerPoint(t);this._resizeMarkers[0].setLatLng(e),this._shape.setLatLng(t),this._map.fire("draw:editmove",{layer:this._shape})},_resize:function(t){var e=this._moveMarker.getLatLng(),i=e.distanceTo(t);this._shape.setRadius(i),this._map.fire("draw:editresize",{layer:this._shape})}}),L.Circle.addInitHook(function(){L.Edit.Circle&&(this.editing=new L.Edit.Circle(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})}),L.Map.mergeOptions({touchExtend:!0}),L.Map.TouchExtend=L.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){L.DomEvent.on(this._container,"touchstart",this._onTouchStart,this),L.DomEvent.on(this._container,"touchend",this._onTouchEnd,this),L.DomEvent.on(this._container,"touchmove",this._onTouchMove,this),this._detectIE()?(L.DomEvent.on(this._container,"MSPointerDown",this._onTouchStart,this),L.DomEvent.on(this._container,"MSPointerUp",this._onTouchEnd,this),L.DomEvent.on(this._container,"MSPointerMove",this._onTouchMove,this),L.DomEvent.on(this._container,"MSPointerCancel",this._onTouchCancel,this)):(L.DomEvent.on(this._container,"touchcancel",this._onTouchCancel,this),L.DomEvent.on(this._container,"touchleave",this._onTouchLeave,this))},removeHooks:function(){L.DomEvent.off(this._container,"touchstart",this._onTouchStart),L.DomEvent.off(this._container,"touchend",this._onTouchEnd),L.DomEvent.off(this._container,"touchmove",this._onTouchMove),this._detectIE()?(L.DomEvent.off(this._container,"MSPointerDowm",this._onTouchStart),L.DomEvent.off(this._container,"MSPointerUp",this._onTouchEnd),L.DomEvent.off(this._container,"MSPointerMove",this._onTouchMove),L.DomEvent.off(this._container,"MSPointerCancel",this._onTouchCancel)):(L.DomEvent.off(this._container,"touchcancel",this._onTouchCancel),L.DomEvent.off(this._container,"touchleave",this._onTouchLeave))},_touchEvent:function(t,e){var i={};if("undefined"!=typeof t.touches){if(!t.touches.length)return;i=t.touches[0]}else{if("touch"!==t.pointerType)return;if(i=t,!this._filterClick(t))return}var o=this._map.mouseEventToContainerPoint(i),n=this._map.mouseEventToLayerPoint(i),s=this._map.layerPointToLatLng(n);this._map.fire(e,{latlng:s,layerPoint:n,containerPoint:o,pageX:i.pageX,pageY:i.pageY,originalEvent:t})},_filterClick:function(t){var e=t.timeStamp||t.originalEvent.timeStamp,i=L.DomEvent._lastClick&&e-L.DomEvent._lastClick;return i&&i>100&&i<500||t.target._simulatedClick&&!t._simulated?(L.DomEvent.stop(t),!1):(L.DomEvent._lastClick=e,!0)},_onTouchStart:function(t){if(this._map._loaded){var e="touchstart";this._touchEvent(t,e)}},_onTouchEnd:function(t){if(this._map._loaded){var e="touchend";this._touchEvent(t,e)}},_onTouchCancel:function(t){if(this._map._loaded){var e="touchcancel";this._detectIE()&&(e="pointercancel"),this._touchEvent(t,e)}},_onTouchLeave:function(t){if(this._map._loaded){var e="touchleave";this._touchEvent(t,e)}},_onTouchMove:function(t){if(this._map._loaded){var e="touchmove";this._touchEvent(t,e)}},_detectIE:function(){var e=t.navigator.userAgent,i=e.indexOf("MSIE ");if(i>0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);var o=e.indexOf("Trident/");if(o>0){var n=e.indexOf("rv:");return parseInt(e.substring(n+3,e.indexOf(".",n)),10)}var s=e.indexOf("Edge/");return s>0&&parseInt(e.substring(s+5,e.indexOf(".",s)),10)}}),L.Map.addInitHook("addHandler","touchExtend",L.Map.TouchExtend),L.Marker.Touch=L.Marker.extend({_initInteraction:function(){return this.addInteractiveTarget?L.Marker.prototype._initInteraction.apply(this):this._initInteractionLegacy()},_initInteractionLegacy:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu","touchstart","touchend","touchmove"];this._detectIE?e.concat(["MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel"]):e.concat(["touchcancel"]),L.DomUtil.addClass(t,"leaflet-clickable"),L.DomEvent.on(t,"click",this._onMouseClick,this),L.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;i<e.length;i++)L.DomEvent.on(t,e[i],this._fireMouseEvent,this);L.Handler.MarkerDrag&&(this.dragging=new L.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_detectIE:function(){var e=t.navigator.userAgent,i=e.indexOf("MSIE ");if(i>0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);var o=e.indexOf("Trident/");if(o>0){var n=e.indexOf("rv:");return parseInt(e.substring(n+3,e.indexOf(".",n)),10)}var s=e.indexOf("Edge/");return s>0&&parseInt(e.substring(s+5,e.indexOf(".",s)),10)}}),L.LatLngUtil={cloneLatLngs:function(t){for(var e=[],i=0,o=t.length;i<o;i++)Array.isArray(t[i])?e.push(L.LatLngUtil.cloneLatLngs(t[i])):e.push(this.cloneLatLng(t[i]));return e},cloneLatLng:function(t){return L.latLng(t.lat,t.lng)}},L.GeometryUtil=L.extend(L.GeometryUtil||{},{geodesicArea:function(t){var e,i,o=t.length,n=0,s=Math.PI/180;if(o>2){for(var a=0;a<o;a++)e=t[a],i=t[(a+1)%o],n+=(i.lng-e.lng)*s*(2+Math.sin(e.lat*s)+Math.sin(i.lat*s));n=6378137*n*6378137/2}return Math.abs(n)},readableArea:function(t,e){var i;return e?i=t>=1e4?(1e-4*t).toFixed(2)+" ha":t.toFixed(2)+" m²":(t/=.836127,i=t>=3097600?(t/3097600).toFixed(2)+" mi²":t>=4840?(t/4840).toFixed(2)+" acres":Math.ceil(t)+" yd²"),i},readableDistance:function(t,e,i){var o;if(e)o=t>1e3?(t/1e3).toFixed(2)+" km":Math.ceil(t)+" m";else if(t*=1.09361,t>1760)o=(t/1760).toFixed(2)+" miles";else{var n=" yd";i&&(t=3*t,n=" ft"),o=Math.ceil(t)+n}return o}}),L.Util.extend(L.LineUtil,{segmentsIntersect:function(t,e,i,o){return this._checkCounterclockwise(t,i,o)!==this._checkCounterclockwise(e,i,o)&&this._checkCounterclockwise(t,e,i)!==this._checkCounterclockwise(t,e,o)},_checkCounterclockwise:function(t,e,i){return(i.y-t.y)*(e.x-t.x)>(e.y-t.y)*(i.x-t.x)}}),L.Polyline.include({intersects:function(){var t,e,i,o=this._getProjectedPoints(),n=o?o.length:0;if(this._tooFewPointsForIntersection())return!1;for(t=n-1;t>=3;t--)if(e=o[t-1],i=o[t],this._lineSegmentsIntersectsRange(e,i,t-2))return!0;return!1},newLatLngIntersects:function(t,e){return!!this._map&&this.newPointIntersects(this._map.latLngToLayerPoint(t),e)},newPointIntersects:function(t,e){var i=this._getProjectedPoints(),o=i?i.length:0,n=i?i[o-1]:null,s=o-2;return!this._tooFewPointsForIntersection(1)&&this._lineSegmentsIntersectsRange(n,t,s,e?1:0)},_tooFewPointsForIntersection:function(t){var e=this._getProjectedPoints(),i=e?e.length:0;return i+=t||0,!e||i<=3},_lineSegmentsIntersectsRange:function(t,e,i,o){var n,s,a=this._getProjectedPoints();o=o||0;for(var r=i;r>o;r--)if(n=a[r-1],s=a[r],L.LineUtil.segmentsIntersect(t,e,n,s))return!0;return!1},_getProjectedPoints:function(){if(!this._defaultShape)return this._originalPoints;for(var t=[],e=this._defaultShape(),i=0;i<e.length;i++)t.push(this._map.latLngToLayerPoint(e[i]));return t}}),L.Polygon.include({intersects:function(){var t,e,i,o,n,s=this._getProjectedPoints();return!this._tooFewPointsForIntersection()&&(!!(t=L.Polyline.prototype.intersects.call(this))||(e=s.length,i=s[0],o=s[e-1],n=e-2,this._lineSegmentsIntersectsRange(o,i,n,1)))}}),L.Control.Draw=L.Control.extend({options:{position:"topleft",draw:{},edit:!1},initialize:function(t){if(L.version<"0.7")throw new Error("Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/");L.Control.prototype.initialize.call(this,t);var e;this._toolbars={},L.DrawToolbar&&this.options.draw&&(e=new L.DrawToolbar(this.options.draw),this._toolbars[L.DrawToolbar.TYPE]=e,this._toolbars[L.DrawToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.EditToolbar&&this.options.edit&&(e=new L.EditToolbar(this.options.edit),this._toolbars[L.EditToolbar.TYPE]=e,this._toolbars[L.EditToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.toolbar=this},onAdd:function(t){var e,i=L.DomUtil.create("div","leaflet-draw"),o=!1,n="leaflet-draw-toolbar-top";for(var s in this._toolbars)this._toolbars.hasOwnProperty(s)&&(e=this._toolbars[s].addToolbar(t),e&&(o||(L.DomUtil.hasClass(e,n)||L.DomUtil.addClass(e.childNodes[0],n),o=!0),i.appendChild(e)));return i},onRemove:function(){for(var t in this._toolbars)this._toolbars.hasOwnProperty(t)&&this._toolbars[t].removeToolbar()},setDrawingOptions:function(t){for(var e in this._toolbars)this._toolbars[e]instanceof L.DrawToolbar&&this._toolbars[e].setOptions(t)},_toolbarEnabled:function(t){var e=t.target;for(var i in this._toolbars)this._toolbars[i]!==e&&this._toolbars[i].disable()}}),L.Map.mergeOptions({drawControlTooltips:!0,drawControl:!1}),L.Map.addInitHook(function(){this.options.drawControl&&(this.drawControl=new L.Control.Draw,this.addControl(this.drawControl))}),L.Toolbar=L.Class.extend({includes:[L.Mixin.Events],initialize:function(t){L.setOptions(this,t),this._modes={},this._actionButtons=[],this._activeMode=null},enabled:function(){return null!==this._activeMode},disable:function(){this.enabled()&&this._activeMode.handler.disable()},addToolbar:function(t){var e,i=L.DomUtil.create("div","leaflet-draw-section"),o=0,n=this._toolbarClass||"",s=this.getModeHandlers(t);for(this._toolbarContainer=L.DomUtil.create("div","leaflet-draw-toolbar leaflet-bar"),this._map=t,e=0;e<s.length;e++)s[e].enabled&&this._initModeHandler(s[e].handler,this._toolbarContainer,o++,n,s[e].title);if(o)return this._lastButtonIndex=--o,this._actionsContainer=L.DomUtil.create("ul","leaflet-draw-actions"),i.appendChild(this._toolbarContainer),i.appendChild(this._actionsContainer),i},removeToolbar:function(){for(var t in this._modes)this._modes.hasOwnProperty(t)&&(this._disposeButton(this._modes[t].button,this._modes[t].handler.enable,this._modes[t].handler),this._modes[t].handler.disable(),this._modes[t].handler.off("enabled",this._handlerActivated,this).off("disabled",this._handlerDeactivated,this));this._modes={};for(var e=0,i=this._actionButtons.length;e<i;e++)this._disposeButton(this._actionButtons[e].button,this._actionButtons[e].callback,this);this._actionButtons=[],this._actionsContainer=null},_initModeHandler:function(t,e,i,o,n){var s=t.type;this._modes[s]={},this._modes[s].handler=t,this._modes[s].button=this._createButton({type:s,title:n,className:o+"-"+s,container:e,callback:this._modes[s].handler.enable,context:this._modes[s].handler}),this._modes[s].buttonIndex=i,this._modes[s].handler.on("enabled",this._handlerActivated,this).on("disabled",this._handlerDeactivated,this)},_createButton:function(t){var e=L.DomUtil.create("a",t.className||"",t.container);return e.href="#",t.text&&(e.innerHTML=t.text),t.title&&(e.title=t.title),L.DomEvent.on(e,"click",L.DomEvent.stopPropagation).on(e,"mousedown",L.DomEvent.stopPropagation).on(e,"dblclick",L.DomEvent.stopPropagation).on(e,"click",L.DomEvent.preventDefault).on(e,"click",t.callback,t.context),e},_disposeButton:function(t,e){L.DomEvent.off(t,"click",L.DomEvent.stopPropagation).off(t,"mousedown",L.DomEvent.stopPropagation).off(t,"dblclick",L.DomEvent.stopPropagation).off(t,"click",L.DomEvent.preventDefault).off(t,"click",e)},_handlerActivated:function(t){this.disable(),this._activeMode=this._modes[t.handler],L.DomUtil.addClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._showActionsToolbar(),this.fire("enable")},_handlerDeactivated:function(){this._hideActionsToolbar(),L.DomUtil.removeClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._activeMode=null,this.fire("disable")},_createActions:function(t){var e,i,o,n,s=this._actionsContainer,a=this.getActions(t),r=a.length;for(i=0,o=this._actionButtons.length;i<o;i++)this._disposeButton(this._actionButtons[i].button,this._actionButtons[i].callback);for(this._actionButtons=[];s.firstChild;)s.removeChild(s.firstChild);for(var h=0;h<r;h++)"enabled"in a[h]&&!a[h].enabled||(e=L.DomUtil.create("li","",s),n=this._createButton({title:a[h].title,text:a[h].text,container:e,callback:a[h].callback,context:a[h].context}),this._actionButtons.push({button:n,callback:a[h].callback}))},_showActionsToolbar:function(){var t=this._activeMode.buttonIndex,e=this._lastButtonIndex,i=this._activeMode.button.offsetTop-1;this._createActions(this._activeMode.handler),this._actionsContainer.style.top=i+"px",0===t&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-top")),t===e&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-bottom")),this._actionsContainer.style.display="block"},_hideActionsToolbar:function(){this._actionsContainer.style.display="none",L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-top"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-bottom")}}),L.Draw=L.Draw||{},L.Draw.Tooltip=L.Class.extend({initialize:function(t){this._map=t,this._popupPane=t._panes.popupPane,this._container=t.options.drawControlTooltips?L.DomUtil.create("div","leaflet-draw-tooltip",this._popupPane):null,this._singleLineLabel=!1,this._map.on("mouseout",this._onMouseOut,this)},dispose:function(){this._map.off("mouseout",this._onMouseOut,this),this._container&&(this._popupPane.removeChild(this._container),this._container=null)},updateContent:function(t){return this._container?(t.subtext=t.subtext||"",0!==t.subtext.length||this._singleLineLabel?t.subtext.length>0&&this._singleLineLabel&&(L.DomUtil.removeClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!1):(L.DomUtil.addClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!0),this._container.innerHTML=(t.subtext.length>0?'<span class="leaflet-draw-tooltip-subtext">'+t.subtext+"</span><br />":"")+"<span>"+t.text+"</span>",this):this},updatePosition:function(t){var e=this._map.latLngToLayerPoint(t),i=this._container;return this._container&&(i.style.visibility="inherit",L.DomUtil.setPosition(i,e)),this},showAsError:function(){return this._container&&L.DomUtil.addClass(this._container,"leaflet-error-draw-tooltip"),this},removeError:function(){return this._container&&L.DomUtil.removeClass(this._container,"leaflet-error-draw-tooltip"),this},_onMouseOut:function(){this._container&&(this._container.style.visibility="hidden")}}),L.DrawToolbar=L.Toolbar.extend({statics:{TYPE:"draw"},options:{polyline:{},polygon:{},rectangle:{},circle:{},marker:{}},initialize:function(t){for(var e in this.options)this.options.hasOwnProperty(e)&&t[e]&&(t[e]=L.extend({},this.options[e],t[e]));this._toolbarClass="leaflet-draw-draw",L.Toolbar.prototype.initialize.call(this,t)},getModeHandlers:function(t){return[{enabled:this.options.polyline,handler:new L.Draw.Polyline(t,this.options.polyline),title:L.drawLocal.draw.toolbar.buttons.polyline},{enabled:this.options.polygon,handler:new L.Draw.Polygon(t,this.options.polygon),title:L.drawLocal.draw.toolbar.buttons.polygon},{enabled:this.options.rectangle,handler:new L.Draw.Rectangle(t,this.options.rectangle),title:L.drawLocal.draw.toolbar.buttons.rectangle},{enabled:this.options.circle,handler:new L.Draw.Circle(t,this.options.circle),title:L.drawLocal.draw.toolbar.buttons.circle},{enabled:this.options.marker,handler:new L.Draw.Marker(t,this.options.marker),title:L.drawLocal.draw.toolbar.buttons.marker}]},getActions:function(t){return[{enabled:t.completeShape,title:L.drawLocal.draw.toolbar.finish.title,text:L.drawLocal.draw.toolbar.finish.text,callback:t.completeShape,context:t},{enabled:t.deleteLastVertex,title:L.drawLocal.draw.toolbar.undo.title,text:L.drawLocal.draw.toolbar.undo.text,callback:t.deleteLastVertex,context:t},{title:L.drawLocal.draw.toolbar.actions.title,text:L.drawLocal.draw.toolbar.actions.text,callback:this.disable,context:this}]},setOptions:function(t){L.setOptions(this,t);for(var e in this._modes)this._modes.hasOwnProperty(e)&&t.hasOwnProperty(e)&&this._modes[e].handler.setOptions(t[e])}}),L.EditToolbar=L.Toolbar.extend({statics:{TYPE:"edit"},options:{edit:{selectedPathOptions:{dashArray:"10, 10",fill:!0,fillColor:"#fe57a1",fillOpacity:.1,maintainColor:!1}},remove:{},poly:null,featureGroup:null},initialize:function(t){t.edit&&("undefined"==typeof t.edit.selectedPathOptions&&(t.edit.selectedPathOptions=this.options.edit.selectedPathOptions),t.edit.selectedPathOptions=L.extend({},this.options.edit.selectedPathOptions,t.edit.selectedPathOptions)),t.remove&&(t.remove=L.extend({},this.options.remove,t.remove)),t.poly&&(t.poly=L.extend({},this.options.poly,t.poly)),this._toolbarClass="leaflet-draw-edit",L.Toolbar.prototype.initialize.call(this,t),this._selectedFeatureCount=0},getModeHandlers:function(t){var e=this.options.featureGroup;return[{enabled:this.options.edit,handler:new L.EditToolbar.Edit(t,{featureGroup:e,selectedPathOptions:this.options.edit.selectedPathOptions,poly:this.options.poly}),title:L.drawLocal.edit.toolbar.buttons.edit},{enabled:this.options.remove,handler:new L.EditToolbar.Delete(t,{featureGroup:e}),title:L.drawLocal.edit.toolbar.buttons.remove}]},getActions:function(){return[{title:L.drawLocal.edit.toolbar.actions.save.title,text:L.drawLocal.edit.toolbar.actions.save.text,callback:this._save,context:this},{title:L.drawLocal.edit.toolbar.actions.cancel.title,text:L.drawLocal.edit.toolbar.actions.cancel.text,callback:this.disable,context:this}]},addToolbar:function(t){var e=L.Toolbar.prototype.addToolbar.call(this,t);return this._checkDisabled(),this.options.featureGroup.on("layeradd layerremove",this._checkDisabled,this),e},removeToolbar:function(){this.options.featureGroup.off("layeradd layerremove",this._checkDisabled,this),L.Toolbar.prototype.removeToolbar.call(this)},disable:function(){this.enabled()&&(this._activeMode.handler.revertLayers(),L.Toolbar.prototype.disable.call(this))},_save:function(){this._activeMode.handler.save(),this._activeMode&&this._activeMode.handler.disable()},_checkDisabled:function(){var t,e=this.options.featureGroup,i=0!==e.getLayers().length;this.options.edit&&(t=this._modes[L.EditToolbar.Edit.TYPE].button,i?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",i?L.drawLocal.edit.toolbar.buttons.edit:L.drawLocal.edit.toolbar.buttons.editDisabled)),this.options.remove&&(t=this._modes[L.EditToolbar.Delete.TYPE].button,i?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",i?L.drawLocal.edit.toolbar.buttons.remove:L.drawLocal.edit.toolbar.buttons.removeDisabled))}}),L.EditToolbar.Edit=L.Handler.extend({statics:{TYPE:"edit"},includes:L.Mixin.Events,initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.setOptions(this,e),this._featureGroup=e.featureGroup,!(this._featureGroup instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this._uneditedLayerProps={},this.type=L.EditToolbar.Edit.TYPE},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire("draw:editstart",{handler:this.type}),L.Handler.prototype.enable.call(this),this._featureGroup.on("layeradd",this._enableLayerEdit,this).on("layerremove",this._disableLayerEdit,this))},disable:function(){this._enabled&&(this._featureGroup.off("layeradd",this._enableLayerEdit,this).off("layerremove",this._disableLayerEdit,this),L.Handler.prototype.disable.call(this),this._map.fire("draw:editstop",{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._featureGroup.eachLayer(this._enableLayerEdit,this),this._tooltip=new L.Draw.Tooltip(this._map),this._tooltip.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext}),t._editTooltip=this._tooltip,this._updateTooltip(),this._map.on("mousemove",this._onMouseMove,this).on("touchmove",this._onMouseMove,this).on("MSPointerMove",this._onMouseMove,this).on("draw:editvertex",this._updateTooltip,this))},removeHooks:function(){this._map&&(this._featureGroup.eachLayer(this._disableLayerEdit,this),this._uneditedLayerProps={},this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this).off("touchmove",this._onMouseMove,this).off("MSPointerMove",this._onMouseMove,this).off("draw:editvertex",this._updateTooltip,this))},revertLayers:function(){this._featureGroup.eachLayer(function(t){this._revertLayer(t)},this)},save:function(){var t=new L.LayerGroup;this._featureGroup.eachLayer(function(e){e.edited&&(t.addLayer(e),e.edited=!1)}),this._map.fire("draw:edited",{layers:t})},_backupLayer:function(t){var e=L.Util.stamp(t);this._uneditedLayerProps[e]||(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?this._uneditedLayerProps[e]={latlngs:L.LatLngUtil.cloneLatLngs(t.getLatLngs())}:t instanceof L.Circle?this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng()),radius:t.getRadius()}:t instanceof L.Marker&&(this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng())}))},_getTooltipText:function(){return{text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext}},_updateTooltip:function(){this._tooltip.updateContent(this._getTooltipText())},_revertLayer:function(t){var e=L.Util.stamp(t);t.edited=!1,this._uneditedLayerProps.hasOwnProperty(e)&&(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?t.setLatLngs(this._uneditedLayerProps[e].latlngs):t instanceof L.Circle?(t.setLatLng(this._uneditedLayerProps[e].latlng),t.setRadius(this._uneditedLayerProps[e].radius)):t instanceof L.Marker&&t.setLatLng(this._uneditedLayerProps[e].latlng),t.fire("revert-edited",{layer:t}))},_enableLayerEdit:function(t){var e,i,o=t.layer||t.target||t;this._backupLayer(o),this.options.poly&&(i=L.Util.extend({},this.options.poly),o.options.poly=i),this.options.selectedPathOptions&&(e=L.Util.extend({},this.options.selectedPathOptions),e.maintainColor&&(e.color=o.options.color,e.fillColor=o.options.fillColor),o.options.original=L.extend({},o.options),o.options.editing=e),o instanceof L.Marker?(o.editing&&o.editing.enable(),o.dragging.enable(),o.on("dragend",this._onMarkerDragEnd).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onMarkerDragEnd,this).on("MSPointerUp",this._onMarkerDragEnd,this)):o.editing.enable()},_disableLayerEdit:function(t){var e=t.layer||t.target||t;e.edited=!1,e.editing&&e.editing.disable(),delete e.options.editing,delete e.options.original,this._selectedPathOptions&&(e instanceof L.Marker?this._toggleMarkerHighlight(e):(e.setStyle(e.options.previousOptions),delete e.options.previousOptions)),e instanceof L.Marker?(e.dragging.disable(),e.off("dragend",this._onMarkerDragEnd,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onMarkerDragEnd,this).off("MSPointerUp",this._onMarkerDragEnd,this)):e.editing.disable()},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_onMarkerDragEnd:function(t){var e=t.target;e.edited=!0,this._map.fire("draw:editmove",{layer:e})},_onTouchMove:function(t){var e=t.originalEvent.changedTouches[0],i=this._map.mouseEventToLayerPoint(e),o=this._map.layerPointToLatLng(i);t.target.setLatLng(o)},_hasAvailableLayers:function(){return 0!==this._featureGroup.getLayers().length}}),L.EditToolbar.Delete=L.Handler.extend({statics:{TYPE:"remove"},includes:L.Mixin.Events,initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.Util.setOptions(this,e),this._deletableLayers=this.options.featureGroup,!(this._deletableLayers instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this.type=L.EditToolbar.Delete.TYPE},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire("draw:deletestart",{handler:this.type}),L.Handler.prototype.enable.call(this),this._deletableLayers.on("layeradd",this._enableLayerDelete,this).on("layerremove",this._disableLayerDelete,this))},disable:function(){this._enabled&&(this._deletableLayers.off("layeradd",this._enableLayerDelete,this).off("layerremove",this._disableLayerDelete,this),L.Handler.prototype.disable.call(this),this._map.fire("draw:deletestop",{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._deletableLayers.eachLayer(this._enableLayerDelete,this),this._deletedLayers=new L.LayerGroup,this._tooltip=new L.Draw.Tooltip(this._map),this._tooltip.updateContent({text:L.drawLocal.edit.handlers.remove.tooltip.text}),this._map.on("mousemove",this._onMouseMove,this))},removeHooks:function(){this._map&&(this._deletableLayers.eachLayer(this._disableLayerDelete,this),this._deletedLayers=null,this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this))},revertLayers:function(){this._deletedLayers.eachLayer(function(t){this._deletableLayers.addLayer(t),t.fire("revert-deleted",{layer:t})},this)},save:function(){this._map.fire("draw:deleted",{layers:this._deletedLayers})},_enableLayerDelete:function(t){var e=t.layer||t.target||t;e.on("click",this._removeLayer,this)},_disableLayerDelete:function(t){var e=t.layer||t.target||t;e.off("click",this._removeLayer,this),this._deletedLayers.removeLayer(e)},_removeLayer:function(t){var e=t.layer||t.target||t;this._deletableLayers.removeLayer(e),this._deletedLayers.addLayer(e),e.fire("deleted")},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_hasAvailableLayers:function(){return 0!==this._deletableLayers.getLayers().length}})}(window,document); | ||
https://github.com/Leaflet/Leaflet.draw | ||
http://leafletjs.com | ||
*/ | ||
!function(t,e,i){L.drawVersion="0.4.2",L.Draw={},L.drawLocal={draw:{toolbar:{actions:{title:"Cancel drawing",text:"Cancel"},finish:{title:"Finish drawing",text:"Finish"},undo:{title:"Delete last point drawn",text:"Delete last point"},buttons:{polyline:"Draw a polyline",polygon:"Draw a polygon",rectangle:"Draw a rectangle",circle:"Draw a circle",marker:"Draw a marker"}},handlers:{circle:{tooltip:{start:"Click and drag to draw circle."},radius:"Radius"},marker:{tooltip:{start:"Click map to place marker."}},polygon:{tooltip:{start:"Click to start drawing shape.",cont:"Click to continue drawing shape.",end:"Click first point to close this shape."}},polyline:{error:"<strong>Error:</strong> shape edges cannot cross!",tooltip:{start:"Click to start drawing line.",cont:"Click to continue drawing line.",end:"Click last point to finish line."}},rectangle:{tooltip:{start:"Click and drag to draw rectangle."}},simpleshape:{tooltip:{end:"Release mouse to finish drawing."}}}},edit:{toolbar:{actions:{save:{title:"Save changes.",text:"Save"},cancel:{title:"Cancel editing, discards all changes.",text:"Cancel"}},buttons:{edit:"Edit layers.",editDisabled:"No layers to edit.",remove:"Delete layers.",removeDisabled:"No layers to delete."}},handlers:{edit:{tooltip:{text:"Drag handles, or marker to edit feature.",subtext:"Click cancel to undo changes."}},remove:{tooltip:{text:"Click on a feature to remove"}}}}},L.Draw.Event={},L.Draw.Event.CREATED="draw:created",L.Draw.Event.EDITED="draw:edited",L.Draw.Event.DELETED="draw:deleted",L.Draw.Event.DRAWSTART="draw:drawstart",L.Draw.Event.DRAWSTOP="draw:drawstop",L.Draw.Event.DRAWVERTEX="draw:drawvertex",L.Draw.Event.EDITSTART="draw:editstart",L.Draw.Event.EDITMOVE="draw:editmove",L.Draw.Event.EDITRESIZE="draw:editresize",L.Draw.Event.EDITVERTEX="draw:editvertex",L.Draw.Event.EDITSTOP="draw:editstop",L.Draw.Event.DELETESTART="draw:deletestart",L.Draw.Event.DELETESTOP="draw:deletestop",L.Draw=L.Draw||{},L.Draw.Feature=L.Handler.extend({includes:L.Mixin.Events,initialize:function(t,e){this._map=t,this._container=t._container,this._overlayPane=t._panes.overlayPane,this._popupPane=t._panes.popupPane,e&&e.shapeOptions&&(e.shapeOptions=L.Util.extend({},this.options.shapeOptions,e.shapeOptions)),L.setOptions(this,e)},enable:function(){this._enabled||(L.Handler.prototype.enable.call(this),this.fire("enabled",{handler:this.type}),this._map.fire(L.Draw.Event.DRAWSTART,{layerType:this.type}))},disable:function(){this._enabled&&(L.Handler.prototype.disable.call(this),this._map.fire(L.Draw.Event.DRAWSTOP,{layerType:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(L.DomUtil.disableTextSelection(),t.getContainer().focus(),this._tooltip=new L.Draw.Tooltip(this._map),L.DomEvent.on(this._container,"keyup",this._cancelDrawing,this))},removeHooks:function(){this._map&&(L.DomUtil.enableTextSelection(),this._tooltip.dispose(),this._tooltip=null,L.DomEvent.off(this._container,"keyup",this._cancelDrawing,this))},setOptions:function(t){L.setOptions(this,t)},_fireCreatedEvent:function(t){this._map.fire(L.Draw.Event.CREATED,{layer:t,layerType:this.type})},_cancelDrawing:function(t){this._map.fire("draw:canceled",{layerType:this.type}),27===t.keyCode&&this.disable()}}),L.Draw.Polyline=L.Draw.Feature.extend({statics:{TYPE:"polyline"},Poly:L.Polyline,options:{allowIntersection:!0,repeatMode:!1,drawError:{color:"#b00b00",timeout:2500},icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),guidelineDistance:20,maxGuideLineLength:4e3,shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!1,clickable:!0},metric:!0,feet:!0,showLength:!0,zIndexOffset:2e3},initialize:function(t,e){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this.options.drawError.message=L.drawLocal.draw.handlers.polyline.error,e&&e.drawError&&(e.drawError=L.Util.extend({},this.options.drawError,e.drawError)),this.type=L.Draw.Polyline.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._markers=[],this._markerGroup=new L.LayerGroup,this._map.addLayer(this._markerGroup),this._poly=new L.Polyline([],this.options.shapeOptions),this._tooltip.updateContent(this._getTooltipText()),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),L.Browser.touch||this._map.on("mouseup",this._onMouseUp,this),this._mouseMarker.on("mousedown",this._onMouseDown,this).on("mouseout",this._onMouseOut,this).on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).addTo(this._map),this._map.on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).on("zoomlevelschange",this._onZoomEnd,this).on("click",this._onTouch,this).on("zoomend",this._onZoomEnd,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._clearHideErrorTimeout(),this._cleanUpShape(),this._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers,this._map.removeLayer(this._poly),delete this._poly,this._mouseMarker.off("mousedown",this._onMouseDown,this).off("mouseout",this._onMouseOut,this).off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._clearGuides(),this._map.off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this).off("zoomlevelschange",this._onZoomEnd,this).off("zoomend",this._onZoomEnd,this).off("click",this._onTouch,this)},deleteLastVertex:function(){if(!(this._markers.length<=1)){var t=this._markers.pop(),e=this._poly,i=e.getLatLngs(),o=i.splice(-1,1)[0];this._poly.setLatLngs(i),this._markerGroup.removeLayer(t),e.getLatLngs().length<2&&this._map.removeLayer(e),this._vertexChanged(o,!1)}},addVertex:function(t){var e=this._markers.length;return e>0&&!this.options.allowIntersection&&this._poly.newLatLngIntersects(t)?void this._showErrorTooltip():(this._errorShown&&this._hideErrorTooltip(),this._markers.push(this._createMarker(t)),this._poly.addLatLng(t),2===this._poly.getLatLngs().length&&this._map.addLayer(this._poly),void this._vertexChanged(t,!0))},completeShape:function(){this._markers.length<=1||(this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable())},_finishShape:function(){var t=this._poly._defaultShape?this._poly._defaultShape():this._poly.getLatLngs(),e=this._poly.newLatLngIntersects(t[t.length-1]);return!this.options.allowIntersection&&e||!this._shapeIsValid()?void this._showErrorTooltip():(this._fireCreatedEvent(),this.disable(),void(this.options.repeatMode&&this.enable()))},_shapeIsValid:function(){return!0},_onZoomEnd:function(){null!==this._markers&&this._updateGuide()},_onMouseMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent),i=this._map.layerPointToLatLng(e);this._currentLatLng=i,this._updateTooltip(i),this._updateGuide(e),this._mouseMarker.setLatLng(i),L.DomEvent.preventDefault(t.originalEvent)},_vertexChanged:function(t,e){this._map.fire(L.Draw.Event.DRAWVERTEX,{layers:this._markerGroup}),this._updateFinishHandler(),this._updateRunningMeasure(t,e),this._clearGuides(),this._updateTooltip()},_onMouseDown:function(t){var e=t.originalEvent;this._mouseDownOrigin=L.point(e.clientX,e.clientY)},_onMouseUp:function(e){if(this._mouseDownOrigin){var i=L.point(e.originalEvent.clientX,e.originalEvent.clientY).distanceTo(this._mouseDownOrigin);Math.abs(i)<9*(t.devicePixelRatio||1)&&this.addVertex(e.latlng)}this._mouseDownOrigin=null},_onTouch:function(t){L.Browser.touch&&(this._onMouseDown(t),this._onMouseUp(t))},_onMouseOut:function(){this._tooltip&&this._tooltip._onMouseOut.call(this._tooltip)},_updateFinishHandler:function(){var t=this._markers.length;t>1&&this._markers[t-1].on("click",this._finishShape,this),t>2&&this._markers[t-2].off("click",this._finishShape,this)},_createMarker:function(t){var e=new L.Marker(t,{icon:this.options.icon,zIndexOffset:2*this.options.zIndexOffset});return this._markerGroup.addLayer(e),e},_updateGuide:function(t){var e=this._markers?this._markers.length:0;e>0&&(t=t||this._map.latLngToLayerPoint(this._currentLatLng),this._clearGuides(),this._drawGuide(this._map.latLngToLayerPoint(this._markers[e-1].getLatLng()),t))},_updateTooltip:function(t){var e=this._getTooltipText();t&&this._tooltip.updatePosition(t),this._errorShown||this._tooltip.updateContent(e)},_drawGuide:function(t,e){var i,o,n,s=Math.floor(Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))),a=this.options.guidelineDistance,r=this.options.maxGuideLineLength,h=s>r?s-r:a;for(this._guidesContainer||(this._guidesContainer=L.DomUtil.create("div","leaflet-draw-guides",this._overlayPane));h<s;h+=this.options.guidelineDistance)i=h/s,o={x:Math.floor(t.x*(1-i)+i*e.x),y:Math.floor(t.y*(1-i)+i*e.y)},n=L.DomUtil.create("div","leaflet-draw-guide-dash",this._guidesContainer),n.style.backgroundColor=this._errorShown?this.options.drawError.color:this.options.shapeOptions.color,L.DomUtil.setPosition(n,o)},_updateGuideColor:function(t){if(this._guidesContainer)for(var e=0,i=this._guidesContainer.childNodes.length;e<i;e++)this._guidesContainer.childNodes[e].style.backgroundColor=t},_clearGuides:function(){if(this._guidesContainer)for(;this._guidesContainer.firstChild;)this._guidesContainer.removeChild(this._guidesContainer.firstChild)},_getTooltipText:function(){var t,e,i=this.options.showLength;return 0===this._markers.length?t={text:L.drawLocal.draw.handlers.polyline.tooltip.start}:(e=i?this._getMeasurementString():"",t=1===this._markers.length?{text:L.drawLocal.draw.handlers.polyline.tooltip.cont,subtext:e}:{text:L.drawLocal.draw.handlers.polyline.tooltip.end,subtext:e}),t},_updateRunningMeasure:function(t,e){var i,o,n=this._markers.length;1===this._markers.length?this._measurementRunningTotal=0:(i=n-(e?2:1),o=t.distanceTo(this._markers[i].getLatLng()),this._measurementRunningTotal+=o*(e?1:-1))},_getMeasurementString:function(){var t,e=this._currentLatLng,i=this._markers[this._markers.length-1].getLatLng();return t=this._measurementRunningTotal+e.distanceTo(i),L.GeometryUtil.readableDistance(t,this.options.metric,this.options.feet)},_showErrorTooltip:function(){this._errorShown=!0,this._tooltip.showAsError().updateContent({text:this.options.drawError.message}),this._updateGuideColor(this.options.drawError.color),this._poly.setStyle({color:this.options.drawError.color}),this._clearHideErrorTimeout(),this._hideErrorTimeout=setTimeout(L.Util.bind(this._hideErrorTooltip,this),this.options.drawError.timeout)},_hideErrorTooltip:function(){this._errorShown=!1,this._clearHideErrorTimeout(),this._tooltip.removeError().updateContent(this._getTooltipText()),this._updateGuideColor(this.options.shapeOptions.color),this._poly.setStyle({color:this.options.shapeOptions.color})},_clearHideErrorTimeout:function(){this._hideErrorTimeout&&(clearTimeout(this._hideErrorTimeout),this._hideErrorTimeout=null)},_cleanUpShape:function(){this._markers.length>1&&this._markers[this._markers.length-1].off("click",this._finishShape,this)},_fireCreatedEvent:function(){var t=new this.Poly(this._poly.getLatLngs(),this.options.shapeOptions);L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Draw.Polygon=L.Draw.Polyline.extend({statics:{TYPE:"polygon"},Poly:L.Polygon,options:{showArea:!1,shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},metric:!0},initialize:function(t,e){L.Draw.Polyline.prototype.initialize.call(this,t,e),this.type=L.Draw.Polygon.TYPE},_updateFinishHandler:function(){var t=this._markers.length;1===t&&this._markers[0].on("click",this._finishShape,this),t>2&&(this._markers[t-1].on("dblclick",this._finishShape,this),t>3&&this._markers[t-2].off("dblclick",this._finishShape,this))},_getTooltipText:function(){var t,e;return 0===this._markers.length?t=L.drawLocal.draw.handlers.polygon.tooltip.start:this._markers.length<3?t=L.drawLocal.draw.handlers.polygon.tooltip.cont:(t=L.drawLocal.draw.handlers.polygon.tooltip.end,e=this._getMeasurementString()),{text:t,subtext:e}},_getMeasurementString:function(){var t=this._area;return t?L.GeometryUtil.readableArea(t,this.options.metric):null},_shapeIsValid:function(){return this._markers.length>=3},_vertexChanged:function(t,e){var i;!this.options.allowIntersection&&this.options.showArea&&(i=this._poly.getLatLngs(),this._area=L.GeometryUtil.geodesicArea(i)),L.Draw.Polyline.prototype._vertexChanged.call(this,t,e)},_cleanUpShape:function(){var t=this._markers.length;t>0&&(this._markers[0].off("click",this._finishShape,this),t>2&&this._markers[t-1].off("dblclick",this._finishShape,this))}}),L.SimpleShape={},L.Draw.SimpleShape=L.Draw.Feature.extend({options:{repeatMode:!1},initialize:function(t,e){this._endLabelText=L.drawLocal.draw.handlers.simpleshape.tooltip.end,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._mapDraggable=this._map.dragging.enabled(),this._mapDraggable&&this._map.dragging.disable(),this._container.style.cursor="crosshair",this._tooltip.updateContent({text:this._initialLabelText}),this._map.on("mousedown",this._onMouseDown,this).on("mousemove",this._onMouseMove,this).on("touchstart",this._onMouseDown,this).on("touchmove",this._onMouseMove,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._mapDraggable&&this._map.dragging.enable(),this._container.style.cursor="",this._map.off("mousedown",this._onMouseDown,this).off("mousemove",this._onMouseMove,this).off("touchstart",this._onMouseDown,this).off("touchmove",this._onMouseMove,this),L.DomEvent.off(e,"mouseup",this._onMouseUp,this),L.DomEvent.off(e,"touchend",this._onMouseUp,this),this._shape&&(this._map.removeLayer(this._shape),delete this._shape)),this._isDrawing=!1},_getTooltipText:function(){return{text:this._endLabelText}},_onMouseDown:function(t){this._isDrawing=!0,this._startLatLng=t.latlng,L.DomEvent.on(e,"mouseup",this._onMouseUp,this).on(e,"touchend",this._onMouseUp,this).preventDefault(t.originalEvent)},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._isDrawing&&(this._tooltip.updateContent(this._getTooltipText()),this._drawShape(e))},_onMouseUp:function(){this._shape&&this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()}}),L.Draw.Rectangle=L.Draw.SimpleShape.extend({statics:{TYPE:"rectangle"},options:{shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},metric:!0},initialize:function(t,e){this.type=L.Draw.Rectangle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.rectangle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},_drawShape:function(t){this._shape?this._shape.setBounds(new L.LatLngBounds(this._startLatLng,t)):(this._shape=new L.Rectangle(new L.LatLngBounds(this._startLatLng,t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Rectangle(this._shape.getBounds(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_getTooltipText:function(){var t,e,i,o=L.Draw.SimpleShape.prototype._getTooltipText.call(this),n=this._shape;return n&&(t=this._shape._defaultShape?this._shape._defaultShape():this._shape.getLatLngs(),e=L.GeometryUtil.geodesicArea(t),i=L.GeometryUtil.readableArea(e,this.options.metric)),{text:o.text,subtext:i}}}),L.Draw.Circle=L.Draw.SimpleShape.extend({statics:{TYPE:"circle"},options:{shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},showRadius:!0,metric:!0,feet:!0},initialize:function(t,e){this.type=L.Draw.Circle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.circle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},_drawShape:function(t){this._shape?this._shape.setRadius(this._startLatLng.distanceTo(t)):(this._shape=new L.Circle(this._startLatLng,this._startLatLng.distanceTo(t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Circle(this._startLatLng,this._shape.getRadius(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_onMouseMove:function(t){var e,i=t.latlng,o=this.options.showRadius,n=this.options.metric;this._tooltip.updatePosition(i),this._isDrawing&&(this._drawShape(i),e=this._shape.getRadius().toFixed(1),this._tooltip.updateContent({text:this._endLabelText,subtext:o?L.drawLocal.draw.handlers.circle.radius+": "+L.GeometryUtil.readableDistance(e,n,this.options.feet):""}))}}),L.Draw.Marker=L.Draw.Feature.extend({statics:{TYPE:"marker"},options:{icon:new L.Icon.Default,repeatMode:!1,zIndexOffset:2e3},initialize:function(t,e){this.type=L.Draw.Marker.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._tooltip.updateContent({text:L.drawLocal.draw.handlers.marker.tooltip.start}),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("click",this._onClick,this).addTo(this._map),this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onTouch,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._marker&&(this._marker.off("click",this._onClick,this),this._map.off("click",this._onClick,this).off("click",this._onTouch,this).removeLayer(this._marker),delete this._marker),this._mouseMarker.off("click",this._onClick,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._map.off("mousemove",this._onMouseMove,this))},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._mouseMarker.setLatLng(e),this._marker?(e=this._mouseMarker.getLatLng(),this._marker.setLatLng(e)):(this._marker=new L.Marker(e,{icon:this.options.icon,zIndexOffset:this.options.zIndexOffset}),this._marker.on("click",this._onClick,this),this._map.on("click",this._onClick,this).addLayer(this._marker))},_onClick:function(){this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()},_onTouch:function(t){this._onMouseMove(t),this._onClick()},_fireCreatedEvent:function(){var t=new L.Marker.Touch(this._marker.getLatLng(),{icon:this.options.icon});L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Edit=L.Edit||{},L.Edit.Marker=L.Handler.extend({initialize:function(t,e){this._marker=t,L.setOptions(this,e)},addHooks:function(){var t=this._marker;t.dragging.enable(),t.on("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},removeHooks:function(){var t=this._marker;t.dragging.disable(),t.off("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},_onDragEnd:function(t){var e=t.target;e.edited=!0,this._map.fire(L.Draw.Event.EDITMOVE,{layer:e})},_toggleMarkerHighlight:function(){var t=this._marker._icon;t&&(t.style.display="none",L.DomUtil.hasClass(t,"leaflet-edit-marker-selected")?(L.DomUtil.removeClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,-4)):(L.DomUtil.addClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,4)),t.style.display="")},_offsetMarker:function(t,e){var i=parseInt(t.style.marginTop,10)-e,o=parseInt(t.style.marginLeft,10)-e;t.style.marginTop=i+"px",t.style.marginLeft=o+"px"}}),L.Marker.addInitHook(function(){L.Edit.Marker&&(this.editing=new L.Edit.Marker(this),this.options.editable&&this.editing.enable())}),L.Edit=L.Edit||{},L.Edit.Poly=L.Handler.extend({options:{},initialize:function(t,e){this.latlngs=[t._latlngs],t._holes&&(this.latlngs=this.latlngs.concat(t._holes)),this._poly=t,L.setOptions(this,e),this._poly.on("revert-edited",this._updateLatLngs,this)},_defaultShape:function(){return L.Polyline._flat?L.Polyline._flat(this._poly._latlngs)?this._poly._latlngs:this._poly._latlngs[0]:this._poly._latlngs},_eachVertexHandler:function(t){for(var e=0;e<this._verticesHandlers.length;e++)t(this._verticesHandlers[e])},addHooks:function(){this._initHandlers(),this._eachVertexHandler(function(t){t.addHooks()})},removeHooks:function(){this._eachVertexHandler(function(t){t.removeHooks()})},updateMarkers:function(){this._eachVertexHandler(function(t){t.updateMarkers()})},_initHandlers:function(){this._verticesHandlers=[];for(var t=0;t<this.latlngs.length;t++)this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly,this.latlngs[t],this.options))},_updateLatLngs:function(t){this.latlngs=[t.layer._latlngs],t.layer._holes&&(this.latlngs=this.latlngs.concat(t.layer._holes))}}),L.Edit.PolyVerticesEdit=L.Handler.extend({options:{icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),drawError:{color:"#b00b00",timeout:1e3}},initialize:function(t,e,i){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this._poly=t,i&&i.drawError&&(i.drawError=L.Util.extend({},this.options.drawError,i.drawError)),this._latlngs=e,L.setOptions(this,i)},_defaultShape:function(){return L.Polyline._flat?L.Polyline._flat(this._latlngs)?this._latlngs:this._latlngs[0]:this._latlngs},addHooks:function(){var t=this._poly;t instanceof L.Polygon||(t.options.fill=!1,t.options.editing&&(t.options.editing.fill=!1)),t.setStyle(t.options.editing),this._poly._map&&(this._map=this._poly._map,this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){var t=this._poly;t.setStyle(t.options.original),t._map&&(t._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._markers=[];var t,e,i,o,n=this._defaultShape();for(t=0,i=n.length;t<i;t++)o=this._createMarker(n[t],t),o.on("click",this._onMarkerClick,this),this._markers.push(o);var s,a;for(t=0,e=i-1;t<i;e=t++)(0!==t||L.Polygon&&this._poly instanceof L.Polygon)&&(s=this._markers[e],a=this._markers[t],this._createMiddleMarker(s,a),this._updatePrevNext(s,a))},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._fireEdit,this).on("touchmove",this._onTouchMove,this).on("touchend",this._fireEdit,this).on("MSPointerMove",this._onTouchMove,this).on("MSPointerUp",this._fireEdit,this),this._markerGroup.addLayer(i),i},_onMarkerDragStart:function(){this._poly.fire("editstart")},_spliceLatLngs:function(){var t=this._defaultShape(),e=[].splice.apply(t,arguments);return this._poly._convertLatLngs(t,!0),this._poly.redraw(),e},_removeMarker:function(t){var e=t._index;this._markerGroup.removeLayer(t),this._markers.splice(e,1),this._spliceLatLngs(e,1),this._updateIndexes(e,-1),t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._fireEdit,this).off("touchmove",this._onMarkerDrag,this).off("touchend",this._fireEdit,this).off("click",this._onMarkerClick,this).off("MSPointerMove",this._onTouchMove,this).off("MSPointerUp",this._fireEdit,this)},_fireEdit:function(){this._poly.edited=!0,this._poly.fire("edit"),this._poly._map.fire(L.Draw.Event.EDITVERTEX,{layers:this._markerGroup})},_onMarkerDrag:function(t){var e=t.target,i=this._poly;if(L.extend(e._origLatLng,e._latlng),e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),i.options.poly){var o=i._map._editTooltip;if(!i.options.poly.allowIntersection&&i.intersects()){var n=i.options.color;i.setStyle({color:this.options.drawError.color}),0!==L.version.indexOf("0.7")&&e.dragging._draggable._onUp(t),this._onMarkerClick(t),o&&o.updateContent({text:L.drawLocal.draw.handlers.polyline.error}),setTimeout(function(){i.setStyle({color:n}),o&&o.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext})},1e3)}}this._poly.redraw(),this._poly.fire("editdrag")},_onMarkerClick:function(t){var e=L.Polygon&&this._poly instanceof L.Polygon?4:3,i=t.target;this._defaultShape().length<e||(this._removeMarker(i),this._updatePrevNext(i._prev,i._next),i._middleLeft&&this._markerGroup.removeLayer(i._middleLeft),i._middleRight&&this._markerGroup.removeLayer(i._middleRight),i._prev&&i._next?this._createMiddleMarker(i._prev,i._next):i._prev?i._next||(i._prev._middleRight=null):i._next._middleLeft=null,this._fireEdit())},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e),o=t.target;L.extend(o._origLatLng,i),o._middleLeft&&o._middleLeft.setLatLng(this._getMiddleLatLng(o._prev,o)),o._middleRight&&o._middleRight.setLatLng(this._getMiddleLatLng(o,o._next)),this._poly.redraw(),this.updateMarkers()},_updateIndexes:function(t,e){this._markerGroup.eachLayer(function(i){i._index>t&&(i._index+=e)})},_createMiddleMarker:function(t,e){var i,o,n,s=this._getMiddleLatLng(t,e),a=this._createMarker(s);a.setOpacity(.6),t._middleRight=e._middleLeft=a,o=function(){a.off("touchmove",o,this);var n=e._index;a._index=n,a.off("click",i,this).on("click",this._onMarkerClick,this),s.lat=a.getLatLng().lat,s.lng=a.getLatLng().lng,this._spliceLatLngs(n,0,s),this._markers.splice(n,0,a),a.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,a),this._updatePrevNext(a,e),this._poly.fire("editstart")},n=function(){a.off("dragstart",o,this),a.off("dragend",n,this),a.off("touchmove",o,this),this._createMiddleMarker(t,a),this._createMiddleMarker(a,e)},i=function(){o.call(this),n.call(this),this._fireEdit()},a.on("click",i,this).on("dragstart",o,this).on("dragend",n,this).on("touchmove",o,this),this._markerGroup.addLayer(a)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,o=i.project(t.getLatLng()),n=i.project(e.getLatLng());return i.unproject(o._add(n)._divideBy(2))}}),L.Polyline.addInitHook(function(){this.editing||(L.Edit.Poly&&(this.editing=new L.Edit.Poly(this,this.options.poly),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()}))}),L.Edit=L.Edit||{},L.Edit.SimpleShape=L.Handler.extend({options:{moveIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move"}),resizeIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize"}),touchMoveIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon"}),touchResizeIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon"})},initialize:function(t,e){L.Browser.touch&&(this.options.moveIcon=this.options.touchMoveIcon,this.options.resizeIcon=this.options.touchResizeIcon),this._shape=t,L.Util.setOptions(this,e)},addHooks:function(){var t=this._shape;this._shape._map&&(this._map=this._shape._map,t.setStyle(t.options.editing),t._map&&(this._map=t._map,this._markerGroup||this._initMarkers(),this._map.addLayer(this._markerGroup)))},removeHooks:function(){var t=this._shape;if(t.setStyle(t.options.original),t._map){this._unbindMarker(this._moveMarker);for(var e=0,i=this._resizeMarkers.length;e<i;e++)this._unbindMarker(this._resizeMarkers[e]);this._resizeMarkers=null,this._map.removeLayer(this._markerGroup),delete this._markerGroup}this._map=null},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._createMoveMarker(),this._createResizeMarker()},_createMoveMarker:function(){},_createResizeMarker:function(){},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:e,zIndexOffset:10});return this._bindMarker(i),this._markerGroup.addLayer(i),i},_bindMarker:function(t){t.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._onMarkerDragEnd,this).on("touchstart",this._onTouchStart,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onTouchEnd,this).on("MSPointerUp",this._onTouchEnd,this)},_unbindMarker:function(t){t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._onMarkerDragEnd,this).off("touchstart",this._onTouchStart,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onTouchEnd,this).off("MSPointerUp",this._onTouchEnd,this)},_onMarkerDragStart:function(t){var e=t.target;e.setOpacity(0),this._shape.fire("editstart")},_fireEdit:function(){this._shape.edited=!0,this._shape.fire("edit")},_onMarkerDrag:function(t){var e=t.target,i=e.getLatLng();e===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),this._shape.fire("editdrag")},_onMarkerDragEnd:function(t){var e=t.target;e.setOpacity(1),this._fireEdit()},_onTouchStart:function(t){if(L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t),"function"==typeof this._getCorners){var e=this._getCorners(),i=t.target,o=i._cornerIndex;i.setOpacity(0),this._oppositeCorner=e[(o+2)%4],this._toggleCornerMarkers(0,o)}this._shape.fire("editstart")},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e),o=t.target;return o===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),!1},_onTouchEnd:function(t){var e=t.target;e.setOpacity(1),this.updateMarkers(),this._fireEdit()},_move:function(){},_resize:function(){}}),L.Edit=L.Edit||{},L.Edit.Rectangle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getBounds(),e=t.getCenter();this._moveMarker=this._createMarker(e,this.options.moveIcon)},_createResizeMarker:function(){var t=this._getCorners();this._resizeMarkers=[];for(var e=0,i=t.length;e<i;e++)this._resizeMarkers.push(this._createMarker(t[e],this.options.resizeIcon)),this._resizeMarkers[e]._cornerIndex=e},_onMarkerDragStart:function(t){L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t);var e=this._getCorners(),i=t.target,o=i._cornerIndex;this._oppositeCorner=e[(o+2)%4],this._toggleCornerMarkers(0,o)},_onMarkerDragEnd:function(t){var e,i,o=t.target;o===this._moveMarker&&(e=this._shape.getBounds(),i=e.getCenter(),o.setLatLng(i)),this._toggleCornerMarkers(1),this._repositionCornerMarkers(),L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this,t)},_move:function(t){for(var e,i=this._shape._defaultShape?this._shape._defaultShape():this._shape.getLatLngs(),o=this._shape.getBounds(),n=o.getCenter(),s=[],a=0,r=i.length;a<r;a++)e=[i[a].lat-n.lat,i[a].lng-n.lng],s.push([t.lat+e[0],t.lng+e[1]]);this._shape.setLatLngs(s),this._repositionCornerMarkers(),this._map.fire(L.Draw.Event.EDITMOVE,{layer:this._shape})},_resize:function(t){var e;this._shape.setBounds(L.latLngBounds(t,this._oppositeCorner)),e=this._shape.getBounds(),this._moveMarker.setLatLng(e.getCenter()),this._map.fire(L.Draw.Event.EDITRESIZE,{layer:this._shape})},_getCorners:function(){var t=this._shape.getBounds(),e=t.getNorthWest(),i=t.getNorthEast(),o=t.getSouthEast(),n=t.getSouthWest(); | ||
return[e,i,o,n]},_toggleCornerMarkers:function(t){for(var e=0,i=this._resizeMarkers.length;e<i;e++)this._resizeMarkers[e].setOpacity(t)},_repositionCornerMarkers:function(){for(var t=this._getCorners(),e=0,i=this._resizeMarkers.length;e<i;e++)this._resizeMarkers[e].setLatLng(t[e])}}),L.Rectangle.addInitHook(function(){L.Edit.Rectangle&&(this.editing=new L.Edit.Rectangle(this),this.options.editable&&this.editing.enable())}),L.Edit=L.Edit||{},L.Edit.Circle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getLatLng();this._moveMarker=this._createMarker(t,this.options.moveIcon)},_createResizeMarker:function(){var t=this._shape.getLatLng(),e=this._getResizeMarkerPoint(t);this._resizeMarkers=[],this._resizeMarkers.push(this._createMarker(e,this.options.resizeIcon))},_getResizeMarkerPoint:function(t){var e=this._shape._radius*Math.cos(Math.PI/4),i=this._map.project(t);return this._map.unproject([i.x+e,i.y-e])},_move:function(t){var e=this._getResizeMarkerPoint(t);this._resizeMarkers[0].setLatLng(e),this._shape.setLatLng(t),this._map.fire(L.Draw.Event.EDITMOVE,{layer:this._shape})},_resize:function(t){var e=this._moveMarker.getLatLng(),i=e.distanceTo(t);this._shape.setRadius(i),this._map.fire(L.Draw.Event.EDITRESIZE,{layer:this._shape})}}),L.Circle.addInitHook(function(){L.Edit.Circle&&(this.editing=new L.Edit.Circle(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})}),L.Map.mergeOptions({touchExtend:!0}),L.Map.TouchExtend=L.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){L.DomEvent.on(this._container,"touchstart",this._onTouchStart,this),L.DomEvent.on(this._container,"touchend",this._onTouchEnd,this),L.DomEvent.on(this._container,"touchmove",this._onTouchMove,this),this._detectIE()?(L.DomEvent.on(this._container,"MSPointerDown",this._onTouchStart,this),L.DomEvent.on(this._container,"MSPointerUp",this._onTouchEnd,this),L.DomEvent.on(this._container,"MSPointerMove",this._onTouchMove,this),L.DomEvent.on(this._container,"MSPointerCancel",this._onTouchCancel,this)):(L.DomEvent.on(this._container,"touchcancel",this._onTouchCancel,this),L.DomEvent.on(this._container,"touchleave",this._onTouchLeave,this))},removeHooks:function(){L.DomEvent.off(this._container,"touchstart",this._onTouchStart),L.DomEvent.off(this._container,"touchend",this._onTouchEnd),L.DomEvent.off(this._container,"touchmove",this._onTouchMove),this._detectIE()?(L.DomEvent.off(this._container,"MSPointerDowm",this._onTouchStart),L.DomEvent.off(this._container,"MSPointerUp",this._onTouchEnd),L.DomEvent.off(this._container,"MSPointerMove",this._onTouchMove),L.DomEvent.off(this._container,"MSPointerCancel",this._onTouchCancel)):(L.DomEvent.off(this._container,"touchcancel",this._onTouchCancel),L.DomEvent.off(this._container,"touchleave",this._onTouchLeave))},_touchEvent:function(t,e){var i={};if("undefined"!=typeof t.touches){if(!t.touches.length)return;i=t.touches[0]}else{if("touch"!==t.pointerType)return;if(i=t,!this._filterClick(t))return}var o=this._map.mouseEventToContainerPoint(i),n=this._map.mouseEventToLayerPoint(i),s=this._map.layerPointToLatLng(n);this._map.fire(e,{latlng:s,layerPoint:n,containerPoint:o,pageX:i.pageX,pageY:i.pageY,originalEvent:t})},_filterClick:function(t){var e=t.timeStamp||t.originalEvent.timeStamp,i=L.DomEvent._lastClick&&e-L.DomEvent._lastClick;return i&&i>100&&i<500||t.target._simulatedClick&&!t._simulated?(L.DomEvent.stop(t),!1):(L.DomEvent._lastClick=e,!0)},_onTouchStart:function(t){if(this._map._loaded){var e="touchstart";this._touchEvent(t,e)}},_onTouchEnd:function(t){if(this._map._loaded){var e="touchend";this._touchEvent(t,e)}},_onTouchCancel:function(t){if(this._map._loaded){var e="touchcancel";this._detectIE()&&(e="pointercancel"),this._touchEvent(t,e)}},_onTouchLeave:function(t){if(this._map._loaded){var e="touchleave";this._touchEvent(t,e)}},_onTouchMove:function(t){if(this._map._loaded){var e="touchmove";this._touchEvent(t,e)}},_detectIE:function(){var e=t.navigator.userAgent,i=e.indexOf("MSIE ");if(i>0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);var o=e.indexOf("Trident/");if(o>0){var n=e.indexOf("rv:");return parseInt(e.substring(n+3,e.indexOf(".",n)),10)}var s=e.indexOf("Edge/");return s>0&&parseInt(e.substring(s+5,e.indexOf(".",s)),10)}}),L.Map.addInitHook("addHandler","touchExtend",L.Map.TouchExtend),L.Marker.Touch=L.Marker.extend({_initInteraction:function(){return this.addInteractiveTarget?L.Marker.prototype._initInteraction.apply(this):this._initInteractionLegacy()},_initInteractionLegacy:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu","touchstart","touchend","touchmove"];this._detectIE?e.concat(["MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel"]):e.concat(["touchcancel"]),L.DomUtil.addClass(t,"leaflet-clickable"),L.DomEvent.on(t,"click",this._onMouseClick,this),L.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;i<e.length;i++)L.DomEvent.on(t,e[i],this._fireMouseEvent,this);L.Handler.MarkerDrag&&(this.dragging=new L.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_detectIE:function(){var e=t.navigator.userAgent,i=e.indexOf("MSIE ");if(i>0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);var o=e.indexOf("Trident/");if(o>0){var n=e.indexOf("rv:");return parseInt(e.substring(n+3,e.indexOf(".",n)),10)}var s=e.indexOf("Edge/");return s>0&&parseInt(e.substring(s+5,e.indexOf(".",s)),10)}}),L.LatLngUtil={cloneLatLngs:function(t){for(var e=[],i=0,o=t.length;i<o;i++)Array.isArray(t[i])?e.push(L.LatLngUtil.cloneLatLngs(t[i])):e.push(this.cloneLatLng(t[i]));return e},cloneLatLng:function(t){return L.latLng(t.lat,t.lng)}},L.GeometryUtil=L.extend(L.GeometryUtil||{},{geodesicArea:function(t){var e,i,o=t.length,n=0,s=Math.PI/180;if(o>2){for(var a=0;a<o;a++)e=t[a],i=t[(a+1)%o],n+=(i.lng-e.lng)*s*(2+Math.sin(e.lat*s)+Math.sin(i.lat*s));n=6378137*n*6378137/2}return Math.abs(n)},readableArea:function(t,e){var i;return e?i=t>=1e4?(1e-4*t).toFixed(2)+" ha":t.toFixed(2)+" m²":(t/=.836127,i=t>=3097600?(t/3097600).toFixed(2)+" mi²":t>=4840?(t/4840).toFixed(2)+" acres":Math.ceil(t)+" yd²"),i},readableDistance:function(t,e,i){var o;if(e)o=t>1e3?(t/1e3).toFixed(2)+" km":Math.ceil(t)+" m";else if(t*=1.09361,t>1760)o=(t/1760).toFixed(2)+" miles";else{var n=" yd";i&&(t*=3,n=" ft"),o=Math.ceil(t)+n}return o}}),L.Util.extend(L.LineUtil,{segmentsIntersect:function(t,e,i,o){return this._checkCounterclockwise(t,i,o)!==this._checkCounterclockwise(e,i,o)&&this._checkCounterclockwise(t,e,i)!==this._checkCounterclockwise(t,e,o)},_checkCounterclockwise:function(t,e,i){return(i.y-t.y)*(e.x-t.x)>(e.y-t.y)*(i.x-t.x)}}),L.Polyline.include({intersects:function(){var t,e,i,o=this._getProjectedPoints(),n=o?o.length:0;if(this._tooFewPointsForIntersection())return!1;for(t=n-1;t>=3;t--)if(e=o[t-1],i=o[t],this._lineSegmentsIntersectsRange(e,i,t-2))return!0;return!1},newLatLngIntersects:function(t,e){return!!this._map&&this.newPointIntersects(this._map.latLngToLayerPoint(t),e)},newPointIntersects:function(t,e){var i=this._getProjectedPoints(),o=i?i.length:0,n=i?i[o-1]:null,s=o-2;return!this._tooFewPointsForIntersection(1)&&this._lineSegmentsIntersectsRange(n,t,s,e?1:0)},_tooFewPointsForIntersection:function(t){var e=this._getProjectedPoints(),i=e?e.length:0;return i+=t||0,!e||i<=3},_lineSegmentsIntersectsRange:function(t,e,i,o){var n,s,a=this._getProjectedPoints();o=o||0;for(var r=i;r>o;r--)if(n=a[r-1],s=a[r],L.LineUtil.segmentsIntersect(t,e,n,s))return!0;return!1},_getProjectedPoints:function(){if(!this._defaultShape)return this._originalPoints;for(var t=[],e=this._defaultShape(),i=0;i<e.length;i++)t.push(this._map.latLngToLayerPoint(e[i]));return t}}),L.Polygon.include({intersects:function(){var t,e,i,o,n,s=this._getProjectedPoints();return!this._tooFewPointsForIntersection()&&(!!(t=L.Polyline.prototype.intersects.call(this))||(e=s.length,i=s[0],o=s[e-1],n=e-2,this._lineSegmentsIntersectsRange(o,i,n,1)))}}),L.Control.Draw=L.Control.extend({options:{position:"topleft",draw:{},edit:!1},initialize:function(t){if(L.version<"0.7")throw new Error("Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/");L.Control.prototype.initialize.call(this,t);var e;this._toolbars={},L.DrawToolbar&&this.options.draw&&(e=new L.DrawToolbar(this.options.draw),this._toolbars[L.DrawToolbar.TYPE]=e,this._toolbars[L.DrawToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.EditToolbar&&this.options.edit&&(e=new L.EditToolbar(this.options.edit),this._toolbars[L.EditToolbar.TYPE]=e,this._toolbars[L.EditToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.toolbar=this},onAdd:function(t){var e,i=L.DomUtil.create("div","leaflet-draw"),o=!1,n="leaflet-draw-toolbar-top";for(var s in this._toolbars)this._toolbars.hasOwnProperty(s)&&(e=this._toolbars[s].addToolbar(t),e&&(o||(L.DomUtil.hasClass(e,n)||L.DomUtil.addClass(e.childNodes[0],n),o=!0),i.appendChild(e)));return i},onRemove:function(){for(var t in this._toolbars)this._toolbars.hasOwnProperty(t)&&this._toolbars[t].removeToolbar()},setDrawingOptions:function(t){for(var e in this._toolbars)this._toolbars[e]instanceof L.DrawToolbar&&this._toolbars[e].setOptions(t)},_toolbarEnabled:function(t){var e=t.target;for(var i in this._toolbars)this._toolbars[i]!==e&&this._toolbars[i].disable()}}),L.Map.mergeOptions({drawControlTooltips:!0,drawControl:!1}),L.Map.addInitHook(function(){this.options.drawControl&&(this.drawControl=new L.Control.Draw,this.addControl(this.drawControl))}),L.Toolbar=L.Class.extend({includes:[L.Mixin.Events],initialize:function(t){L.setOptions(this,t),this._modes={},this._actionButtons=[],this._activeMode=null},enabled:function(){return null!==this._activeMode},disable:function(){this.enabled()&&this._activeMode.handler.disable()},addToolbar:function(t){var e,i=L.DomUtil.create("div","leaflet-draw-section"),o=0,n=this._toolbarClass||"",s=this.getModeHandlers(t);for(this._toolbarContainer=L.DomUtil.create("div","leaflet-draw-toolbar leaflet-bar"),this._map=t,e=0;e<s.length;e++)s[e].enabled&&this._initModeHandler(s[e].handler,this._toolbarContainer,o++,n,s[e].title);if(o)return this._lastButtonIndex=--o,this._actionsContainer=L.DomUtil.create("ul","leaflet-draw-actions"),i.appendChild(this._toolbarContainer),i.appendChild(this._actionsContainer),i},removeToolbar:function(){for(var t in this._modes)this._modes.hasOwnProperty(t)&&(this._disposeButton(this._modes[t].button,this._modes[t].handler.enable,this._modes[t].handler),this._modes[t].handler.disable(),this._modes[t].handler.off("enabled",this._handlerActivated,this).off("disabled",this._handlerDeactivated,this));this._modes={};for(var e=0,i=this._actionButtons.length;e<i;e++)this._disposeButton(this._actionButtons[e].button,this._actionButtons[e].callback,this);this._actionButtons=[],this._actionsContainer=null},_initModeHandler:function(t,e,i,o,n){var s=t.type;this._modes[s]={},this._modes[s].handler=t,this._modes[s].button=this._createButton({type:s,title:n,className:o+"-"+s,container:e,callback:this._modes[s].handler.enable,context:this._modes[s].handler}),this._modes[s].buttonIndex=i,this._modes[s].handler.on("enabled",this._handlerActivated,this).on("disabled",this._handlerDeactivated,this)},_createButton:function(t){var e=L.DomUtil.create("a",t.className||"",t.container);return e.href="#",t.text&&(e.innerHTML=t.text),t.title&&(e.title=t.title),L.DomEvent.on(e,"click",L.DomEvent.stopPropagation).on(e,"mousedown",L.DomEvent.stopPropagation).on(e,"dblclick",L.DomEvent.stopPropagation).on(e,"click",L.DomEvent.preventDefault).on(e,"click",t.callback,t.context),e},_disposeButton:function(t,e){L.DomEvent.off(t,"click",L.DomEvent.stopPropagation).off(t,"mousedown",L.DomEvent.stopPropagation).off(t,"dblclick",L.DomEvent.stopPropagation).off(t,"click",L.DomEvent.preventDefault).off(t,"click",e)},_handlerActivated:function(t){this.disable(),this._activeMode=this._modes[t.handler],L.DomUtil.addClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._showActionsToolbar(),this.fire("enable")},_handlerDeactivated:function(){this._hideActionsToolbar(),L.DomUtil.removeClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._activeMode=null,this.fire("disable")},_createActions:function(t){var e,i,o,n,s=this._actionsContainer,a=this.getActions(t),r=a.length;for(i=0,o=this._actionButtons.length;i<o;i++)this._disposeButton(this._actionButtons[i].button,this._actionButtons[i].callback);for(this._actionButtons=[];s.firstChild;)s.removeChild(s.firstChild);for(var h=0;h<r;h++)"enabled"in a[h]&&!a[h].enabled||(e=L.DomUtil.create("li","",s),n=this._createButton({title:a[h].title,text:a[h].text,container:e,callback:a[h].callback,context:a[h].context}),this._actionButtons.push({button:n,callback:a[h].callback}))},_showActionsToolbar:function(){var t=this._activeMode.buttonIndex,e=this._lastButtonIndex,i=this._activeMode.button.offsetTop-1;this._createActions(this._activeMode.handler),this._actionsContainer.style.top=i+"px",0===t&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-top")),t===e&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-bottom")),this._actionsContainer.style.display="block"},_hideActionsToolbar:function(){this._actionsContainer.style.display="none",L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-top"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-bottom")}}),L.Draw=L.Draw||{},L.Draw.Tooltip=L.Class.extend({initialize:function(t){this._map=t,this._popupPane=t._panes.popupPane,this._container=t.options.drawControlTooltips?L.DomUtil.create("div","leaflet-draw-tooltip",this._popupPane):null,this._singleLineLabel=!1,this._map.on("mouseout",this._onMouseOut,this)},dispose:function(){this._map.off("mouseout",this._onMouseOut,this),this._container&&(this._popupPane.removeChild(this._container),this._container=null)},updateContent:function(t){return this._container?(t.subtext=t.subtext||"",0!==t.subtext.length||this._singleLineLabel?t.subtext.length>0&&this._singleLineLabel&&(L.DomUtil.removeClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!1):(L.DomUtil.addClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!0),this._container.innerHTML=(t.subtext.length>0?'<span class="leaflet-draw-tooltip-subtext">'+t.subtext+"</span><br />":"")+"<span>"+t.text+"</span>",this):this},updatePosition:function(t){var e=this._map.latLngToLayerPoint(t),i=this._container;return this._container&&(i.style.visibility="inherit",L.DomUtil.setPosition(i,e)),this},showAsError:function(){return this._container&&L.DomUtil.addClass(this._container,"leaflet-error-draw-tooltip"),this},removeError:function(){return this._container&&L.DomUtil.removeClass(this._container,"leaflet-error-draw-tooltip"),this},_onMouseOut:function(){this._container&&(this._container.style.visibility="hidden")}}),L.DrawToolbar=L.Toolbar.extend({statics:{TYPE:"draw"},options:{polyline:{},polygon:{},rectangle:{},circle:{},marker:{}},initialize:function(t){for(var e in this.options)this.options.hasOwnProperty(e)&&t[e]&&(t[e]=L.extend({},this.options[e],t[e]));this._toolbarClass="leaflet-draw-draw",L.Toolbar.prototype.initialize.call(this,t)},getModeHandlers:function(t){return[{enabled:this.options.polyline,handler:new L.Draw.Polyline(t,this.options.polyline),title:L.drawLocal.draw.toolbar.buttons.polyline},{enabled:this.options.polygon,handler:new L.Draw.Polygon(t,this.options.polygon),title:L.drawLocal.draw.toolbar.buttons.polygon},{enabled:this.options.rectangle,handler:new L.Draw.Rectangle(t,this.options.rectangle),title:L.drawLocal.draw.toolbar.buttons.rectangle},{enabled:this.options.circle,handler:new L.Draw.Circle(t,this.options.circle),title:L.drawLocal.draw.toolbar.buttons.circle},{enabled:this.options.marker,handler:new L.Draw.Marker(t,this.options.marker),title:L.drawLocal.draw.toolbar.buttons.marker}]},getActions:function(t){return[{enabled:t.completeShape,title:L.drawLocal.draw.toolbar.finish.title,text:L.drawLocal.draw.toolbar.finish.text,callback:t.completeShape,context:t},{enabled:t.deleteLastVertex,title:L.drawLocal.draw.toolbar.undo.title,text:L.drawLocal.draw.toolbar.undo.text,callback:t.deleteLastVertex,context:t},{title:L.drawLocal.draw.toolbar.actions.title,text:L.drawLocal.draw.toolbar.actions.text,callback:this.disable,context:this}]},setOptions:function(t){L.setOptions(this,t);for(var e in this._modes)this._modes.hasOwnProperty(e)&&t.hasOwnProperty(e)&&this._modes[e].handler.setOptions(t[e])}}),L.EditToolbar=L.Toolbar.extend({statics:{TYPE:"edit"},options:{edit:{selectedPathOptions:{dashArray:"10, 10",fill:!0,fillColor:"#fe57a1",fillOpacity:.1,maintainColor:!1}},remove:{},poly:null,featureGroup:null},initialize:function(t){t.edit&&("undefined"==typeof t.edit.selectedPathOptions&&(t.edit.selectedPathOptions=this.options.edit.selectedPathOptions),t.edit.selectedPathOptions=L.extend({},this.options.edit.selectedPathOptions,t.edit.selectedPathOptions)),t.remove&&(t.remove=L.extend({},this.options.remove,t.remove)),t.poly&&(t.poly=L.extend({},this.options.poly,t.poly)),this._toolbarClass="leaflet-draw-edit",L.Toolbar.prototype.initialize.call(this,t),this._selectedFeatureCount=0},getModeHandlers:function(t){var e=this.options.featureGroup;return[{enabled:this.options.edit,handler:new L.EditToolbar.Edit(t,{featureGroup:e,selectedPathOptions:this.options.edit.selectedPathOptions,poly:this.options.poly}),title:L.drawLocal.edit.toolbar.buttons.edit},{enabled:this.options.remove,handler:new L.EditToolbar.Delete(t,{featureGroup:e}),title:L.drawLocal.edit.toolbar.buttons.remove}]},getActions:function(){return[{title:L.drawLocal.edit.toolbar.actions.save.title,text:L.drawLocal.edit.toolbar.actions.save.text,callback:this._save,context:this},{title:L.drawLocal.edit.toolbar.actions.cancel.title,text:L.drawLocal.edit.toolbar.actions.cancel.text,callback:this.disable,context:this}]},addToolbar:function(t){var e=L.Toolbar.prototype.addToolbar.call(this,t);return this._checkDisabled(),this.options.featureGroup.on("layeradd layerremove",this._checkDisabled,this),e},removeToolbar:function(){this.options.featureGroup.off("layeradd layerremove",this._checkDisabled,this),L.Toolbar.prototype.removeToolbar.call(this)},disable:function(){this.enabled()&&(this._activeMode.handler.revertLayers(),L.Toolbar.prototype.disable.call(this))},_save:function(){this._activeMode.handler.save(),this._activeMode&&this._activeMode.handler.disable()},_checkDisabled:function(){var t,e=this.options.featureGroup,i=0!==e.getLayers().length;this.options.edit&&(t=this._modes[L.EditToolbar.Edit.TYPE].button,i?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",i?L.drawLocal.edit.toolbar.buttons.edit:L.drawLocal.edit.toolbar.buttons.editDisabled)),this.options.remove&&(t=this._modes[L.EditToolbar.Delete.TYPE].button,i?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",i?L.drawLocal.edit.toolbar.buttons.remove:L.drawLocal.edit.toolbar.buttons.removeDisabled))}}),L.EditToolbar.Edit=L.Handler.extend({statics:{TYPE:"edit"},includes:L.Mixin.Events,initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.setOptions(this,e),this._featureGroup=e.featureGroup,!(this._featureGroup instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this._uneditedLayerProps={},this.type=L.EditToolbar.Edit.TYPE},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire(L.Draw.Event.EDITSTART,{handler:this.type}),L.Handler.prototype.enable.call(this),this._featureGroup.on("layeradd",this._enableLayerEdit,this).on("layerremove",this._disableLayerEdit,this))},disable:function(){this._enabled&&(this._featureGroup.off("layeradd",this._enableLayerEdit,this).off("layerremove",this._disableLayerEdit,this),L.Handler.prototype.disable.call(this),this._map.fire(L.Draw.Event.EDITSTOP,{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._featureGroup.eachLayer(this._enableLayerEdit,this),this._tooltip=new L.Draw.Tooltip(this._map),this._tooltip.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext}),t._editTooltip=this._tooltip,this._updateTooltip(),this._map.on("mousemove",this._onMouseMove,this).on("touchmove",this._onMouseMove,this).on("MSPointerMove",this._onMouseMove,this).on(L.Draw.Event.EDITVERTEX,this._updateTooltip,this))},removeHooks:function(){this._map&&(this._featureGroup.eachLayer(this._disableLayerEdit,this),this._uneditedLayerProps={},this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this).off("touchmove",this._onMouseMove,this).off("MSPointerMove",this._onMouseMove,this).off(L.Draw.Event.EDITVERTEX,this._updateTooltip,this))},revertLayers:function(){this._featureGroup.eachLayer(function(t){this._revertLayer(t)},this)},save:function(){var t=new L.LayerGroup;this._featureGroup.eachLayer(function(e){e.edited&&(t.addLayer(e),e.edited=!1)}),this._map.fire(L.Draw.Event.EDITED,{layers:t})},_backupLayer:function(t){var e=L.Util.stamp(t);this._uneditedLayerProps[e]||(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?this._uneditedLayerProps[e]={latlngs:L.LatLngUtil.cloneLatLngs(t.getLatLngs())}:t instanceof L.Circle?this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng()),radius:t.getRadius()}:t instanceof L.Marker&&(this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng())}))},_getTooltipText:function(){return{text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext}},_updateTooltip:function(){this._tooltip.updateContent(this._getTooltipText())},_revertLayer:function(t){var e=L.Util.stamp(t);t.edited=!1,this._uneditedLayerProps.hasOwnProperty(e)&&(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?t.setLatLngs(this._uneditedLayerProps[e].latlngs):t instanceof L.Circle?(t.setLatLng(this._uneditedLayerProps[e].latlng),t.setRadius(this._uneditedLayerProps[e].radius)):t instanceof L.Marker&&t.setLatLng(this._uneditedLayerProps[e].latlng),t.fire("revert-edited",{layer:t}))},_enableLayerEdit:function(t){var e,i,o=t.layer||t.target||t;this._backupLayer(o),this.options.poly&&(i=L.Util.extend({},this.options.poly),o.options.poly=i),this.options.selectedPathOptions&&(e=L.Util.extend({},this.options.selectedPathOptions),e.maintainColor&&(e.color=o.options.color,e.fillColor=o.options.fillColor),o.options.original=L.extend({},o.options),o.options.editing=e),o instanceof L.Marker?(o.editing&&o.editing.enable(),o.dragging.enable(),o.on("dragend",this._onMarkerDragEnd).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onMarkerDragEnd,this).on("MSPointerUp",this._onMarkerDragEnd,this)):o.editing.enable()},_disableLayerEdit:function(t){var e=t.layer||t.target||t;e.edited=!1,e.editing&&e.editing.disable(),delete e.options.editing,delete e.options.original,this._selectedPathOptions&&(e instanceof L.Marker?this._toggleMarkerHighlight(e):(e.setStyle(e.options.previousOptions),delete e.options.previousOptions)),e instanceof L.Marker?(e.dragging.disable(),e.off("dragend",this._onMarkerDragEnd,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onMarkerDragEnd,this).off("MSPointerUp",this._onMarkerDragEnd,this)):e.editing.disable()},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_onMarkerDragEnd:function(t){var e=t.target;e.edited=!0,this._map.fire(L.Draw.Event.EDITMOVE,{layer:e})},_onTouchMove:function(t){var e=t.originalEvent.changedTouches[0],i=this._map.mouseEventToLayerPoint(e),o=this._map.layerPointToLatLng(i);t.target.setLatLng(o)},_hasAvailableLayers:function(){return 0!==this._featureGroup.getLayers().length}}),L.EditToolbar.Delete=L.Handler.extend({statics:{TYPE:"remove"},includes:L.Mixin.Events,initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.Util.setOptions(this,e),this._deletableLayers=this.options.featureGroup,!(this._deletableLayers instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this.type=L.EditToolbar.Delete.TYPE},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire(L.Draw.Event.DELETESTART,{handler:this.type}),L.Handler.prototype.enable.call(this),this._deletableLayers.on("layeradd",this._enableLayerDelete,this).on("layerremove",this._disableLayerDelete,this))},disable:function(){this._enabled&&(this._deletableLayers.off("layeradd",this._enableLayerDelete,this).off("layerremove",this._disableLayerDelete,this),L.Handler.prototype.disable.call(this),this._map.fire(L.Draw.Event.DELETESTOP,{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._deletableLayers.eachLayer(this._enableLayerDelete,this),this._deletedLayers=new L.LayerGroup,this._tooltip=new L.Draw.Tooltip(this._map),this._tooltip.updateContent({text:L.drawLocal.edit.handlers.remove.tooltip.text}),this._map.on("mousemove",this._onMouseMove,this))},removeHooks:function(){this._map&&(this._deletableLayers.eachLayer(this._disableLayerDelete,this),this._deletedLayers=null,this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this))},revertLayers:function(){this._deletedLayers.eachLayer(function(t){this._deletableLayers.addLayer(t),t.fire("revert-deleted",{layer:t})},this)},save:function(){this._map.fire(L.Draw.Event.DELETED,{layers:this._deletedLayers})},_enableLayerDelete:function(t){var e=t.layer||t.target||t;e.on("click",this._removeLayer,this)},_disableLayerDelete:function(t){var e=t.layer||t.target||t;e.off("click",this._removeLayer,this),this._deletedLayers.removeLayer(e)},_removeLayer:function(t){var e=t.layer||t.target||t;this._deletableLayers.removeLayer(e),this._deletedLayers.addLayer(e),e.fire("deleted")},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_hasAvailableLayers:function(){return 0!==this._deletableLayers.getLayers().length}})}(window,document); |
/* | ||
Leaflet.draw building and linting scripts. | ||
Leaflet.draw building and linting scripts. | ||
To use, install Node, then run the following commands in the project root: | ||
To use, install Node, then run the following commands in the project root: | ||
npm install -g jake | ||
npm install | ||
npm install -g jake | ||
npm install | ||
To check the code for errors and build Leaflet from source, run "jake". | ||
To run the tests, run "jake test". | ||
To check the code for errors and build Leaflet from source, run "jake". | ||
To run the tests, run "jake test". To build the documentation, run "jake docs". | ||
For a custom build, open build/build.html in the browser and follow the instructions. | ||
*/ | ||
For a custom build, open build/build.html in the browser and follow the instructions. | ||
*/ | ||
var build = require('./build/build.js'); | ||
var build = require('./build/build.js'), | ||
buildDocs = require('./build/docs'), | ||
git = require('git-rev'); | ||
function hint(msg, paths) { | ||
function hint(msg, args) { | ||
return function () { | ||
console.log(msg); | ||
jake.exec('node node_modules/jshint/bin/jshint -c ' + paths, | ||
{printStdout: true}, function () { | ||
console.log('\tCheck passed.\n'); | ||
complete(); | ||
}); | ||
jake.exec('node node_modules/eslint/bin/eslint.js ' + args, | ||
{printStdout: true}, function () { | ||
console.log('\tCheck passed.\n'); | ||
complete(); | ||
}); | ||
}; | ||
} | ||
desc('Check Leaflet.draw source for errors with JSHint'); | ||
task('lint', {async: true}, hint('Checking for JS errors...', 'build/hintrc.js src')); | ||
// Returns the version string in package.json, plus a semver build metadata if | ||
// this is not an official release | ||
function calculateVersion(officialRelease, callback) { | ||
var version = require('./package.json').version; | ||
desc('Check Leaflet.draw specs source for errors with JSHint'); | ||
task('lintspec', {async: true}, hint('Checking for specs JS errors...', 'spec/spec.hintrc.js spec/suites')); | ||
if (officialRelease) { | ||
callback(version); | ||
} else { | ||
git.short(function (str) { | ||
callback(version + '+' + str); | ||
}); | ||
} | ||
} | ||
desc('Combine and compress Leaflet.draw source files'); | ||
task('build', {async: true}, function () { | ||
build.build(complete); | ||
desc('Check Leaflet.draw source for errors with ESHint'); | ||
task('lint', {async: true}, hint('Checking for JS errors...', 'src')); | ||
desc('Check Leaflet.draw specs source for errors with ESLint'); | ||
task('lintspec', {async: true}, hint('Checking for specs JS errors...', 'spec/suites')); | ||
desc('Combine and compress Leaflet Draw source files'); | ||
task('build', {async: true}, function (compsBase32, buildName, officialRelease) { | ||
calculateVersion(officialRelease, function (v) { | ||
build.build(complete, v, compsBase32, buildName); | ||
}); | ||
}); | ||
@@ -44,6 +63,11 @@ | ||
task('default', ['test', 'build']); | ||
desc('Build documentation'); | ||
task('docs', {}, function () { | ||
buildDocs(); | ||
}); | ||
task('default', ['build', 'test']); | ||
jake.addListener('complete', function () { | ||
process.exit(); | ||
}); |
@@ -1,2 +0,2 @@ | ||
Copyright 2012-2016 Jacob Toye and Leaflet | ||
Copyright 2012-2017 Jacob Toye and Leaflet | ||
@@ -3,0 +3,0 @@ Permission is hereby granted, free of charge, to any person obtaining |
{ | ||
"name": "leaflet-draw", | ||
"version": "0.4.1", | ||
"version": "0.4.2", | ||
"description": "Vector drawing plugin for Leaflet", | ||
@@ -8,13 +8,22 @@ "devDependencies": { | ||
"jake": "^8.0.15", | ||
"jshint": "^2.9.3", | ||
"eslint": "^3.5.0 <3.6.0", | ||
"eslint-config-mourner": "^2.0.1", | ||
"karma": "^1.3.0", | ||
"karma-coverage": "^1.1.1", | ||
"karma-chrome-launcher": "^2.0.0", | ||
"karma-coverage": "~1.1.1", | ||
"karma-firefox-launcher": "~1.0.0", | ||
"karma-mocha": "^1.2.0", | ||
"karma-phantomjs-launcher": "^1.0.2", | ||
"leaflet": "~0.7.0", | ||
"karma-safari-launcher": "~1.0.0", | ||
"leafdoc": "^1.4.0", | ||
"leaflet": "~1.0.0", | ||
"mocha": "^3.1.2", | ||
"phantomjs": "^2.1.7", | ||
"uglify-js": "^2.7.3" | ||
"phantomjs-prebuilt": "^2.1.12", | ||
"prosthetic-hand": "^1.3.1", | ||
"uglify-js": "^2.7.3", | ||
"source-map": "^0.5.6", | ||
"git-rev": "^0.2.1" | ||
}, | ||
"main": "dist/leaflet.draw.js", | ||
"style": "dist/leaflet.draw.css", | ||
"directories": { | ||
@@ -24,4 +33,6 @@ "example": "examples" | ||
"scripts": { | ||
"build": "jake", | ||
"test": "jake test" | ||
"build": "jake build", | ||
"test": "jake test", | ||
"docs": "jake docs", | ||
"release": "./build/publish.sh" | ||
}, | ||
@@ -50,3 +61,35 @@ "repository": { | ||
"license": "MIT", | ||
"readmeFilename": "README.md" | ||
"readmeFilename": "README.md", | ||
"eslintConfig": { | ||
"root": true, | ||
"globals": { | ||
"L": true | ||
}, | ||
"env": { | ||
"commonjs": true, | ||
"amd": true, | ||
"node": false | ||
}, | ||
"extends": "mourner", | ||
"rules": { | ||
"no-mixed-spaces-and-tabs": [ | ||
2, | ||
"smart-tabs" | ||
], | ||
"indent": [ | ||
2, | ||
"tab", | ||
{ | ||
"VariableDeclarator": 0 | ||
} | ||
], | ||
"curly": 2, | ||
"spaced-comment": 2, | ||
"strict": 0, | ||
"wrap-iife": 0, | ||
"key-spacing": 0, | ||
"consistent-return": 0 | ||
} | ||
} | ||
} |
557
README.md
@@ -1,14 +0,19 @@ | ||
|Build Status|Leaflet.draw Chat|Leaflet Chat| | ||
|---|---|---| | ||
|[![Build Status](https://travis-ci.org/Leaflet/Leaflet.draw.svg?branch=master)](https://travis-ci.org/Leaflet/Leaflet.draw)|[![Leaflet.draw Chat](https://badges.gitter.im/Leaflet/Leaflet.draw.svg)](https://gitter.im/Leaflet/Leaflet.draw?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)|[![Leaflet Chat](https://badges.gitter.im/Leaflet/Leaflet.svg)](https://gitter.im/Leaflet/Leaflet?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)| | ||
[![GitHub version](https://badge.fury.io/gh/Leaflet%2Fleaflet.draw.svg)](https://badge.fury.io/gh/Leaflet%2Fleaflet.draw) | ||
[![npm version](https://badge.fury.io/js/leaflet-draw.svg)](https://badge.fury.io/js/leaflet-draw) | ||
[![NPM Downloads](https://img.shields.io/npm/dt/leaflet-draw.svg)](https://www.npmjs.com/package/leaflet-draw) | ||
[![Bower version](https://badge.fury.io/bo/leaflet.draw.svg)](https://badge.fury.io/bo/leaflet.draw) | ||
[![Build Status](https://travis-ci.org/Leaflet/Leaflet.draw.svg?branch=master)](https://travis-ci.org/Leaflet/Leaflet.draw) | ||
[![Leaflet.draw Chat](https://badges.gitter.im/Leaflet/Leaflet.draw.svg)](https://gitter.im/Leaflet/Leaflet.draw?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | ||
[![GitHub issues](https://img.shields.io/github/issues/Leaflet/Leaflet.draw.svg)](https://github.com/Leaflet/Leaflet.draw/issues) | ||
[![GitHub forks](https://img.shields.io/github/forks/Leaflet/Leaflet.draw.svg)](https://github.com/Leaflet/Leaflet.draw/network) | ||
[![GitHub stars](https://img.shields.io/github/stars/Leaflet/Leaflet.draw.svg)](https://github.com/Leaflet/Leaflet.draw/stargazers) | ||
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/Leaflet/Leaflet.draw/master/MIT-LICENSE.md) | ||
# Leaflet.draw | ||
Adds support for drawing and editing vectors and markers on [Leaflet maps](https://github.com/Leaflet/Leaflet). Check out the [demo](http://leaflet.github.com/Leaflet.draw/). | ||
Adds support for drawing and editing vectors and markers on [Leaflet maps](https://github.com/Leaflet/Leaflet). | ||
Supports [Leaflet](https://github.com/Leaflet/Leaflet/releases) 0.7.x and 1.0.0+ branches. | ||
- Full Demo for Leaflet 1.0.0+: http://leaflet.github.io/Leaflet.draw/examples/full.html | ||
Please check out our [Api Documentation](https://leaflet.github.io/Leaflet.draw/docs/leaflet-draw-latest.html) | ||
- Full Demo for Leaflet 0.7.0+: http://leaflet.github.io/Leaflet.draw/examples/0.7.x/full.html | ||
#### Upgrading from Leaflet.draw 0.1 | ||
@@ -18,344 +23,13 @@ | ||
## Table of Contents | ||
[Install](#install) | ||
[CDN](#cdn) | ||
[Using the plugin](#using) | ||
[Advanced Options](#options) | ||
[Common tasks](#commontasks) | ||
[Thanks](#thanks) | ||
## In this readme | ||
<a name="install" /> | ||
## Install | ||
- [Customizing Language](#customlanguage) | ||
- [Common tasks](#commontasks) | ||
- [Contributing](#contributing) | ||
- [Thanks](#thanks) | ||
# npm | ||
To install the plugin run `npm install leaflet-draw` via command line in your project. You must also require this in your project like so: `var leafletDraw = require('leaflet-draw');` | ||
# bower | ||
<a name="customlanguage" /> | ||
## Customizing language and text in Leaflet.draw | ||
To install the plugin run `bower install leaflet-draw`. | ||
<a name="cdn" /> | ||
## CDN | ||
Using unpkg | ||
``` | ||
<link rel="stylesheet" href="https://unpkg.com/leaflet-draw@0.4.1/dist/leaflet.draw.css" /> | ||
<script src="https://unpkg.com/leaflet-draw@0.4.1/dist/leaflet.draw.js"></script> | ||
``` | ||
Using CDNJS | ||
``` | ||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/0.4.0/leaflet.draw.css"/> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/0.4.0/leaflet.draw.js"></script> | ||
``` | ||
<a name="using" /> | ||
## Using the plugin | ||
The default state for the control is the draw toolbar just below the zoom control. This will allow map users to draw vectors and markers. **Please note the edit toolbar is not enabled by default.** | ||
To add the draw toolbar set the option `drawControl: true` in the map options. | ||
````js | ||
// create a map in the "map" div, set the view to a given place and zoom | ||
var map = L.map('map', {drawControl: true}).setView([51.505, -0.09], 13); | ||
// add an OpenStreetMap tile layer | ||
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { | ||
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' | ||
}).addTo(map); | ||
```` | ||
### Adding the edit toolbar | ||
To use the edit toolbar you must initialise the Leaflet.draw control and manually add it to the map. | ||
````js | ||
// create a map in the "map" div, set the view to a given place and zoom | ||
var map = L.map('map').setView([51.505, -0.09], 13); | ||
// add an OpenStreetMap tile layer | ||
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { | ||
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' | ||
}).addTo(map); | ||
// Initialise the FeatureGroup to store editable layers | ||
var drawnItems = new L.FeatureGroup(); | ||
map.addLayer(drawnItems); | ||
// Initialise the draw control and pass it the FeatureGroup of editable layers | ||
var drawControl = new L.Control.Draw({ | ||
edit: { | ||
featureGroup: drawnItems | ||
} | ||
}); | ||
map.addControl(drawControl); | ||
```` | ||
The key here is the `featureGroup` option. This tells the plugin which `FeatureGroup` contains the layers that should be editable. The featureGroup can contain 0 or more features with geometry types `Point`, `LineString`, and `Polygon`. **Leaflet.draw does not work with multigeometry features such as `MultiPoint`, `MultiLineString`, `MultiPolygon`, or `GeometryCollection`.** If you need to add multigeometry features to the draw plugin, convert them to a FeatureCollection of non-multigeometries (`Point`s, `LineString`s, or `Polygon`s). | ||
### Events | ||
Once you have successfully added the Leaflet.draw plugin to your map you will want to respond to the different actions users can initiate. The following events will be triggered on the map: | ||
#### draw:created | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| layer | [Polyline](http://leafletjs.com/reference.html#polyline)/[Polygon](http://leafletjs.com/reference.html#polygon)/[Rectangle](http://leafletjs.com/reference.html#rectangle)/[Circle](http://leafletjs.com/reference.html#circle)/[Marker](http://leafletjs.com/reference.html#marker) | Layer that was just created. | ||
| layerType | String | The type of layer this is. One of: `polyline`, `polygon`, `rectangle`, `circle`, `marker` | ||
Triggered when a new vector or marker has been created. | ||
````js | ||
map.on('draw:created', function (e) { | ||
var type = e.layerType, | ||
layer = e.layer; | ||
if (type === 'marker') { | ||
// Do marker specific actions | ||
} | ||
// Do whatever else you need to. (save to db, add to map etc) | ||
map.addLayer(layer); | ||
}); | ||
```` | ||
#### draw:edited | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| layers | [LayerGroup](http://leafletjs.com/reference.html#layergroup) | List of all layers just edited on the map. | ||
Triggered when layers in the FeatureGroup, initialised with the plugin, have been edited and saved. | ||
````js | ||
map.on('draw:edited', function (e) { | ||
var layers = e.layers; | ||
layers.eachLayer(function (layer) { | ||
//do whatever you want, most likely save back to db | ||
}); | ||
}); | ||
```` | ||
#### draw:deleted | ||
Triggered when layers have been removed (and saved) from the FeatureGroup. | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| layers | [LayerGroup](http://leafletjs.com/reference.html#layergroup) | List of all layers just removed from the map. | ||
#### draw:drawstart | ||
Triggered when the user has chosen to draw a particular vector or marker. | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| layerType | String | The type of layer this is. One of: `polyline`, `polygon`, `rectangle`, `circle`, `marker` | ||
#### draw:drawstop | ||
Triggered when the user has finished a particular vector or marker. | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| layerType | String | The type of layer this is. One of: `polyline`, `polygon`, `rectangle`, `circle`, `marker` | ||
#### draw:drawvertex | ||
Triggered when a vertex is created on a polyline or polygon. | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| layers | [LayerGroup](http://leafletjs.com/reference.html#layergroup) | List of all layers just being added from the map. | ||
#### draw:editstart | ||
Triggered when the user starts edit mode by clicking the edit tool button. | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| handler | String | The type of edit this is. One of: `edit` | ||
#### draw:editmove | ||
Triggered as the user moves a rectangle, circle or marker. | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| layer | [ILayer](http://leafletjs.com/reference.html#ilayer) | Layer that was just moved. | ||
#### draw:editresize | ||
Triggered as the user resizes a rectangle or circle. | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| layer | [ILayer](http://leafletjs.com/reference.html#ilayer) | Layer that was just moved. | ||
#### draw:editvertex | ||
Triggered when a vertex is edited on a polyline or polygon. | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| layers | [LayerGroup](http://leafletjs.com/reference.html#layergroup) | List of all layers just being edited from the map. | ||
#### draw:editstop | ||
Triggered when the user has finshed editing (edit mode) and saves edits. | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| handler | String | The type of edit this is. One of: `edit` | ||
#### draw:deletestart | ||
Triggered when the user starts remove mode by clicking the remove tool button. | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| handler | String | The type of edit this is. One of: `remove` | ||
#### draw:deletestop | ||
Triggered when the user has finished removing shapes (remove mode) and saves. | ||
| Property | Type | Description | ||
| --- | --- | --- | ||
| handler | String | The type of edit this is. One of: `remove` | ||
<a name="options" /> | ||
## Advanced options | ||
You can configure the plugin by using the different options listed here. | ||
### Control.Draw | ||
These options make up the root object that is used when initialising the Leaflet.draw control. | ||
| Option | Type | Default | Description | ||
| --- | --- | --- | --- | ||
| position | String | `'topleft'` | The initial position of the control (one of the map corners). See [control positions](http://leafletjs.com/reference.html#control-positions). | ||
| draw | [DrawOptions](#drawoptions) | `{}` | The options used to configure the draw toolbar. | ||
| edit | [EditPolyOptions](#editpolyoptions) | `false` | The options used to configure the edit toolbar. | ||
<a name="drawoptions" /> | ||
### DrawOptions | ||
These options will allow you to configure the draw toolbar and its handlers. | ||
| Option | Type | Default | Description | ||
| --- | --- | --- | --- | ||
| polyline | [PolylineOptions](#polylineoptions) | `{ }` | Polyline draw handler options. Set to `false` to disable handler. | ||
| polygon | [PolygonOptions](#polygonoptions) | `{ }` | Polygon draw handler options. Set to `false` to disable handler. | ||
| rectangle | [RectangleOptions](#rectangleoptions) | `{ }` | Rectangle draw handler options. Set to `false` to disable handler. | ||
| circle | [CircleOptions](#circleoptions) | `{ }` | Circle draw handler options. Set to `false` to disable handler. | ||
| marker | [MarkerOptions](#markeroptions) | `{ }` | Marker draw handler options. Set to `false` to disable handler. | ||
### Draw handler options | ||
The following options will allow you to configure the individual draw handlers. | ||
<a name="polylineoptions" /> | ||
#### PolylineOptions | ||
Polyline and Polygon drawing handlers take the same options. | ||
| Option | Type | Default | Description | ||
| --- | --- | --- | --- | ||
| allowIntersection | Bool | `true` | Determines if line segments can cross. | ||
| drawError | Object | [See code](https://github.com/Leaflet/Leaflet.draw/blob/master/src/draw/handler/Draw.Polyline.js#L10) | Configuration options for the error that displays if an intersection is detected. | ||
| guidelineDistance | Number | `20` | Distance in pixels between each guide dash. | ||
| shapeOptions | [Leaflet Polyline options](http://leafletjs.com/reference.html#polyline-options) | [See code](https://github.com/Leaflet/Leaflet.draw/blob/master/src/draw/handler/Draw.Polyline.js#L20) | The options used when drawing the polyline/polygon on the map. | ||
| metric | Bool | `true` | Determines which measurement system (metric or imperial) is used. | ||
| zIndexOffset | Number | `2000` | This should be a high number to ensure that you can draw over all other layers on the map. | ||
| repeatMode | Bool | `false` | Determines if the draw tool remains enabled after drawing a shape. | ||
<a name="polygonoptions" /> | ||
#### PolygonOptions | ||
Polygon options include all of the Polyline options plus the option to show the approximate area. | ||
| Option | Type | Default | Description | ||
| --- | --- | --- | --- | ||
| showArea | Bool | `false` | Show the area of the drawn polygon in m², ha or km². **The area is only approximate and become less accurate the larger the polygon is.** | ||
<a name="rectangleoptions" /> | ||
#### RectangleOptions | ||
| Option | Type | Default | Description | ||
| --- | --- | --- | --- | ||
| shapeOptions | [Leaflet Path options](http://leafletjs.com/reference.html#path-options) | [See code](https://github.com/Leaflet/Leaflet.draw/blob/master/src/draw/handler/Draw.Rectangle.js#L7) | The options used when drawing the rectangle on the map. | ||
| repeatMode | Bool | `false` | Determines if the draw tool remains enabled after drawing a shape. | ||
<a name="circleoptions" /> | ||
#### CircleOptions | ||
| Option | Type | Default | Description | ||
| --- | --- | --- | --- | ||
| shapeOptions | [Leaflet Path options](http://leafletjs.com/reference.html#path-options) | [See code](https://github.com/Leaflet/Leaflet.draw/blob/master/src/draw/handler/Draw.Circle.js#L7) | The options used when drawing the circle on the map. | ||
| repeatMode | Bool | `false` | Determines if the draw tool remains enabled after drawing a shape. | ||
<a name="markeroptions" /> | ||
#### MarkerOptions | ||
| Option | Type | Default | Description | ||
| --- | --- | --- | --- | ||
| icon | [Leaflet Icon](http://leafletjs.com/reference.html#icon) | `L.Icon.Default()` | The icon displayed when drawing a marker. | ||
| zIndexOffset | Number | `2000` | This should be a high number to ensure that you can draw over all other layers on the map. | ||
| repeatMode | Bool | `false` | Determines if the draw tool remains enabled after drawing a shape. | ||
<a name="editpolyoptions" /> | ||
### EditPolyOptions | ||
These options will allow you to configure the draw toolbar and its handlers. | ||
| Option | Type | Default | Description | ||
| --- | --- | --- | --- | ||
| featureGroup | [Leaflet FeatureGroup](http://leafletjs.com/reference.html#featuregroup) | `null` | This is the FeatureGroup that stores all editable shapes. **THIS IS REQUIRED FOR THE EDIT TOOLBAR TO WORK** | ||
| edit | [EditHandlerOptions](#edithandleroptions) | `{ }` | Edit handler options. Set to `false` to disable handler. | ||
| remove | [DeleteHandlerOptions](#deletehandleroptions) | `{ }` | Delete handler options. Set to `false` to disable handler. | ||
| poly | [EditPolyOptions](#editpoly) | `{ }` | Set polygon editing options | ||
<a name="edithandleroptions" /> | ||
#### EditHandlerOptions | ||
| Option | Type | Default | Description | ||
| --- | --- | --- | --- | ||
| selectedPathOptions | [Leaflet Path options](http://leafletjs.com/reference.html#path-options) | [See code](https://github.com/Leaflet/Leaflet.draw/blob/master/src/edit/handler/EditToolbar.Edit.js#L9) | The path options for how the layers will look while in edit mode. If this is set to null the editable path options will not be set. | ||
**Note:** To maintain the original layer color of the layer use `maintainColor: true` within `selectedPathOptions`. | ||
E.g. The edit options below will maintain the layer color and set the edit opacity to 0.3. | ||
````js | ||
{ | ||
selectedPathOptions: { | ||
maintainColor: true, | ||
opacity: 0.3 | ||
} | ||
} | ||
```` | ||
<a name="deletehandleroptions" /> | ||
#### DeleteHandlerOptions | ||
| Option | Type | Default | Description | ||
| --- | --- | --- | --- | ||
<a name="editpoly" /> | ||
#### EditPolyOptions | ||
| Option | Type | Default | Description | ||
| --- | --- | --- | --- | ||
| allowIntersection | Bool | `true` | Determines if line segments can cross. | ||
<a name="drawlocal" /> | ||
#### Customizing language and text in Leaflet.draw | ||
Leaflet.draw uses the `L.drawLocal` configuration object to set any text used in the plugin. Customizing this will allow support for changing the text or supporting another language. | ||
@@ -368,7 +42,7 @@ | ||
````js | ||
// Set the button title text for the polygon button | ||
L.drawLocal.draw.toolbar.buttons.polygon = 'Draw a sexy polygon!'; | ||
// Set the tooltip start text for the rectangle | ||
L.drawLocal.draw.handlers.rectangle.tooltip.start = 'Not telling...'; | ||
// Set the button title text for the polygon button | ||
L.drawLocal.draw.toolbar.buttons.polygon = 'Draw a sexy polygon!'; | ||
// Set the tooltip start text for the rectangle | ||
L.drawLocal.draw.handlers.rectangle.tooltip.start = 'Not telling...'; | ||
```` | ||
@@ -390,99 +64,69 @@ | ||
````js | ||
var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png', | ||
cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18}), | ||
map = new L.Map('map', {layers: [cloudmade], center: new L.LatLng(-37.7772, 175.2756), zoom: 15 }); | ||
```js | ||
var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png', | ||
cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18}), | ||
map = new L.Map('map', {layers: [cloudmade], center: new L.LatLng(-37.7772, 175.2756), zoom: 15 }); | ||
var editableLayers = new L.FeatureGroup(); | ||
map.addLayer(editableLayers); | ||
var MyCustomMarker = L.Icon.extend({ | ||
options: { | ||
shadowUrl: null, | ||
iconAnchor: new L.Point(12, 12), | ||
iconSize: new L.Point(24, 24), | ||
iconUrl: 'link/to/image.png' | ||
} | ||
}); | ||
var options = { | ||
position: 'topright', | ||
draw: { | ||
polyline: { | ||
shapeOptions: { | ||
color: '#f357a1', | ||
weight: 10 | ||
} | ||
}, | ||
polygon: { | ||
allowIntersection: false, // Restricts shapes to simple polygons | ||
drawError: { | ||
color: '#e1e100', // Color the shape will turn when intersects | ||
message: '<strong>Oh snap!<strong> you can\'t draw that!' // Message that will show when intersect | ||
}, | ||
shapeOptions: { | ||
color: '#bada55' | ||
} | ||
}, | ||
circle: false, // Turns off this drawing tool | ||
rectangle: { | ||
shapeOptions: { | ||
clickable: false | ||
} | ||
}, | ||
marker: { | ||
icon: new MyCustomMarker() | ||
} | ||
}, | ||
edit: { | ||
featureGroup: editableLayers, //REQUIRED!! | ||
remove: false | ||
} | ||
}; | ||
var drawControl = new L.Control.Draw(options); | ||
map.addControl(drawControl); | ||
map.on(L.Draw.Event.CREATED, function (e) { | ||
var type = e.layerType, | ||
layer = e.layer; | ||
if (type === 'marker') { | ||
layer.bindPopup('A popup!'); | ||
} | ||
editableLayers.addLayer(layer); | ||
}); | ||
``` | ||
var editableLayers = new L.FeatureGroup(); | ||
map.addLayer(editableLayers); | ||
var MyCustomMarker = L.Icon.extend({ | ||
options: { | ||
shadowUrl: null, | ||
iconAnchor: new L.Point(12, 12), | ||
iconSize: new L.Point(24, 24), | ||
iconUrl: 'link/to/image.png' | ||
} | ||
}); | ||
var options = { | ||
position: 'topright', | ||
draw: { | ||
polyline: { | ||
shapeOptions: { | ||
color: '#f357a1', | ||
weight: 10 | ||
} | ||
}, | ||
polygon: { | ||
allowIntersection: false, // Restricts shapes to simple polygons | ||
drawError: { | ||
color: '#e1e100', // Color the shape will turn when intersects | ||
message: '<strong>Oh snap!<strong> you can\'t draw that!' // Message that will show when intersect | ||
}, | ||
shapeOptions: { | ||
color: '#bada55' | ||
} | ||
}, | ||
circle: false, // Turns off this drawing tool | ||
rectangle: { | ||
shapeOptions: { | ||
clickable: false | ||
} | ||
}, | ||
marker: { | ||
icon: new MyCustomMarker() | ||
} | ||
}, | ||
edit: { | ||
featureGroup: editableLayers, //REQUIRED!! | ||
remove: false | ||
} | ||
}; | ||
var drawControl = new L.Control.Draw(options); | ||
map.addControl(drawControl); | ||
map.on('draw:created', function (e) { | ||
var type = e.layerType, | ||
layer = e.layer; | ||
if (type === 'marker') { | ||
layer.bindPopup('A popup!'); | ||
} | ||
editableLayers.addLayer(layer); | ||
}); | ||
```` | ||
### Disabling a toolbar | ||
If you do not want a particular toolbar in your app you can turn it off by setting the toolbar to false. | ||
````js | ||
var drawControl = new L.Control.Draw({ | ||
draw: false, | ||
edit: { | ||
featureGroup: editableLayers | ||
} | ||
}); | ||
```` | ||
### Disabling a toolbar item | ||
If you want to turn off a particular toolbar item, set it to false. The following disables drawing polygons and markers. It also turns off the ability to edit layers. | ||
````js | ||
var drawControl = new L.Control.Draw({ | ||
draw: { | ||
polygon: false, | ||
marker: false | ||
}, | ||
edit: { | ||
featureGroup: editableLayers, | ||
edit: false | ||
} | ||
}); | ||
```` | ||
### Changing a drawing handlers options | ||
@@ -504,12 +148,7 @@ | ||
### Creating a custom build | ||
<a name="contributing" /> | ||
# Contributing | ||
If you only require certain handlers (and not the UI), you may wish to create a custom build. You can generate the relevant jake command using the [build html file](https://github.com/Leaflet/Leaflet.draw/blob/master/build/build.html). | ||
## Testing | ||
See [edit handlers example](https://github.com/Leaflet/Leaflet.draw/blob/master/examples/edithandlers.html) which uses only the edit handlers. | ||
<a name="thanks" /> | ||
### Testing | ||
To test you can install the npm dependencies: | ||
@@ -523,5 +162,13 @@ | ||
## Documentation | ||
Documentation is build with Leafdoc, to generate the documentation use | ||
jake docs | ||
and the generated html documentation is saved to `./docs/leaflet-draw-latest.html` | ||
## Thanks | ||
Touch friendly version of Leaflet.draw was created and maintained by Michael Guild (https://github.com/michaelguild13). | ||
Touch friendly version of Leaflet.draw was created by Michael Guild (https://github.com/michaelguild13). | ||
@@ -528,0 +175,0 @@ The touch support was initiated due to a demand for it at National Geographic for their Map Maker Projected (http://mapmaker.education.nationalgeographic.com/) that was created by Michael Guild and Daniel Schep (https://github.com/dschep) |
@@ -18,4 +18,6 @@ // Karma configuration | ||
"node_modules/happen/happen.js", | ||
"node_modules/prosthetic-hand/dist/prosthetic-hand.js", | ||
"spec/suites/SpecHelper.js", | ||
"spec/suites/**/*.js", | ||
"dist/*.css", | ||
{pattern: "dist/images/*.png", included: false} | ||
@@ -64,4 +66,20 @@ ]); | ||
// - IE (only Windows) | ||
browsers: ['PhantomJS'], | ||
browsers: [ | ||
'PhantomJSCustom' | ||
], | ||
customLaunchers: { | ||
'PhantomJSCustom': { | ||
base: 'PhantomJS', | ||
flags: ['--load-images=true'], | ||
options: { | ||
onCallback: function (data) { | ||
if (data.render) { | ||
page.render(data.render); | ||
} | ||
} | ||
} | ||
} | ||
}, | ||
// If browser does not capture in given timeout [ms], kill it | ||
@@ -68,0 +86,0 @@ captureTimeout: 5000, |
@@ -10,3 +10,2 @@ if (!Array.prototype.map) { | ||
var t = Object(this), | ||
// jshint bitwise: false | ||
len = t.length >>> 0; | ||
@@ -13,0 +12,0 @@ |
@@ -0,3 +1,8 @@ | ||
/** | ||
* @class L.Control.Draw | ||
* @aka L.Draw | ||
*/ | ||
L.Control.Draw = L.Control.extend({ | ||
// Options | ||
options: { | ||
@@ -9,2 +14,4 @@ position: 'topleft', | ||
// @method initialize(): void | ||
// Initializes draw control, toolbars from the options | ||
initialize: function (options) { | ||
@@ -42,2 +49,4 @@ if (L.version < '0.7') { | ||
// @method onAdd(): container | ||
// Adds the toolbar container to the map | ||
onAdd: function (map) { | ||
@@ -70,2 +79,4 @@ var container = L.DomUtil.create('div', 'leaflet-draw'), | ||
// @method onRemove(): void | ||
// Removes the toolbars from the map toolbar container | ||
onRemove: function () { | ||
@@ -79,2 +90,4 @@ for (var toolbarId in this._toolbars) { | ||
// @method setDrawingOptions(options): void | ||
// Sets options to all toolbar instances | ||
setDrawingOptions: function (options) { | ||
@@ -81,0 +94,0 @@ for (var toolbarId in this._toolbars) { |
/* | ||
Leaflet.draw, a plugin that adds drawing and editing tools to Leaflet powered maps. | ||
(c) 2012-2016, Jacob Toye, Smartrak, Leaflet | ||
Leaflet.draw {VERSION}, a plugin that adds drawing and editing tools to Leaflet powered maps. | ||
(c) 2012-2017, Jacob Toye, Jon West, Smartrak, Leaflet | ||
https://github.com/Leaflet/Leaflet.draw | ||
http://leafletjs.com | ||
*/ | ||
https://github.com/Leaflet/Leaflet.draw | ||
http://leafletjs.com | ||
*/ |
@@ -0,1 +1,5 @@ | ||
/** | ||
* @class L.DrawToolbar | ||
* @aka Toolbar | ||
*/ | ||
L.DrawToolbar = L.Toolbar.extend({ | ||
@@ -15,2 +19,3 @@ | ||
// @method initialize(): void | ||
initialize: function (options) { | ||
@@ -30,2 +35,3 @@ // Ensure that the options are merged correctly since L.extend is only shallow | ||
// @method getModeHandlers(): void | ||
getModeHandlers: function (map) { | ||
@@ -61,3 +67,3 @@ return [ | ||
// Get the actions part of the toolbar | ||
// @method getActions(): void | ||
getActions: function (handler) { | ||
@@ -88,2 +94,3 @@ return [ | ||
// @method setOptions(): void | ||
setOptions: function (options) { | ||
@@ -90,0 +97,0 @@ L.setOptions(this, options); |
@@ -0,1 +1,6 @@ | ||
/** | ||
* @class L.Draw.Circle | ||
* @aka Draw.Circle | ||
* @inherits L.Draw.SimpleShape | ||
*/ | ||
L.Draw.Circle = L.Draw.SimpleShape.extend({ | ||
@@ -22,2 +27,3 @@ statics: { | ||
// @method initialize(): void | ||
initialize: function (map, options) { | ||
@@ -24,0 +30,0 @@ // Save the type so super can fire, need to do this as cannot do this.TYPE :( |
@@ -0,6 +1,12 @@ | ||
L.Draw = L.Draw || {}; | ||
/** | ||
* @class L.Draw.Feature | ||
* @aka Draw.Feature | ||
*/ | ||
L.Draw.Feature = L.Handler.extend({ | ||
includes: L.Mixin.Events, | ||
// @method initialize(): void | ||
initialize: function (map, options) { | ||
@@ -19,2 +25,3 @@ this._map = map; | ||
// @method enable(): void | ||
enable: function () { | ||
@@ -27,5 +34,6 @@ if (this._enabled) { return; } | ||
this._map.fire('draw:drawstart', { layerType: this.type }); | ||
this._map.fire(L.Draw.Event.DRAWSTART, { layerType: this.type }); | ||
}, | ||
// @method initialize(): void | ||
disable: function () { | ||
@@ -36,3 +44,3 @@ if (!this._enabled) { return; } | ||
this._map.fire('draw:drawstop', { layerType: this.type }); | ||
this._map.fire(L.Draw.Event.DRAWSTOP, { layerType: this.type }); | ||
@@ -42,2 +50,3 @@ this.fire('disabled', { handler: this.type }); | ||
// @method addHooks(): void | ||
addHooks: function () { | ||
@@ -57,2 +66,3 @@ var map = this._map; | ||
// @method removeHooks(): void | ||
removeHooks: function () { | ||
@@ -69,2 +79,3 @@ if (this._map) { | ||
// @method setOptions(): void | ||
setOptions: function (options) { | ||
@@ -75,3 +86,3 @@ L.setOptions(this, options); | ||
_fireCreatedEvent: function (layer) { | ||
this._map.fire('draw:created', { layer: layer, layerType: this.type }); | ||
this._map.fire(L.Draw.Event.CREATED, { layer: layer, layerType: this.type }); | ||
}, | ||
@@ -78,0 +89,0 @@ |
@@ -0,1 +1,6 @@ | ||
/** | ||
* @class L.Draw.Marker | ||
* @aka Draw.Marker | ||
* @inherits L.Draw.Feature | ||
*/ | ||
L.Draw.Marker = L.Draw.Feature.extend({ | ||
@@ -12,2 +17,3 @@ statics: { | ||
// @method initialize(): void | ||
initialize: function (map, options) { | ||
@@ -20,2 +26,3 @@ // Save the type so super can fire, need to do this as cannot do this.TYPE :( | ||
// @method addHooks(): void | ||
addHooks: function () { | ||
@@ -49,2 +56,3 @@ L.Draw.Feature.prototype.addHooks.call(this); | ||
// @method removeHooks(): void | ||
removeHooks: function () { | ||
@@ -51,0 +59,0 @@ L.Draw.Feature.prototype.removeHooks.call(this); |
@@ -0,1 +1,6 @@ | ||
/** | ||
* @class L.Draw.Polygon | ||
* @aka Draw.Polygon | ||
* @inherits L.Draw.Polyline | ||
*/ | ||
L.Draw.Polygon = L.Draw.Polyline.extend({ | ||
@@ -23,2 +28,3 @@ statics: { | ||
// @method initialize(): void | ||
initialize: function (map, options) { | ||
@@ -25,0 +31,0 @@ L.Draw.Polyline.prototype.initialize.call(this, map, options); |
@@ -0,1 +1,6 @@ | ||
/** | ||
* @class L.Draw.Polyline | ||
* @aka Draw.Polyline | ||
* @inherits L.Draw.Feature | ||
*/ | ||
L.Draw.Polyline = L.Draw.Feature.extend({ | ||
@@ -39,2 +44,3 @@ statics: { | ||
// @method initialize(): void | ||
initialize: function (map, options) { | ||
@@ -60,2 +66,3 @@ // if touch, switch to touch icon | ||
// @method addHooks(): void | ||
addHooks: function () { | ||
@@ -110,2 +117,3 @@ L.Draw.Feature.prototype.addHooks.call(this); | ||
// @method removeHooks(): void | ||
removeHooks: function () { | ||
@@ -145,2 +153,3 @@ L.Draw.Feature.prototype.removeHooks.call(this); | ||
// @method deleteLastVertex(): void | ||
deleteLastVertex: function () { | ||
@@ -167,2 +176,3 @@ if (this._markers.length <= 1) { | ||
// @method addVertex(): void | ||
addVertex: function (latlng) { | ||
@@ -190,2 +200,3 @@ var markersLength = this._markers.length; | ||
// @method completeShape(): void | ||
completeShape: function () { | ||
@@ -252,3 +263,3 @@ if (this._markers.length <= 1) { | ||
_vertexChanged: function (latlng, added) { | ||
this._map.fire('draw:drawvertex', { layers: this._markerGroup }); | ||
this._map.fire(L.Draw.Event.DRAWVERTEX, { layers: this._markerGroup }); | ||
this._updateFinishHandler(); | ||
@@ -255,0 +266,0 @@ |
@@ -0,1 +1,6 @@ | ||
/** | ||
* @class L.Draw.Rectangle | ||
* @aka Draw.Rectangle | ||
* @inherits L.Draw.SimpleShape | ||
*/ | ||
L.Draw.Rectangle = L.Draw.SimpleShape.extend({ | ||
@@ -20,2 +25,3 @@ statics: { | ||
// @method initialize(): void | ||
initialize: function (map, options) { | ||
@@ -22,0 +28,0 @@ // Save the type so super can fire, need to do this as cannot do this.TYPE :( |
L.SimpleShape = {}; | ||
/** | ||
* @class L.Draw.SimpleShape | ||
* @aka Draw.SimpleShape | ||
* @inherits L.Draw.Feature | ||
*/ | ||
L.Draw.SimpleShape = L.Draw.Feature.extend({ | ||
@@ -8,2 +12,3 @@ options: { | ||
// @method initialize(): void | ||
initialize: function (map, options) { | ||
@@ -15,2 +20,3 @@ this._endLabelText = L.drawLocal.draw.handlers.simpleshape.tooltip.end; | ||
// @method addHooks(): void | ||
addHooks: function () { | ||
@@ -38,2 +44,3 @@ L.Draw.Feature.prototype.addHooks.call(this); | ||
// @method removeHooks(): void | ||
removeHooks: function () { | ||
@@ -40,0 +47,0 @@ L.Draw.Feature.prototype.removeHooks.call(this); |
/*L.Map.mergeOptions({ | ||
editControl: true | ||
});*/ | ||
/** | ||
* @class L.EditToolbar | ||
* @aka EditToolbar | ||
*/ | ||
L.EditToolbar = L.Toolbar.extend({ | ||
@@ -28,2 +31,3 @@ statics: { | ||
// @method intialize(): void | ||
initialize: function (options) { | ||
@@ -52,2 +56,3 @@ // Need to set this manually since null is an acceptable value here | ||
// @method getModeHandlers(): void | ||
getModeHandlers: function (map) { | ||
@@ -75,2 +80,3 @@ var featureGroup = this.options.featureGroup; | ||
// @method getActions(): void | ||
getActions: function () { | ||
@@ -93,2 +99,3 @@ return [ | ||
// @method addToolbar(): void | ||
addToolbar: function (map) { | ||
@@ -104,2 +111,3 @@ var container = L.Toolbar.prototype.addToolbar.call(this, map); | ||
// @method removeToolbar(): void | ||
removeToolbar: function () { | ||
@@ -111,2 +119,3 @@ this.options.featureGroup.off('layeradd layerremove', this._checkDisabled, this); | ||
// @method disable(): void | ||
disable: function () { | ||
@@ -113,0 +122,0 @@ if (!this.enabled()) { return; } |
L.Edit = L.Edit || {}; | ||
/** | ||
* @class L.Edit.Circle | ||
* @aka Edit.Circle | ||
* @inherits L.Edit.SimpleShape | ||
*/ | ||
L.Edit.Circle = L.Edit.SimpleShape.extend({ | ||
@@ -34,3 +38,3 @@ _createMoveMarker: function () { | ||
this._map.fire('draw:editmove', {layer: this._shape}); | ||
this._map.fire(L.Draw.Event.EDITMOVE, {layer: this._shape}); | ||
}, | ||
@@ -44,3 +48,3 @@ | ||
this._map.fire('draw:editresize', {layer: this._shape}); | ||
this._map.fire(L.Draw.Event.EDITRESIZE, {layer: this._shape}); | ||
} | ||
@@ -47,0 +51,0 @@ }); |
L.Edit = L.Edit || {}; | ||
/** | ||
* @class L.Edit.Marker | ||
* @aka Edit.Marker | ||
*/ | ||
L.Edit.Marker = L.Handler.extend({ | ||
// @method initialize(): void | ||
initialize: function (marker, options) { | ||
@@ -9,2 +14,3 @@ this._marker = marker; | ||
// @method addHooks(): void | ||
addHooks: function () { | ||
@@ -18,2 +24,3 @@ var marker = this._marker; | ||
// @method removeHooks(): void | ||
removeHooks: function () { | ||
@@ -30,3 +37,3 @@ var marker = this._marker; | ||
layer.edited = true; | ||
this._map.fire('draw:editmove', {layer: layer}); | ||
this._map.fire(L.Draw.Event.EDITMOVE, {layer: layer}); | ||
}, | ||
@@ -33,0 +40,0 @@ |
L.Edit = L.Edit || {}; | ||
/* | ||
* L.Edit.Poly is an editing handler for polylines and polygons. | ||
/** | ||
* @class L.Edit.Polyline | ||
* @aka L.Edit.Poly | ||
* @aka Edit.Poly | ||
*/ | ||
@@ -9,2 +11,3 @@ L.Edit.Poly = L.Handler.extend({ | ||
// @method initialize(): void | ||
initialize: function (poly, options) { | ||
@@ -36,2 +39,3 @@ | ||
// @method addHooks(): void | ||
addHooks: function () { | ||
@@ -44,2 +48,3 @@ this._initHandlers(); | ||
// @method removeHooks(): void | ||
removeHooks: function () { | ||
@@ -51,2 +56,3 @@ this._eachVertexHandler(function (handler) { | ||
// @method updateMarkers(): void | ||
updateMarkers: function () { | ||
@@ -74,2 +80,6 @@ this._eachVertexHandler(function (handler) { | ||
/** | ||
* @class L.Edit.PolyVerticesEdit | ||
* @aka Edit.PolyVerticesEdit | ||
*/ | ||
L.Edit.PolyVerticesEdit = L.Handler.extend({ | ||
@@ -93,2 +103,3 @@ options: { | ||
// @method intialize(): void | ||
initialize: function (poly, latlngs, options) { | ||
@@ -117,2 +128,3 @@ // if touch, switch to touch icon | ||
// @method addHooks(): void | ||
addHooks: function () { | ||
@@ -141,2 +153,3 @@ var poly = this._poly; | ||
// @method removeHooks(): void | ||
removeHooks: function () { | ||
@@ -154,2 +167,3 @@ var poly = this._poly; | ||
// @method updateMarkers(): void | ||
updateMarkers: function () { | ||
@@ -249,3 +263,3 @@ this._markerGroup.clearLayers(); | ||
this._poly.fire('edit'); | ||
this._poly._map.fire('draw:editvertex', { layers: this._markerGroup }); | ||
this._poly._map.fire(L.Draw.Event.EDITVERTEX, { layers: this._markerGroup }); | ||
}, | ||
@@ -252,0 +266,0 @@ |
L.Edit = L.Edit || {}; | ||
/** | ||
* @class L.Edit.Rectangle | ||
* @aka Edit.Rectangle | ||
* @inherits L.Edit.SimpleShape | ||
*/ | ||
L.Edit.Rectangle = L.Edit.SimpleShape.extend({ | ||
@@ -72,3 +76,3 @@ _createMoveMarker: function () { | ||
this._map.fire('draw:editmove', {layer: this._shape}); | ||
this._map.fire(L.Draw.Event.EDITMOVE, {layer: this._shape}); | ||
}, | ||
@@ -86,3 +90,3 @@ | ||
this._map.fire('draw:editresize', {layer: this._shape}); | ||
this._map.fire(L.Draw.Event.EDITRESIZE, {layer: this._shape}); | ||
}, | ||
@@ -89,0 +93,0 @@ |
L.Edit = L.Edit || {}; | ||
/** | ||
* @class L.Edit.SimpleShape | ||
* @aka Edit.SimpleShape | ||
*/ | ||
L.Edit.SimpleShape = L.Handler.extend({ | ||
@@ -23,2 +26,3 @@ options: { | ||
// @method intialize(): void | ||
initialize: function (shape, options) { | ||
@@ -35,2 +39,3 @@ // if touch, switch to touch icon | ||
// @method addHooks(): void | ||
addHooks: function () { | ||
@@ -52,2 +57,3 @@ var shape = this._shape; | ||
// @method removeHooks(): void | ||
removeHooks: function () { | ||
@@ -73,2 +79,3 @@ var shape = this._shape; | ||
// @method updateMarkers(): void | ||
updateMarkers: function () { | ||
@@ -75,0 +82,0 @@ this._markerGroup.clearLayers(); |
@@ -0,1 +1,5 @@ | ||
/** | ||
* @class L.EditToolbar.Delete | ||
* @aka EditToolbar.Delete | ||
*/ | ||
L.EditToolbar.Delete = L.Handler.extend({ | ||
@@ -8,2 +12,3 @@ statics: { | ||
// @method intialize(): void | ||
initialize: function (map, options) { | ||
@@ -25,2 +30,3 @@ L.Handler.prototype.initialize.call(this, map); | ||
// @method enable(): void | ||
enable: function () { | ||
@@ -32,3 +38,3 @@ if (this._enabled || !this._hasAvailableLayers()) { | ||
this._map.fire('draw:deletestart', { handler: this.type }); | ||
this._map.fire(L.Draw.Event.DELETESTART, { handler: this.type }); | ||
@@ -42,2 +48,3 @@ L.Handler.prototype.enable.call(this); | ||
// @method disable(): void | ||
disable: function () { | ||
@@ -52,3 +59,3 @@ if (!this._enabled) { return; } | ||
this._map.fire('draw:deletestop', { handler: this.type }); | ||
this._map.fire(L.Draw.Event.DELETESTOP, { handler: this.type }); | ||
@@ -58,2 +65,3 @@ this.fire('disabled', { handler: this.type}); | ||
// @method addHooks(): void | ||
addHooks: function () { | ||
@@ -75,2 +83,3 @@ var map = this._map; | ||
// @method removeHooks(): void | ||
removeHooks: function () { | ||
@@ -88,2 +97,3 @@ if (this._map) { | ||
// @method revertLayers(): void | ||
revertLayers: function () { | ||
@@ -97,4 +107,5 @@ // Iterate of the deleted layers and add them back into the featureGroup | ||
// @method save(): void | ||
save: function () { | ||
this._map.fire('draw:deleted', { layers: this._deletedLayers }); | ||
this._map.fire(L.Draw.Event.DELETED, { layers: this._deletedLayers }); | ||
}, | ||
@@ -101,0 +112,0 @@ |
@@ -0,1 +1,5 @@ | ||
/** | ||
* @class L.EditToolbar.Edit | ||
* @aka EditToolbar.Edit | ||
*/ | ||
L.EditToolbar.Edit = L.Handler.extend({ | ||
@@ -8,2 +12,3 @@ statics: { | ||
// @method intialize(): void | ||
initialize: function (map, options) { | ||
@@ -27,2 +32,3 @@ L.Handler.prototype.initialize.call(this, map); | ||
// @method enable(): void | ||
enable: function () { | ||
@@ -35,3 +41,3 @@ if (this._enabled || !this._hasAvailableLayers()) { | ||
this._map.fire('draw:editstart', { handler: this.type }); | ||
this._map.fire(L.Draw.Event.EDITSTART, { handler: this.type }); | ||
//allow drawLayer to be updated before beginning edition. | ||
@@ -45,2 +51,3 @@ | ||
// @method disable(): void | ||
disable: function () { | ||
@@ -52,6 +59,7 @@ if (!this._enabled) { return; } | ||
L.Handler.prototype.disable.call(this); | ||
this._map.fire('draw:editstop', { handler: this.type }); | ||
this._map.fire(L.Draw.Event.EDITSTOP, { handler: this.type }); | ||
this.fire('disabled', {handler: this.type}); | ||
}, | ||
// @method addHooks(): void | ||
addHooks: function () { | ||
@@ -80,6 +88,7 @@ var map = this._map; | ||
.on('MSPointerMove', this._onMouseMove, this) | ||
.on('draw:editvertex', this._updateTooltip, this); | ||
.on(L.Draw.Event.EDITVERTEX, this._updateTooltip, this); | ||
} | ||
}, | ||
// @method removeHooks(): void | ||
removeHooks: function () { | ||
@@ -100,6 +109,7 @@ if (this._map) { | ||
.off('MSPointerMove', this._onMouseMove, this) | ||
.off('draw:editvertex', this._updateTooltip, this); | ||
.off(L.Draw.Event.EDITVERTEX, this._updateTooltip, this); | ||
} | ||
}, | ||
// @method revertLayers(): void | ||
revertLayers: function () { | ||
@@ -111,2 +121,3 @@ this._featureGroup.eachLayer(function (layer) { | ||
// @method save(): void | ||
save: function () { | ||
@@ -120,3 +131,3 @@ var editedLayers = new L.LayerGroup(); | ||
}); | ||
this._map.fire('draw:edited', {layers: editedLayers}); | ||
this._map.fire(L.Draw.Event.EDITED, {layers: editedLayers}); | ||
}, | ||
@@ -261,3 +272,3 @@ | ||
layer.edited = true; | ||
this._map.fire('draw:editmove', {layer: layer}); | ||
this._map.fire(L.Draw.Event.EDITMOVE, {layer: layer}); | ||
}, | ||
@@ -264,0 +275,0 @@ |
@@ -0,3 +1,9 @@ | ||
/** | ||
* @class L.GeometryUtil | ||
* @aka GeometryUtil | ||
*/ | ||
L.GeometryUtil = L.extend(L.GeometryUtil || {}, { | ||
// Ported from the OpenLayers implementation. See https://github.com/openlayers/openlayers/blob/master/lib/OpenLayers/Geometry/LinearRing.js#L270 | ||
// @method geodesicArea(): void | ||
geodesicArea: function (latLngs) { | ||
@@ -22,2 +28,3 @@ var pointsCount = latLngs.length, | ||
// @method readableArea(): void | ||
readableArea: function (area, isMetric) { | ||
@@ -47,2 +54,3 @@ var areaStr; | ||
// @method readableDistance(): void | ||
readableDistance: function (distance, isMetric, useFeet) { | ||
@@ -49,0 +57,0 @@ var distanceStr; |
@@ -1,7 +0,9 @@ | ||
/* | ||
* L.LatLngUtil contains different utility functions for LatLngs. | ||
/** | ||
* @class L.LatLngUtil | ||
* @aka LatLngUtil | ||
*/ | ||
L.LatLngUtil = { | ||
// Clones a LatLngs[], returns [][] | ||
// @method cloneLatLngs(): void | ||
cloneLatLngs: function (latlngs) { | ||
@@ -20,2 +22,3 @@ var clone = []; | ||
// @method cloneLatLng(): void | ||
cloneLatLng: function (latlng) { | ||
@@ -22,0 +25,0 @@ return L.latLng(latlng.lat, latlng.lng); |
@@ -0,2 +1,9 @@ | ||
/** | ||
* @class L.LineUtil | ||
* @aka Util | ||
* @aka L.Utils | ||
*/ | ||
L.Util.extend(L.LineUtil, { | ||
// @method segmentsIntersect(): void | ||
// Checks to see if two line segments intersect. Does not handle degenerate cases. | ||
@@ -3,0 +10,0 @@ // http://compgeom.cs.uiuc.edu/~jeffe/teaching/373/notes/x06-sweepline.pdf |
@@ -0,2 +1,8 @@ | ||
/** | ||
* @class L.Polygon | ||
* @aka Polygon | ||
*/ | ||
L.Polygon.include({ | ||
// @method intersects(): void | ||
// Checks a polygon for any intersecting line segments. Ignores holes. | ||
@@ -3,0 +9,0 @@ intersects: function () { |
@@ -0,2 +1,8 @@ | ||
/** | ||
* @class L.Polyline | ||
* @aka Polyline | ||
*/ | ||
L.Polyline.include({ | ||
// @method intersects(): void | ||
// Check to see if this polyline has any linesegments that intersect. | ||
@@ -26,2 +32,3 @@ // NOTE: does not support detecting intersection for degenerate cases. | ||
// @method newLatLngIntersects(): void | ||
// Check for intersection if new latlng was added to this polyline. | ||
@@ -38,2 +45,3 @@ // NOTE: does not support detecting intersection for degenerate cases. | ||
// @method newPointIntersects(): void | ||
// Check for intersection if new point was added to this polyline. | ||
@@ -40,0 +48,0 @@ // newPoint must be a layer point. |
@@ -5,4 +5,10 @@ L.Map.mergeOptions({ | ||
/** | ||
* @class L.Map.TouchExtend | ||
* @aka TouchExtend | ||
*/ | ||
L.Map.TouchExtend = L.Handler.extend({ | ||
// @method initialize(): void | ||
// Sets TouchExtend private accessor variables | ||
initialize: function (map) { | ||
@@ -14,2 +20,4 @@ this._map = map; | ||
// @method addHooks(): void | ||
// Adds dom listener events to the map container | ||
addHooks: function () { | ||
@@ -31,2 +39,4 @@ L.DomEvent.on(this._container, 'touchstart', this._onTouchStart, this); | ||
// @method removeHooks(): void | ||
// Removes dom listener events from the map container | ||
removeHooks: function () { | ||
@@ -176,4 +186,10 @@ L.DomEvent.off(this._container, 'touchstart', this._onTouchStart); | ||
// This isn't full Touch support. This is just to get makers to also support dom touch events after creation | ||
// #TODO: find a better way of getting markers to support touch. | ||
/** | ||
* @class L.Marker.Touch | ||
* @aka Marker.Touch | ||
* | ||
* This isn't full Touch support. This is just to get makers to also support dom touch events after creation | ||
* #TODO: find a better way of getting markers to support touch. | ||
*/ | ||
L.Marker.Touch = L.Marker.extend({ | ||
@@ -191,3 +207,3 @@ | ||
// This is an exact copy of https://github.com/Leaflet/Leaflet/blob/v0.7/src/layer/marker/Marker.js | ||
// with the addition of the touch events on line 15. | ||
// with the addition of the touch events | ||
_initInteractionLegacy: function () { | ||
@@ -225,2 +241,3 @@ | ||
}, | ||
_detectIE: function () { | ||
@@ -227,0 +244,0 @@ var ua = window.navigator.userAgent; |
@@ -1,104 +0,171 @@ | ||
/* | ||
/** | ||
* Leaflet.draw assumes that you have already included the Leaflet library. | ||
*/ | ||
L.drawVersion = '0.4.2'; | ||
/** | ||
* @class L.Draw | ||
* @aka Draw | ||
* | ||
* | ||
* To add the draw toolbar set the option drawControl: true in the map options. | ||
* | ||
* @example | ||
* ```js | ||
* var map = L.map('map', {drawControl: true}).setView([51.505, -0.09], 13); | ||
* | ||
* L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { | ||
* attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' | ||
* }).addTo(map); | ||
* ``` | ||
* | ||
* ### Adding the edit toolbar | ||
* To use the edit toolbar you must initialise the Leaflet.draw control and manually add it to the map. | ||
* | ||
* ```js | ||
* var map = L.map('map').setView([51.505, -0.09], 13); | ||
* | ||
* L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { | ||
* attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' | ||
* }).addTo(map); | ||
* | ||
* // FeatureGroup is to store editable layers | ||
* var drawnItems = new L.FeatureGroup(); | ||
* map.addLayer(drawnItems); | ||
* | ||
* var drawControl = new L.Control.Draw({ | ||
* edit: { | ||
* featureGroup: drawnItems | ||
* } | ||
* }); | ||
* map.addControl(drawControl); | ||
* ``` | ||
* | ||
* The key here is the featureGroup option. This tells the plugin which FeatureGroup contains the layers that | ||
* should be editable. The featureGroup can contain 0 or more features with geometry types Point, LineString, and Polygon. | ||
* Leaflet.draw does not work with multigeometry features such as MultiPoint, MultiLineString, MultiPolygon, | ||
* or GeometryCollection. If you need to add multigeometry features to the draw plugin, convert them to a | ||
* FeatureCollection of non-multigeometries (Points, LineStrings, or Polygons). | ||
*/ | ||
L.Draw = {}; | ||
L.drawVersion = '0.4.0'; | ||
/** | ||
* @class L.drawLocal | ||
* @aka L.drawLocal | ||
* | ||
* The core toolbar class of the API — it is used to create the toolbar ui | ||
* | ||
* @example | ||
* ```js | ||
* var modifiedDraw = L.drawLocal.extend({ | ||
* draw: { | ||
* toolbar: { | ||
* buttons: { | ||
* polygon: 'Draw an awesome polygon' | ||
* } | ||
* } | ||
* } | ||
* }); | ||
* ``` | ||
* | ||
* The default state for the control is the draw toolbar just below the zoom control. | ||
* This will allow map users to draw vectors and markers. | ||
* **Please note the edit toolbar is not enabled by default.** | ||
*/ | ||
L.drawLocal = { | ||
draw: { | ||
toolbar: { | ||
// #TODO: this should be reorganized where actions are nested in actions | ||
// ex: actions.undo or actions.cancel | ||
actions: { | ||
title: 'Cancel drawing', | ||
text: 'Cancel' | ||
}, | ||
finish: { | ||
title: 'Finish drawing', | ||
text: 'Finish' | ||
}, | ||
undo: { | ||
title: 'Delete last point drawn', | ||
text: 'Delete last point' | ||
}, | ||
buttons: { | ||
polyline: 'Draw a polyline', | ||
polygon: 'Draw a polygon', | ||
rectangle: 'Draw a rectangle', | ||
circle: 'Draw a circle', | ||
marker: 'Draw a marker' | ||
} | ||
}, | ||
handlers: { | ||
circle: { | ||
tooltip: { | ||
start: 'Click and drag to draw circle.' | ||
}, | ||
radius: 'Radius' | ||
}, | ||
marker: { | ||
tooltip: { | ||
start: 'Click map to place marker.' | ||
} | ||
}, | ||
polygon: { | ||
tooltip: { | ||
start: 'Click to start drawing shape.', | ||
cont: 'Click to continue drawing shape.', | ||
end: 'Click first point to close this shape.' | ||
} | ||
}, | ||
polyline: { | ||
error: '<strong>Error:</strong> shape edges cannot cross!', | ||
tooltip: { | ||
start: 'Click to start drawing line.', | ||
cont: 'Click to continue drawing line.', | ||
end: 'Click last point to finish line.' | ||
} | ||
}, | ||
rectangle: { | ||
tooltip: { | ||
start: 'Click and drag to draw rectangle.' | ||
} | ||
}, | ||
simpleshape: { | ||
tooltip: { | ||
end: 'Release mouse to finish drawing.' | ||
} | ||
} | ||
} | ||
}, | ||
edit: { | ||
toolbar: { | ||
actions: { | ||
save: { | ||
title: 'Save changes.', | ||
text: 'Save' | ||
}, | ||
cancel: { | ||
title: 'Cancel editing, discards all changes.', | ||
text: 'Cancel' | ||
} | ||
}, | ||
buttons: { | ||
edit: 'Edit layers.', | ||
editDisabled: 'No layers to edit.', | ||
remove: 'Delete layers.', | ||
removeDisabled: 'No layers to delete.' | ||
} | ||
}, | ||
handlers: { | ||
edit: { | ||
tooltip: { | ||
text: 'Drag handles, or marker to edit feature.', | ||
subtext: 'Click cancel to undo changes.' | ||
} | ||
}, | ||
remove: { | ||
tooltip: { | ||
text: 'Click on a feature to remove' | ||
} | ||
} | ||
} | ||
} | ||
draw: { | ||
toolbar: { | ||
// #TODO: this should be reorganized where actions are nested in actions | ||
// ex: actions.undo or actions.cancel | ||
actions: { | ||
title: 'Cancel drawing', | ||
text: 'Cancel' | ||
}, | ||
finish: { | ||
title: 'Finish drawing', | ||
text: 'Finish' | ||
}, | ||
undo: { | ||
title: 'Delete last point drawn', | ||
text: 'Delete last point' | ||
}, | ||
buttons: { | ||
polyline: 'Draw a polyline', | ||
polygon: 'Draw a polygon', | ||
rectangle: 'Draw a rectangle', | ||
circle: 'Draw a circle', | ||
marker: 'Draw a marker' | ||
} | ||
}, | ||
handlers: { | ||
circle: { | ||
tooltip: { | ||
start: 'Click and drag to draw circle.' | ||
}, | ||
radius: 'Radius' | ||
}, | ||
marker: { | ||
tooltip: { | ||
start: 'Click map to place marker.' | ||
} | ||
}, | ||
polygon: { | ||
tooltip: { | ||
start: 'Click to start drawing shape.', | ||
cont: 'Click to continue drawing shape.', | ||
end: 'Click first point to close this shape.' | ||
} | ||
}, | ||
polyline: { | ||
error: '<strong>Error:</strong> shape edges cannot cross!', | ||
tooltip: { | ||
start: 'Click to start drawing line.', | ||
cont: 'Click to continue drawing line.', | ||
end: 'Click last point to finish line.' | ||
} | ||
}, | ||
rectangle: { | ||
tooltip: { | ||
start: 'Click and drag to draw rectangle.' | ||
} | ||
}, | ||
simpleshape: { | ||
tooltip: { | ||
end: 'Release mouse to finish drawing.' | ||
} | ||
} | ||
} | ||
}, | ||
edit: { | ||
toolbar: { | ||
actions: { | ||
save: { | ||
title: 'Save changes.', | ||
text: 'Save' | ||
}, | ||
cancel: { | ||
title: 'Cancel editing, discards all changes.', | ||
text: 'Cancel' | ||
} | ||
}, | ||
buttons: { | ||
edit: 'Edit layers.', | ||
editDisabled: 'No layers to edit.', | ||
remove: 'Delete layers.', | ||
removeDisabled: 'No layers to delete.' | ||
} | ||
}, | ||
handlers: { | ||
edit: { | ||
tooltip: { | ||
text: 'Drag handles, or marker to edit feature.', | ||
subtext: 'Click cancel to undo changes.' | ||
} | ||
}, | ||
remove: { | ||
tooltip: { | ||
text: 'Click on a feature to remove' | ||
} | ||
} | ||
} | ||
} | ||
}; |
@@ -0,246 +1,305 @@ | ||
/** | ||
* @class L.Draw.Toolbar | ||
* @aka Toolbar | ||
* | ||
* The toolbar class of the API — it is used to create the ui | ||
* This will be depreciated | ||
* | ||
* @example | ||
* | ||
* ```js | ||
* var toolbar = L.Toolbar(); | ||
* toolbar.addToolbar(map); | ||
* ``` | ||
* | ||
* ### Disabling a toolbar | ||
* | ||
* If you do not want a particular toolbar in your app you can turn it off by setting the toolbar to false. | ||
* | ||
* ```js | ||
* var drawControl = new L.Control.Draw({ | ||
* draw: false, | ||
* edit: { | ||
* featureGroup: editableLayers | ||
* } | ||
* }); | ||
* ``` | ||
* | ||
* ### Disabling a toolbar item | ||
* | ||
* If you want to turn off a particular toolbar item, set it to false. The following disables drawing polygons and | ||
* markers. It also turns off the ability to edit layers. | ||
* | ||
* ```js | ||
* var drawControl = new L.Control.Draw({ | ||
* draw: { | ||
* polygon: false, | ||
* marker: false | ||
* }, | ||
* edit: { | ||
* featureGroup: editableLayers, | ||
* edit: false | ||
* } | ||
* }); | ||
* ``` | ||
*/ | ||
L.Toolbar = L.Class.extend({ | ||
includes: [L.Mixin.Events], | ||
includes: [L.Mixin.Events], | ||
initialize: function (options) { | ||
L.setOptions(this, options); | ||
// @section Methods for modifying the toolbar | ||
this._modes = {}; | ||
this._actionButtons = []; | ||
this._activeMode = null; | ||
}, | ||
// @method initialize(options): void | ||
// Toolbar constructor | ||
initialize: function (options) { | ||
L.setOptions(this, options); | ||
enabled: function () { | ||
return this._activeMode !== null; | ||
}, | ||
this._modes = {}; | ||
this._actionButtons = []; | ||
this._activeMode = null; | ||
}, | ||
disable: function () { | ||
if (!this.enabled()) { return; } | ||
// @method enabled(): boolean | ||
// Gets a true/false of whether the toolbar is enabled | ||
enabled: function () { | ||
return this._activeMode !== null; | ||
}, | ||
this._activeMode.handler.disable(); | ||
}, | ||
// @method disable(): void | ||
// Disables the toolbar | ||
disable: function () { | ||
if (!this.enabled()) { | ||
return; | ||
} | ||
addToolbar: function (map) { | ||
var container = L.DomUtil.create('div', 'leaflet-draw-section'), | ||
buttonIndex = 0, | ||
buttonClassPrefix = this._toolbarClass || '', | ||
modeHandlers = this.getModeHandlers(map), | ||
i; | ||
this._activeMode.handler.disable(); | ||
}, | ||
this._toolbarContainer = L.DomUtil.create('div', 'leaflet-draw-toolbar leaflet-bar'); | ||
this._map = map; | ||
// @method addToolbar(map): L.DomUtil | ||
// Adds the toolbar to the map and returns the toolbar dom element | ||
addToolbar: function (map) { | ||
var container = L.DomUtil.create('div', 'leaflet-draw-section'), | ||
buttonIndex = 0, | ||
buttonClassPrefix = this._toolbarClass || '', | ||
modeHandlers = this.getModeHandlers(map), | ||
i; | ||
for (i = 0; i < modeHandlers.length; i++) { | ||
if (modeHandlers[i].enabled) { | ||
this._initModeHandler( | ||
modeHandlers[i].handler, | ||
this._toolbarContainer, | ||
buttonIndex++, | ||
buttonClassPrefix, | ||
modeHandlers[i].title | ||
); | ||
} | ||
} | ||
this._toolbarContainer = L.DomUtil.create('div', 'leaflet-draw-toolbar leaflet-bar'); | ||
this._map = map; | ||
// if no buttons were added, do not add the toolbar | ||
if (!buttonIndex) { | ||
return; | ||
} | ||
for (i = 0; i < modeHandlers.length; i++) { | ||
if (modeHandlers[i].enabled) { | ||
this._initModeHandler( | ||
modeHandlers[i].handler, | ||
this._toolbarContainer, | ||
buttonIndex++, | ||
buttonClassPrefix, | ||
modeHandlers[i].title | ||
); | ||
} | ||
} | ||
// Save button index of the last button, -1 as we would have ++ after the last button | ||
this._lastButtonIndex = --buttonIndex; | ||
// if no buttons were added, do not add the toolbar | ||
if (!buttonIndex) { | ||
return; | ||
} | ||
// Create empty actions part of the toolbar | ||
this._actionsContainer = L.DomUtil.create('ul', 'leaflet-draw-actions'); | ||
// Save button index of the last button, -1 as we would have ++ after the last button | ||
this._lastButtonIndex = --buttonIndex; | ||
// Add draw and cancel containers to the control container | ||
container.appendChild(this._toolbarContainer); | ||
container.appendChild(this._actionsContainer); | ||
// Create empty actions part of the toolbar | ||
this._actionsContainer = L.DomUtil.create('ul', 'leaflet-draw-actions'); | ||
return container; | ||
}, | ||
// Add draw and cancel containers to the control container | ||
container.appendChild(this._toolbarContainer); | ||
container.appendChild(this._actionsContainer); | ||
removeToolbar: function () { | ||
// Dispose each handler | ||
for (var handlerId in this._modes) { | ||
if (this._modes.hasOwnProperty(handlerId)) { | ||
// Unbind handler button | ||
this._disposeButton( | ||
this._modes[handlerId].button, | ||
this._modes[handlerId].handler.enable, | ||
this._modes[handlerId].handler | ||
); | ||
return container; | ||
}, | ||
// Make sure is disabled | ||
this._modes[handlerId].handler.disable(); | ||
// @method removeToolbar(): void | ||
// Removes the toolbar and drops the handler event listeners | ||
removeToolbar: function () { | ||
// Dispose each handler | ||
for (var handlerId in this._modes) { | ||
if (this._modes.hasOwnProperty(handlerId)) { | ||
// Unbind handler button | ||
this._disposeButton( | ||
this._modes[handlerId].button, | ||
this._modes[handlerId].handler.enable, | ||
this._modes[handlerId].handler | ||
); | ||
// Unbind handler | ||
this._modes[handlerId].handler | ||
.off('enabled', this._handlerActivated, this) | ||
.off('disabled', this._handlerDeactivated, this); | ||
} | ||
} | ||
this._modes = {}; | ||
// Make sure is disabled | ||
this._modes[handlerId].handler.disable(); | ||
// Dispose the actions toolbar | ||
for (var i = 0, l = this._actionButtons.length; i < l; i++) { | ||
this._disposeButton( | ||
this._actionButtons[i].button, | ||
this._actionButtons[i].callback, | ||
this | ||
); | ||
} | ||
this._actionButtons = []; | ||
this._actionsContainer = null; | ||
}, | ||
// Unbind handler | ||
this._modes[handlerId].handler | ||
.off('enabled', this._handlerActivated, this) | ||
.off('disabled', this._handlerDeactivated, this); | ||
} | ||
} | ||
this._modes = {}; | ||
_initModeHandler: function (handler, container, buttonIndex, classNamePredix, buttonTitle) { | ||
var type = handler.type; | ||
// Dispose the actions toolbar | ||
for (var i = 0, l = this._actionButtons.length; i < l; i++) { | ||
this._disposeButton( | ||
this._actionButtons[i].button, | ||
this._actionButtons[i].callback, | ||
this | ||
); | ||
} | ||
this._actionButtons = []; | ||
this._actionsContainer = null; | ||
}, | ||
this._modes[type] = {}; | ||
_initModeHandler: function (handler, container, buttonIndex, classNamePredix, buttonTitle) { | ||
var type = handler.type; | ||
this._modes[type].handler = handler; | ||
this._modes[type] = {}; | ||
this._modes[type].button = this._createButton({ | ||
type: type, | ||
title: buttonTitle, | ||
className: classNamePredix + '-' + type, | ||
container: container, | ||
callback: this._modes[type].handler.enable, | ||
context: this._modes[type].handler | ||
}); | ||
this._modes[type].handler = handler; | ||
this._modes[type].buttonIndex = buttonIndex; | ||
this._modes[type].button = this._createButton({ | ||
type: type, | ||
title: buttonTitle, | ||
className: classNamePredix + '-' + type, | ||
container: container, | ||
callback: this._modes[type].handler.enable, | ||
context: this._modes[type].handler | ||
}); | ||
this._modes[type].handler | ||
.on('enabled', this._handlerActivated, this) | ||
.on('disabled', this._handlerDeactivated, this); | ||
}, | ||
this._modes[type].buttonIndex = buttonIndex; | ||
_createButton: function (options) { | ||
this._modes[type].handler | ||
.on('enabled', this._handlerActivated, this) | ||
.on('disabled', this._handlerDeactivated, this); | ||
}, | ||
var link = L.DomUtil.create('a', options.className || '', options.container); | ||
link.href = '#'; | ||
_createButton: function (options) { | ||
if (options.text) { | ||
link.innerHTML = options.text; | ||
} | ||
var link = L.DomUtil.create('a', options.className || '', options.container); | ||
link.href = '#'; | ||
if (options.title) { | ||
link.title = options.title; | ||
} | ||
if (options.text) { | ||
link.innerHTML = options.text; | ||
} | ||
L.DomEvent | ||
.on(link, 'click', L.DomEvent.stopPropagation) | ||
.on(link, 'mousedown', L.DomEvent.stopPropagation) | ||
.on(link, 'dblclick', L.DomEvent.stopPropagation) | ||
.on(link, 'click', L.DomEvent.preventDefault) | ||
.on(link, 'click', options.callback, options.context); | ||
if (options.title) { | ||
link.title = options.title; | ||
} | ||
return link; | ||
}, | ||
L.DomEvent | ||
.on(link, 'click', L.DomEvent.stopPropagation) | ||
.on(link, 'mousedown', L.DomEvent.stopPropagation) | ||
.on(link, 'dblclick', L.DomEvent.stopPropagation) | ||
.on(link, 'click', L.DomEvent.preventDefault) | ||
.on(link, 'click', options.callback, options.context); | ||
_disposeButton: function (button, callback) { | ||
L.DomEvent | ||
.off(button, 'click', L.DomEvent.stopPropagation) | ||
.off(button, 'mousedown', L.DomEvent.stopPropagation) | ||
.off(button, 'dblclick', L.DomEvent.stopPropagation) | ||
.off(button, 'click', L.DomEvent.preventDefault) | ||
.off(button, 'click', callback); | ||
}, | ||
return link; | ||
}, | ||
_handlerActivated: function (e) { | ||
// Disable active mode (if present) | ||
this.disable(); | ||
_disposeButton: function (button, callback) { | ||
L.DomEvent | ||
.off(button, 'click', L.DomEvent.stopPropagation) | ||
.off(button, 'mousedown', L.DomEvent.stopPropagation) | ||
.off(button, 'dblclick', L.DomEvent.stopPropagation) | ||
.off(button, 'click', L.DomEvent.preventDefault) | ||
.off(button, 'click', callback); | ||
}, | ||
// Cache new active feature | ||
this._activeMode = this._modes[e.handler]; | ||
_handlerActivated: function (e) { | ||
// Disable active mode (if present) | ||
this.disable(); | ||
L.DomUtil.addClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled'); | ||
// Cache new active feature | ||
this._activeMode = this._modes[e.handler]; | ||
this._showActionsToolbar(); | ||
L.DomUtil.addClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled'); | ||
this.fire('enable'); | ||
}, | ||
this._showActionsToolbar(); | ||
_handlerDeactivated: function () { | ||
this._hideActionsToolbar(); | ||
this.fire('enable'); | ||
}, | ||
L.DomUtil.removeClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled'); | ||
_handlerDeactivated: function () { | ||
this._hideActionsToolbar(); | ||
this._activeMode = null; | ||
L.DomUtil.removeClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled'); | ||
this.fire('disable'); | ||
}, | ||
this._activeMode = null; | ||
_createActions: function (handler) { | ||
var container = this._actionsContainer, | ||
buttons = this.getActions(handler), | ||
l = buttons.length, | ||
li, di, dl, button; | ||
this.fire('disable'); | ||
}, | ||
// Dispose the actions toolbar (todo: dispose only not used buttons) | ||
for (di = 0, dl = this._actionButtons.length; di < dl; di++) { | ||
this._disposeButton(this._actionButtons[di].button, this._actionButtons[di].callback); | ||
} | ||
this._actionButtons = []; | ||
_createActions: function (handler) { | ||
var container = this._actionsContainer, | ||
buttons = this.getActions(handler), | ||
l = buttons.length, | ||
li, di, dl, button; | ||
// Remove all old buttons | ||
while (container.firstChild) { | ||
container.removeChild(container.firstChild); | ||
} | ||
// Dispose the actions toolbar (todo: dispose only not used buttons) | ||
for (di = 0, dl = this._actionButtons.length; di < dl; di++) { | ||
this._disposeButton(this._actionButtons[di].button, this._actionButtons[di].callback); | ||
} | ||
this._actionButtons = []; | ||
for (var i = 0; i < l; i++) { | ||
if ('enabled' in buttons[i] && !buttons[i].enabled) { | ||
continue; | ||
} | ||
// Remove all old buttons | ||
while (container.firstChild) { | ||
container.removeChild(container.firstChild); | ||
} | ||
li = L.DomUtil.create('li', '', container); | ||
for (var i = 0; i < l; i++) { | ||
if ('enabled' in buttons[i] && !buttons[i].enabled) { | ||
continue; | ||
} | ||
button = this._createButton({ | ||
title: buttons[i].title, | ||
text: buttons[i].text, | ||
container: li, | ||
callback: buttons[i].callback, | ||
context: buttons[i].context | ||
}); | ||
li = L.DomUtil.create('li', '', container); | ||
this._actionButtons.push({ | ||
button: button, | ||
callback: buttons[i].callback | ||
}); | ||
} | ||
}, | ||
button = this._createButton({ | ||
title: buttons[i].title, | ||
text: buttons[i].text, | ||
container: li, | ||
callback: buttons[i].callback, | ||
context: buttons[i].context | ||
}); | ||
_showActionsToolbar: function () { | ||
var buttonIndex = this._activeMode.buttonIndex, | ||
lastButtonIndex = this._lastButtonIndex, | ||
toolbarPosition = this._activeMode.button.offsetTop - 1; | ||
this._actionButtons.push({ | ||
button: button, | ||
callback: buttons[i].callback | ||
}); | ||
} | ||
}, | ||
// Recreate action buttons on every click | ||
this._createActions(this._activeMode.handler); | ||
_showActionsToolbar: function () { | ||
var buttonIndex = this._activeMode.buttonIndex, | ||
lastButtonIndex = this._lastButtonIndex, | ||
toolbarPosition = this._activeMode.button.offsetTop - 1; | ||
// Correctly position the cancel button | ||
this._actionsContainer.style.top = toolbarPosition + 'px'; | ||
// Recreate action buttons on every click | ||
this._createActions(this._activeMode.handler); | ||
if (buttonIndex === 0) { | ||
L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop'); | ||
L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-top'); | ||
} | ||
// Correctly position the cancel button | ||
this._actionsContainer.style.top = toolbarPosition + 'px'; | ||
if (buttonIndex === lastButtonIndex) { | ||
L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom'); | ||
L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-bottom'); | ||
} | ||
if (buttonIndex === 0) { | ||
L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop'); | ||
L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-top'); | ||
} | ||
this._actionsContainer.style.display = 'block'; | ||
}, | ||
if (buttonIndex === lastButtonIndex) { | ||
L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom'); | ||
L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-bottom'); | ||
} | ||
_hideActionsToolbar: function () { | ||
this._actionsContainer.style.display = 'none'; | ||
this._actionsContainer.style.display = 'block'; | ||
}, | ||
L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop'); | ||
L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom'); | ||
L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-top'); | ||
L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-bottom'); | ||
} | ||
_hideActionsToolbar: function () { | ||
this._actionsContainer.style.display = 'none'; | ||
L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop'); | ||
L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom'); | ||
L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-top'); | ||
L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-bottom'); | ||
} | ||
}); |
L.Draw = L.Draw || {}; | ||
/** | ||
* @class L.Draw.Tooltip | ||
* @aka Tooltip | ||
* | ||
* The tooltip class — it is used to display the tooltip while drawing | ||
* This will be depreciated | ||
* | ||
* @example | ||
* | ||
* ```js | ||
* var tooltip = L.Draw.Tooltip(); | ||
* ``` | ||
* | ||
*/ | ||
L.Draw.Tooltip = L.Class.extend({ | ||
// @section Methods for modifying draw state | ||
// @method initialize(map): void | ||
// Tooltip constructor | ||
initialize: function (map) { | ||
@@ -13,2 +32,4 @@ this._map = map; | ||
// @method dispose(): void | ||
// Remove Tooltip DOM and unbind events | ||
dispose: function () { | ||
@@ -23,2 +44,4 @@ this._map.off('mouseout', this._onMouseOut, this); | ||
// @method updateContent(labelText): this | ||
// Changes the tooltip text to string in function call | ||
updateContent: function (labelText) { | ||
@@ -47,2 +70,4 @@ if (!this._container) { | ||
// @method updatePosition(latlng): this | ||
// Changes the location of the tooltip | ||
updatePosition: function (latlng) { | ||
@@ -60,2 +85,4 @@ var pos = this._map.latLngToLayerPoint(latlng), | ||
// @method showAsError(): this | ||
// Applies error class to tooltip | ||
showAsError: function () { | ||
@@ -68,2 +95,4 @@ if (this._container) { | ||
// @method removeError(): this | ||
// Removes the error class from the tooltip | ||
removeError: function () { | ||
@@ -70,0 +99,0 @@ if (this._container) { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
SPDX disjunction
LicenseSPDX disjunction for an artifact's license information
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
Unidentified License
License(Experimental) Something that seems like a license was found, but its contents could not be matched with a known license
Found 1 instance in 1 package
SPDX disjunction
LicenseSPDX disjunction for an artifact's license information
Found 1 instance in 1 package
2319771
145
40260
19
3
80
179
5
3