@h21-map/yandex-drawing-manager
Advanced tools
Comparing version 4.0.3 to 4.0.4
234
index.js
@@ -251,6 +251,11 @@ function DrawingManager(map, opts) { | ||
me.map.container.events.add('mousemove', (event) => { | ||
if (typeof event.get('coords') !== "undefined") { | ||
me.map.container.getElement().style.cursor = 'not-allowed'; | ||
patch.push(event.get('coords')); | ||
me._area.geometry.setCoordinates(patch); | ||
let area = me.geodesicArea(patch); | ||
if (area < me.squareArea * 1000000) { | ||
me._area.geometry.setCoordinates(patch); | ||
me.map.container.getElement().style.cursor = 'crosshair'; | ||
return false; | ||
} | ||
} | ||
@@ -306,3 +311,5 @@ }); | ||
if (this._enableDraw) { | ||
me.map.container.events.once('mousedown', () => { | ||
me.map.container.events.once('mousedown', (e) => { | ||
e = window.event || e; | ||
if (e.button == 2) { return; } | ||
createArea(); | ||
@@ -316,37 +323,57 @@ }); | ||
DrawingManager.prototype.createVertexArea = function (pointSelect) { | ||
me = this; | ||
const geo = { | ||
geometry: { | ||
type: "Point", | ||
coordinates: pointSelect | ||
DrawingManager.prototype.geodesicArea = function (latLngs) { | ||
var pointsCount = latLngs.length, | ||
area = 0.0, | ||
d2r = Math.PI / 180, | ||
p1, p2; | ||
if (pointsCount > 2) { | ||
for (var i = 0; i < pointsCount; i++) { | ||
p1 = latLngs[i]; | ||
p2 = latLngs[(i + 1) % pointsCount]; | ||
area += ((p2[1] - p1[1]) * d2r) * | ||
(2 + Math.sin(p1[0] * d2r) + Math.sin(p2[0] * d2r)); | ||
} | ||
area = area * 6378137.0 * 6378137.0 / 2.0; | ||
} | ||
options = { | ||
iconLayout: 'default#image', | ||
iconImageSize: [24, 24], | ||
iconImageOffset: [-20, -5], | ||
iconImageHref: me.areaOptions.areaIconVertex, | ||
draggable: false, | ||
id: me.vertexCount, | ||
} | ||
return Math.abs(area); | ||
}, | ||
_vertex = new ymaps.GeoObject(geo, options); | ||
me.map.geoObjects.add(_vertex); | ||
DrawingManager.prototype.createVertexArea = function (pointSelect) { | ||
me = this; | ||
const geo = { | ||
geometry: { | ||
type: "Point", | ||
coordinates: pointSelect | ||
} | ||
} | ||
_vertex.events.add('click', function (e) { | ||
if (me.polygonArea.get(e.get('target').options.get('id'))) { | ||
let id = me.polygonArea.get(e.get('target').options.get('id')); | ||
me.map.geoObjects.remove(e.get('target')); | ||
me.map.geoObjects.remove(id); | ||
me.polygonArea.delete(id); | ||
me.map.events.fire('draw:area_remove', me._convertCoordinates()); | ||
options = { | ||
iconLayout: 'default#image', | ||
iconImageSize: [24, 24], | ||
iconImageOffset: [-20, -5], | ||
iconImageHref: me.areaOptions.areaIconVertex, | ||
draggable: false, | ||
id: me.vertexCount, | ||
} | ||
}); | ||
me.vertex.push(_vertex); | ||
_vertex = new ymaps.GeoObject(geo, options); | ||
me.map.geoObjects.add(_vertex); | ||
}, | ||
_vertex.events.add('click', function (e) { | ||
if (me.polygonArea.get(e.get('target').options.get('id'))) { | ||
let id = me.polygonArea.get(e.get('target').options.get('id')); | ||
me.map.geoObjects.remove(e.get('target')); | ||
me.map.geoObjects.remove(id); | ||
me.polygonArea.delete(id); | ||
me.map.events.fire('draw:area_remove', me._convertCoordinates()); | ||
} | ||
}); | ||
me.vertex.push(_vertex); | ||
}, | ||
DrawingManager.prototype.findRoundPoints = function (patch, round) { | ||
@@ -370,137 +397,24 @@ let me = this; | ||
DrawingManager.prototype.calculateArea = function (feature) { | ||
DrawingManager.prototype._redrawArea = function () { | ||
let me = this; | ||
var geoJsonGeometry = me.getGeoJsonGeometry(feature); | ||
return me.calculateJsonGeometryArea(geoJsonGeometry); | ||
}, | ||
let latlngs = me._convertlatlngs(); | ||
DrawingManager.prototype.getGeoJsonGeometry = function (feature) { | ||
let me = this; | ||
if (feature.type == 'Feature') { | ||
return feature.geometry; | ||
} else if (feature.geometry && feature.geometry.getType) { | ||
if (feature.geometry.getType() == 'Circle') { | ||
return { | ||
type: 'Circle', | ||
coordinates: feature.geometry.getCoordinates(), | ||
radius: feature.geometry.getRadius(), | ||
} | ||
} | ||
return { | ||
type: feature.geometry.getType(), | ||
coordinates: feature.geometry.getCoordinates(), | ||
} | ||
} else { | ||
throw new Error('util.calculateArea: Unknown input object.'); | ||
const options = { | ||
fillColor: me.areaOptions.fillColor, | ||
fillOpacity: me.areaOptions.fillOpacity, | ||
strokeColor: me.areaOptions.strokeColor, | ||
strokeOpacity: me.areaOptions.strokeOpacity, | ||
strokeWidth: me.areaOptions.strokeWeight, | ||
syncOverlayInit: true, | ||
} | ||
}, | ||
DrawingManager.prototype.calculateJsonGeometryArea = function (geometry) { | ||
let me = this; | ||
let area = 0; | ||
let i; | ||
switch (geometry.type) { | ||
case 'Polygon': | ||
return me.polygonAreas(geometry.coordinates); | ||
case 'MultiPolygon': | ||
for (i = 0; i < geometry.coordinates.length; i++) { | ||
area += me.polygonAreas(geometry.coordinates[i]); | ||
} | ||
return area; | ||
case 'Rectangle': | ||
return me.polygonAreas([[ | ||
geometry.coordinates[0], | ||
[geometry.coordinates[0][0], geometry.coordinates[1][1]], | ||
geometry.coordinates[1], | ||
[geometry.coordinates[1][0], geometry.coordinates[0][1]], | ||
geometry.coordinates[0] | ||
]]); | ||
case 'Circle': | ||
return Math.PI * Math.pow(geometry.radius, 2); | ||
case 'Point': | ||
case 'MultiPoint': | ||
case 'LineString': | ||
case 'MultiLineString': | ||
return 0; | ||
me._area = new ymaps.Polygon([latlngs,], {}, options); | ||
me.map.geoObjects.add(me._area); | ||
me.map.events.fire('draw:area_create', me._convertCoordinates(latlngs)); | ||
if (me.areaOptions.fitBounds) { | ||
me._fitBoundsArea(); | ||
} | ||
}, | ||
DrawingManager.prototype.polygonAreas = function (coords) { | ||
let me = this; | ||
let area = 0; | ||
if (coords && coords.length > 0) { | ||
area += Math.abs(me.ringArea(coords[0])); | ||
for (var i = 1; i < coords.length; i++) { | ||
area -= Math.abs(me.ringArea(coords[i])); | ||
} | ||
} | ||
return area; | ||
}, | ||
}; | ||
DrawingManager.prototype.ringArea = function (coords) { | ||
var p1; | ||
var p2; | ||
var p3; | ||
var lowerIndex; | ||
var middleIndex; | ||
var upperIndex; | ||
var i; | ||
var area = 0; | ||
var coordsLength = coords.length; | ||
var longitude = ymaps.meta.coordinatesOrder == 'latlong' ? 1 : 0; | ||
var latitude = ymaps.meta.coordinatesOrder == 'latlong' ? 0 : 1; | ||
if (coordsLength > 2) { | ||
for (i = 0; i < coordsLength; i++) { | ||
if (i === coordsLength - 2) { | ||
lowerIndex = coordsLength - 2; | ||
middleIndex = coordsLength - 1; | ||
upperIndex = 0; | ||
} else if (i === coordsLength - 1) { | ||
lowerIndex = coordsLength - 1; | ||
middleIndex = 0; | ||
upperIndex = 1; | ||
} else { | ||
lowerIndex = i; | ||
middleIndex = i + 1; | ||
upperIndex = i + 2; | ||
} | ||
p1 = coords[lowerIndex]; | ||
p2 = coords[middleIndex]; | ||
p3 = coords[upperIndex]; | ||
area += (rad(p3[longitude]) - rad(p1[longitude])) * Math.sin(rad(p2[latitude])); | ||
} | ||
let RADIUS = 6378137; | ||
area = area * RADIUS * RADIUS / 2; | ||
} | ||
return area; | ||
}, | ||
DrawingManager.prototype.rad = function (_) { | ||
return _ * Math.PI / 180; | ||
} | ||
DrawingManager.prototype._redrawArea = function () { | ||
let me = this; | ||
let latlngs = me._convertlatlngs(); | ||
const options = { | ||
fillColor: me.areaOptions.fillColor, | ||
fillOpacity: me.areaOptions.fillOpacity, | ||
strokeColor: me.areaOptions.strokeColor, | ||
strokeOpacity: me.areaOptions.strokeOpacity, | ||
strokeWidth: me.areaOptions.strokeWeight, | ||
syncOverlayInit: true, | ||
} | ||
me._area = new ymaps.Polygon([latlngs,], {}, options); | ||
me.map.geoObjects.add(me._area); | ||
me.map.events.fire('draw:area_create', me._convertCoordinates(latlngs)); | ||
if (me.areaOptions.fitBounds) { | ||
me._fitBoundsArea(); | ||
} | ||
}; | ||
DrawingManager.prototype._setIconMarker = function (iconUrl) { | ||
@@ -856,3 +770,3 @@ | ||
me._vertexMarker.options.set({ | ||
visible: true, | ||
visible: false, | ||
zIndexHover: 200, | ||
@@ -886,2 +800,6 @@ zIndex: 200, | ||
me._centerMarker.events.add('dragend', () => { | ||
me._vertexMarker.options.set({ | ||
visible: true, | ||
}); | ||
me.map.events.fire('draw:circle_center_complete', me._getInfo()); | ||
@@ -888,0 +806,0 @@ }); |
@@ -5,3 +5,3 @@ | ||
"scope": "@h21-map", | ||
"version": "4.0.3", | ||
"version": "4.0.4", | ||
"description": "A library of Yandex Map JS API", | ||
@@ -8,0 +8,0 @@ "main": "index.js", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
32833
801