Jquery 在Google Maps中预加载可编辑的drawingmanager多边形
我正在编写一个应用程序,允许用户使用谷歌地图API绘制地理多边形“区域”,并将其保存在数据库中。每个用户只能有一个区域,所以我通过切换到手动并在OverlyComplete上隐藏绘图工具来限制这个区域。在叠加完成后,我可以点击save,它可以很好地保存在我的数据库中,所以这一点很有效。此外,我能够从数据库中检索多边形,并将其显示为地图上的可编辑多边形。但我面临的问题是:Jquery 在Google Maps中预加载可编辑的drawingmanager多边形,jquery,google-maps,google-maps-api-3,google-maps-markers,Jquery,Google Maps,Google Maps Api 3,Google Maps Markers,我正在编写一个应用程序,允许用户使用谷歌地图API绘制地理多边形“区域”,并将其保存在数据库中。每个用户只能有一个区域,所以我通过切换到手动并在OverlyComplete上隐藏绘图工具来限制这个区域。在叠加完成后,我可以点击save,它可以很好地保存在我的数据库中,所以这一点很有效。此外,我能够从数据库中检索多边形,并将其显示为地图上的可编辑多边形。但我面临的问题是: 当尝试拖动插入多边形的点时,这些点会“卡在”鼠标上,并且永远不会释放。我猜是某种鼠标问题 尽管已经存在一个多边形,但我仍然能够
我知道这有点老,但我一直在研究类似的场景。从数据库加载多边形,允许其可编辑,并允许将其他多边形添加到地图中。也许有更好的方法可以做到这一点,但这是功能性的,希望能让其他人走上正确的轨道
var areas = ( <?php echo json_encode($areas);?> );
var coords = ( <?php echo json_encode($coords);?> );
var drawingManager;
var selectedShape;
var colors = ['#1E90FF', '#FF1493', '#32CD32', '#FF8C00', '#4B0082'];
var selectedColor;
var colorButtons = {};
// Saving vars
var selectedShape;
var contentString;
var polygons = [];
var newPolys = [];
function clearSelection() {
if (selectedShape) {
selectedShape.setEditable(false);
selectedShape = null;
}
}
function setSelection(shape) {
clearSelection();
selectedShape = shape;
shape.setEditable(true);
selectColor(shape.get('fillColor') || shape.get('strokeColor'));
}
function deleteSelectedShape(e) {
if (selectedShape) {
selectedShape.setMap(null);
for (i=0; i < polygons.length; i++) { // Clear out the polygons entry
if (selectedShape.getPath == polygons[i].getPath) {
polygons.splice(i, 1);
}
}
}
}
function selectColor(color) {
selectedColor = color;
for (var i = 0; i < colors.length; ++i) {
var currColor = colors[i];
colorButtons[currColor].style.border = currColor == color ? '2px solid #789' : '2px solid #fff';
}
// Retrieves the current options from the drawing manager and replaces the
// stroke or fill color as appropriate.
var polylineOptions = drawingManager.get('polylineOptions');
polylineOptions.strokeColor = color;
drawingManager.set('polylineOptions', polylineOptions);
var rectangleOptions = drawingManager.get('rectangleOptions');
rectangleOptions.fillColor = color;
drawingManager.set('rectangleOptions', rectangleOptions);
var circleOptions = drawingManager.get('circleOptions');
circleOptions.fillColor = color;
drawingManager.set('circleOptions', circleOptions);
var polygonOptions = drawingManager.get('polygonOptions');
polygonOptions.fillColor = color;
drawingManager.set('polygonOptions', polygonOptions);
}
function setSelectedShapeColor(color) {
if (selectedShape) {
if (selectedShape.type == google.maps.drawing.OverlayType.POLYLINE) {
selectedShape.set('strokeColor', color);
} else {
selectedShape.set('fillColor', color);
}
}
}
function makeColorButton(color) {
var button = document.createElement('span');
button.className = 'color-button';
button.style.backgroundColor = color;
google.maps.event.addDomListener(button, 'click', function() {
selectColor(color);
setSelectedShapeColor(color);
});
return button;
}
function buildColorPalette() {
var colorPalette = document.getElementById('color-palette');
for (var i = 0; i < colors.length; ++i) {
var currColor = colors[i];
var colorButton = makeColorButton(currColor);
colorPalette.appendChild(colorButton);
colorButtons[currColor] = colorButton;
}
selectColor(colors[0]);
}
function initialize() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 7,
center: new google.maps.LatLng(40.2444, -111.6608), // Utah default coords
mapTypeId: google.maps.MapTypeId.Terrain,
disableDefaultUI: true,
zoomControl: true
});
var polyOptions = {
strokeWeight: 0,
fillOpacity: 0.45,
editable: true
};
// Creates a drawing manager attached to the map that allows the user to draw
// markers, lines, and shapes.
drawingManager = new google.maps.drawing.DrawingManager({
drawingMode: google.maps.drawing.OverlayType.POLYGON,
drawingControlOptions: {
drawingModes: [google.maps.drawing.OverlayType.POLYGON]},
markerOptions: {
draggable: true
},
polylineOptions: {
editable: true
},
rectangleOptions: polyOptions,
circleOptions: polyOptions,
polygonOptions: polyOptions,
map: map
});
google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
if (e.type != google.maps.drawing.OverlayType.MARKER) {
// Switch back to non-drawing mode after drawing a shape.
drawingManager.setDrawingMode(null);
// Add an event listener that selects the newly-drawn shape when the user
// mouses down on it.
var newShape = e.overlay;
newShape.type = e.type;
polygons.push(newShape);
setSelection(newShape);
google.maps.event.addListener(newShape, 'click', function() {
setSelection(newShape);
});
google.maps.event.addListener(newShape, 'mouseup', function() {
for (i=0; i < polygons.length; i++) { // Clear out the old polygons entry
if (newShape.getPath == polygons[i].getPath) {
polygons.splice(i, 1);
}
}
polygons.push(newShape);
});
}
});
// Clear the current selection when the drawing mode is changed, or when the
// map is clicked.
google.maps.event.addListener(drawingManager, 'drawingmode_changed', clearSelection);
google.maps.event.addListener(map, 'click', clearSelection);
google.maps.event.addDomListener(document.getElementById('delete-button'), 'click', deleteSelectedShape);
buildColorPalette();
/* Load Shapes that were previously saved */
for (var inc = 0, ii = areas.length; inc < ii; inc++) {
var newCoords = [];
for (var c = 0, cc = coords.length; c < cc; c++) {
if (coords[c].polygon == areas[inc].polygon) {
var point = coords[c];
newCoords.push(new google.maps.LatLng(point.lat, point.lng));
}
}
newPolys[inc] = new google.maps.Polygon({
path: newCoords,
strokeWeight: 0,
fillColor: areas[inc].fillColor,
fillOpacity: areas[inc].fillOpacity
});
newPolys[inc].setMap(map);
polygons.push(newPolys[inc]);
addNewPolys(newPolys[inc]);
}
function addNewPolys(newPoly) {
google.maps.event.addListener(newPoly, 'click', function() {
setSelection(newPoly);
});
}
}
google.maps.event.addDomListener(window, 'load', initialize);
var区域=();
var-coords=();
风险提取经理;
变量选择形状;
变量颜色=['#1E90FF'、'#FF1493'、'#32CD32'、'#FF8C00'、'#4B0082'];
选择颜色;
var colorButtons={};
//拯救瓦拉斯
变量选择形状;
var-contentString;
var=[];
var newPolys=[];
函数{
如果(selectedShape){
selectedShape.setEditable(false);
selectedShape=null;
}
}
功能选择(形状){
选举();
selectedShape=形状;
shape.setEditable(true);
选择颜色(shape.get('fillColor')| | shape.get('strokeColor'));
}
函数deleteSelectedShape(e){
如果(selectedShape){
selectedShape.setMap(空);
对于(i=0;i<div id="map_canvas" style="width:100%; height:450px;"></div>
<form action="http://garbagedayreminder.com/test/save" method="post" accept-charset="utf-8" id="map_form">
<input type="text" name="polygon" value="" id="polygon" />
<input type="submit" name="save" value="Save!" id="save" />
</form>
var areas = ( <?php echo json_encode($areas);?> );
var coords = ( <?php echo json_encode($coords);?> );
var drawingManager;
var selectedShape;
var colors = ['#1E90FF', '#FF1493', '#32CD32', '#FF8C00', '#4B0082'];
var selectedColor;
var colorButtons = {};
// Saving vars
var selectedShape;
var contentString;
var polygons = [];
var newPolys = [];
function clearSelection() {
if (selectedShape) {
selectedShape.setEditable(false);
selectedShape = null;
}
}
function setSelection(shape) {
clearSelection();
selectedShape = shape;
shape.setEditable(true);
selectColor(shape.get('fillColor') || shape.get('strokeColor'));
}
function deleteSelectedShape(e) {
if (selectedShape) {
selectedShape.setMap(null);
for (i=0; i < polygons.length; i++) { // Clear out the polygons entry
if (selectedShape.getPath == polygons[i].getPath) {
polygons.splice(i, 1);
}
}
}
}
function selectColor(color) {
selectedColor = color;
for (var i = 0; i < colors.length; ++i) {
var currColor = colors[i];
colorButtons[currColor].style.border = currColor == color ? '2px solid #789' : '2px solid #fff';
}
// Retrieves the current options from the drawing manager and replaces the
// stroke or fill color as appropriate.
var polylineOptions = drawingManager.get('polylineOptions');
polylineOptions.strokeColor = color;
drawingManager.set('polylineOptions', polylineOptions);
var rectangleOptions = drawingManager.get('rectangleOptions');
rectangleOptions.fillColor = color;
drawingManager.set('rectangleOptions', rectangleOptions);
var circleOptions = drawingManager.get('circleOptions');
circleOptions.fillColor = color;
drawingManager.set('circleOptions', circleOptions);
var polygonOptions = drawingManager.get('polygonOptions');
polygonOptions.fillColor = color;
drawingManager.set('polygonOptions', polygonOptions);
}
function setSelectedShapeColor(color) {
if (selectedShape) {
if (selectedShape.type == google.maps.drawing.OverlayType.POLYLINE) {
selectedShape.set('strokeColor', color);
} else {
selectedShape.set('fillColor', color);
}
}
}
function makeColorButton(color) {
var button = document.createElement('span');
button.className = 'color-button';
button.style.backgroundColor = color;
google.maps.event.addDomListener(button, 'click', function() {
selectColor(color);
setSelectedShapeColor(color);
});
return button;
}
function buildColorPalette() {
var colorPalette = document.getElementById('color-palette');
for (var i = 0; i < colors.length; ++i) {
var currColor = colors[i];
var colorButton = makeColorButton(currColor);
colorPalette.appendChild(colorButton);
colorButtons[currColor] = colorButton;
}
selectColor(colors[0]);
}
function initialize() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 7,
center: new google.maps.LatLng(40.2444, -111.6608), // Utah default coords
mapTypeId: google.maps.MapTypeId.Terrain,
disableDefaultUI: true,
zoomControl: true
});
var polyOptions = {
strokeWeight: 0,
fillOpacity: 0.45,
editable: true
};
// Creates a drawing manager attached to the map that allows the user to draw
// markers, lines, and shapes.
drawingManager = new google.maps.drawing.DrawingManager({
drawingMode: google.maps.drawing.OverlayType.POLYGON,
drawingControlOptions: {
drawingModes: [google.maps.drawing.OverlayType.POLYGON]},
markerOptions: {
draggable: true
},
polylineOptions: {
editable: true
},
rectangleOptions: polyOptions,
circleOptions: polyOptions,
polygonOptions: polyOptions,
map: map
});
google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
if (e.type != google.maps.drawing.OverlayType.MARKER) {
// Switch back to non-drawing mode after drawing a shape.
drawingManager.setDrawingMode(null);
// Add an event listener that selects the newly-drawn shape when the user
// mouses down on it.
var newShape = e.overlay;
newShape.type = e.type;
polygons.push(newShape);
setSelection(newShape);
google.maps.event.addListener(newShape, 'click', function() {
setSelection(newShape);
});
google.maps.event.addListener(newShape, 'mouseup', function() {
for (i=0; i < polygons.length; i++) { // Clear out the old polygons entry
if (newShape.getPath == polygons[i].getPath) {
polygons.splice(i, 1);
}
}
polygons.push(newShape);
});
}
});
// Clear the current selection when the drawing mode is changed, or when the
// map is clicked.
google.maps.event.addListener(drawingManager, 'drawingmode_changed', clearSelection);
google.maps.event.addListener(map, 'click', clearSelection);
google.maps.event.addDomListener(document.getElementById('delete-button'), 'click', deleteSelectedShape);
buildColorPalette();
/* Load Shapes that were previously saved */
for (var inc = 0, ii = areas.length; inc < ii; inc++) {
var newCoords = [];
for (var c = 0, cc = coords.length; c < cc; c++) {
if (coords[c].polygon == areas[inc].polygon) {
var point = coords[c];
newCoords.push(new google.maps.LatLng(point.lat, point.lng));
}
}
newPolys[inc] = new google.maps.Polygon({
path: newCoords,
strokeWeight: 0,
fillColor: areas[inc].fillColor,
fillOpacity: areas[inc].fillOpacity
});
newPolys[inc].setMap(map);
polygons.push(newPolys[inc]);
addNewPolys(newPolys[inc]);
}
function addNewPolys(newPoly) {
google.maps.event.addListener(newPoly, 'click', function() {
setSelection(newPoly);
});
}
}
google.maps.event.addDomListener(window, 'load', initialize);