gpt4 book ai didi

javascript - 谷歌地图 API v3 如何获取所有形状的坐标

转载 作者:行者123 更新时间:2023-12-04 01:39:15 25 4
gpt4 key购买 nike

我有这个可以创建形状和删除形状的谷歌脚本,但没有太多关于保存形状的内容。

我查了一下互联网,知道我可以通过覆盖完成中的 getpaths() 访问路径坐标,我还可以将坐标推送到一个收集所有形状的数组中。但是,如果用户删除一个形状怎么办?或更新它?

我的问题是我不知道如何识别已删除的形状,以便我可以相应地更新形状集合数组

第二个问题是我不知道如何识别用户是否更新了形状以及更新了哪个形状。因此无法更新形状集合数组。

我需要一个解决方案,当单击保存按钮时。我可以获得 map 上存在的所有形状的坐标。所以我不必关心更新或删除的内容。我当前的代码如下:

 <!DOCTYPE html>
<html>
<head>
<script src="http://maps.googleapis.com/maps/api/js?sensor=false&libraries=drawing,geometry,places"></script>
<style>
#map,html,body{
height:100%;
margin:0;
padding:0;
}
#delete-button, #save-button {
margin-top: 5px;
position:absolute;
z-index:999;
right:6%;
top:3%;
}
#save-button{
right:1%;
}
</style>
</head>
<body>
<div id="map"></div>
<button id="delete-button" class="btn">Delete seleted shape</button>
<button id="save-button" class="btn" onclick="save();">Save all</button>

<script>
var drawingManager;
var selectedShape;
var shapeCollection = [];


function save(){
console.log(shapeCollection);
}

function clearSelection() {
if (selectedShape) {
selectedShape.setEditable(false);
selectedShape = null;
}
}
function setSelection(shape) {
clearSelection();
selectedShape = shape;
shape.setEditable(true);
}
function deleteSelectedShape() {
if (selectedShape) {
selectedShape.setMap(null);
}
}
function initialize() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom:10,
center: new google.maps.LatLng(22.344, 114.048),
mapTypeId: google.maps.MapTypeId.ROADMAP,
});

var polyOptions = {
strokeWeight: 3,
fillOpacity: 0.2,
editable: true,
draggable: 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({
drawingControl: true,
drawingControlOptions: {
drawingModes: [google.maps.drawing.OverlayType.POLYGON]
},
drawingMode: google.maps.drawing.OverlayType.POLYGON,
polygonOptions: polyOptions,
map: map
});

google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {

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;
google.maps.event.addListener(newShape, 'click', function() {
setSelection(newShape);
});
setSelection(newShape);

});

//polygonPoints will be the array and index of the array will be the order
// 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);

}

google.maps.event.addDomListener(window, 'load', initialize);

</script>

</body>
</html>

最佳答案

为形状创建一个唯一的属性(ID)并将形状存储在一个对象中(使用 ID 作为键)。

当你想删除一个形状时,你可以使用 delete从集合中删除形状(基于形状的 ID)。

您不必关心用户的更新,当您将形状(引用)存储在集合中时,它们会自动更新。

演示:

function initialize() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom:10,
center: new google.maps.LatLng(22.344, 114.048),
mapTypeId: google.maps.MapTypeId.ROADMAP,
noClear:true
});
map.controls[google.maps.ControlPosition.RIGHT_BOTTOM]
.push(document.getElementById('save-button'));
map.controls[google.maps.ControlPosition.RIGHT_BOTTOM]
.push(document.getElementById('delete-button'));
var polyOptions = {
strokeWeight: 3,
fillOpacity: 0.2
};

var shapes={
collection:{},
selectedShape:null,
add:function(e){
var shape=e.overlay,
that=this;
shape.type=e.type;
shape.id=new Date().getTime()+'_'+Math.floor(Math.random()*1000);
this.collection[shape.id]=shape;
this.setSelection(shape);
google.maps.event.addListener(shape,'click',function(){
that.setSelection(this);
});
},
setSelection:function(shape){
if(this.selectedShape!==shape){
this.clearSelection();
this.selectedShape = shape;
shape.set('draggable',true);
shape.set('editable',true);
}
},
deleteSelected:function(){

if(this.selectedShape){
var shape= this.selectedShape;
this.clearSelection();
shape.setMap(null);
delete this.collection[shape.id];
}
},


clearSelection:function(){
if(this.selectedShape){
this.selectedShape.set('draggable',false);
this.selectedShape.set('editable',false);
this.selectedShape=null;
}
},
save:function(){
var collection=[];
for(var k in this.collection){
var shape=this.collection[k],
types=google.maps.drawing.OverlayType;
switch(shape.type){
case types.POLYGON:
collection.push({ type:shape.type,
path:google.maps.geometry.encoding
.encodePath(shape.getPath())});
break;
default:
alert('implement a storage-method for '+shape.type)
}
}
//collection is the result
console.log(collection);
}
};

var drawingManager = new google.maps.drawing.DrawingManager({
drawingControl: true,
drawingControlOptions: {
drawingModes: [google.maps.drawing.OverlayType.POLYGON]
},
drawingMode: google.maps.drawing.OverlayType.POLYGON,
polygonOptions: polyOptions,
map: map
});

google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
drawingManager.setDrawingMode(null);
shapes.add(e);
});


google.maps.event.addListener(drawingManager,
'drawingmode_changed',
function(){shapes.clearSelection();});
google.maps.event.addListener(map,
'click',
function(){shapes.clearSelection();});
google.maps.event.addDomListener(document.getElementById('delete-button'),
'click',
function(){shapes.deleteSelected();});
google.maps.event.addDomListener(document.getElementById('save-button'),
'click',
function(){shapes.save();});

}
#map,html,body{
height:100%;
margin:0;
padding:0;
}
<div id="map">
<button id="delete-button" class="btn">Delete selected shape</button>
<button id="save-button" class="btn">Save all</button>
</div>
<script src="http://maps.googleapis.com/maps/api/js?sensor=false&libraries=drawing,geometry,places&v=3&callback=initialize"></script>


演示包括 load - 自动加载形状的方法:

function initialize() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom:9,
center: new google.maps.LatLng(22.344, 114.048),
mapTypeId: google.maps.MapTypeId.ROADMAP,
noClear:true
});
map.controls[google.maps.ControlPosition.RIGHT_BOTTOM]
.push(document.getElementById('save-button'));
map.controls[google.maps.ControlPosition.RIGHT_BOTTOM]
.push(document.getElementById('delete-button'));
var polyOptions = {
strokeWeight: 3,
fillOpacity: 0.2
};

var shapes={
collection:{},
selectedShape:null,
add:function(e,s){
var shape=e.overlay,
that=this;
shape.type=e.type;
shape.id=new Date().getTime()+'_'+Math.floor(Math.random()*1000);
this.collection[shape.id]=shape;
if(!s)this.setSelection(shape);
google.maps.event.addListener(shape,'click',function(){
that.setSelection(this);
});
},
setSelection:function(shape){
if(this.selectedShape!==shape){
this.clearSelection();
this.selectedShape = shape;
shape.set('draggable',true);
shape.set('editable',true);
}
},
deleteSelected:function(){

if(this.selectedShape){
var shape= this.selectedShape;
this.clearSelection();
shape.setMap(null);
delete this.collection[shape.id];
}
},


clearSelection:function(){
if(this.selectedShape){
this.selectedShape.set('draggable',false);
this.selectedShape.set('editable',false);
this.selectedShape=null;
}
},
save:function(){
var collection=[];
for(var k in this.collection){
var shape=this.collection[k],
types=google.maps.drawing.OverlayType;
switch(shape.type){
case types.POLYGON:
collection.push({ type:shape.type,
path:google.maps.geometry.encoding
.encodePath(shape.getPath())});
break;
default:
alert('implement a storage-method for '+shape.type)
}
}
//collection is the result
console.log(JSON.stringify(collection));
return collection;
},
load:function(arr){
var types=google.maps.drawing.OverlayType;
for(var i=0;i<arr.length;++i){
switch(arr[i].type){
case types.POLYGON:
var shape=new google.maps.Polygon(polyOptions);
shape.setOptions({map:map,
path:google.maps.geometry.encoding
.decodePath(arr[i].path)});
shapes.add({type:types.POLYGON,overlay:shape},true)
break;
default:
alert('implement a loading-method for '+arr[i].type)
}
}
}
};

//initially load some shapes
shapes.load([{"type":"polygon","path":"_}sgCamyuT~ee@eP|FkdEskn@nr@rdH`wM"},
{"type":"polygon","path":"mnngCchxvT?y{DylG{{D~tFihCng_@v{O?wiVymDdPzNblLah\\i}LksLngJ"}]);
var drawingManager = new google.maps.drawing.DrawingManager({
drawingControl: true,
drawingControlOptions: {
drawingModes: [google.maps.drawing.OverlayType.POLYGON]
},
drawingMode: google.maps.drawing.OverlayType.POLYGON,
polygonOptions: polyOptions,
map: map
});

google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
drawingManager.setDrawingMode(null);
shapes.add(e);
});


google.maps.event.addListener(drawingManager,
'drawingmode_changed',
function(){shapes.clearSelection();});
google.maps.event.addListener(map,
'click',
function(){shapes.clearSelection();});
google.maps.event.addDomListener(document.getElementById('delete-button'),
'click',
function(){shapes.deleteSelected();});
google.maps.event.addDomListener(document.getElementById('save-button'),
'click',
function(){shapes.save();});

}
#map,html,body{
height:100%;
margin:0;
padding:0;
}
<div id="map">
<button id="delete-button" class="btn">Delete selected shape</button>
<button id="save-button" class="btn">Save all</button>
</div>
<script src="http://maps.googleapis.com/maps/api/js?sensor=false&libraries=drawing,geometry,places&v=3&callback=initialize"></script>

关于javascript - 谷歌地图 API v3 如何获取所有形状的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32800664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com