gpt4 book ai didi

javascript - 避免顶点拖动 map api v3

转载 作者:行者123 更新时间:2023-11-30 17:43:16 25 4
gpt4 key购买 nike

很简单。我想避免拖动第一个和最后一个顶点。我试过使用 dragstart 事件,但显然 polyline 不听那个事件。

我已经设法用 set_at 做了一些事情。我存储了最后一个位置,当调用 set_at 时,我检查该顶点的索引,然后将该顶点的 latLng 设置为旧的。这只能使用再次触发事件的 setAt 函数。

所以 a 创建了一个 ignoreNextEvent 标志,所以它不会进入无限循环。

问题是, map api 多次使用 setAt 函数,解决方案虽然有效,但并不完美,每次与多段线交互时我都需要担心 ignoreNextEvent。

我正在尝试找到一种方法来实现这一点,有人可以帮忙吗?

工作代码:

google.maps.event.addListener(cable.getPath(), 'set_at', function(e){
if(!ignoreNextEvent){
if(e == 0 || e == cable.getPath().length-1){
var point = new google.maps.LatLng(cable.Cable.vertex[e].latitude, cable.Cable.vertex[e].longitude);
ignoreNextEvent = true;
cable.getPath().setAt(e,point);
}else{
if(cable.Cable.idx != 0){ saveCable(index, cable.Cable.destination_idx); }
}
}else{
ignoreNextEvent = false;
}
});

最佳答案

创建折线,将可拖动标记绑定(bind)到您希望能够拖动的顶点,将不可拖动的标记绑定(bind)到您不希望能够拖动的顶点。

example

var gmarkers = [];
var map;

function addLatLng(event) {
var path = poly.getPath();
path.push(event.latLng);
var len = path.getLength();
var marker = new google.maps.Marker({
position: event.latLng,
title: '#' + len,
map: map,
icon: {
url: "https://maps.gstatic.com/intl/en_us/mapfiles/markers2/measle.png",
size: new google.maps.Size(7,7),
anchor: new google.maps.Point(4,4)
},
draggable : true
});
gmarkers.push(marker);
marker.bindTo('position', poly.binder, (len-1).toString());
}

function initialize() {
var polyOptions = {
strokeColor: '#000000',
strokeOpacity: 1.0,
strokeWeight: 3, map: map
};
poly = new google.maps.Polyline(polyOptions);
var bounds = new google.maps.LatLngBounds();
map = new google.maps.Map(document.getElementById('map_canvas'), {
center: new google.maps.LatLng(10.9386, -84.888),
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
});

poly.binder = new MVCArrayBinder(poly.getPath());
for(var i = 0; i < locations.length; i++) {
var evt = {};
evt.latLng = new google.maps.LatLng(locations[i][0], locations[i][1]);
bounds.extend(evt.latLng);
addLatLng(evt);
}
gmarkers[0].setDraggable(false);
gmarkers[gmarkers.length-1].setDraggable(false);


poly.setMap(map);
map.fitBounds(bounds);
}
google.maps.event.addDomListener(window, "load", initialize);

/*
* Use bindTo to allow dynamic drag of markers to refresh poly.
*/

function MVCArrayBinder(mvcArray){
this.array_ = mvcArray;
}
MVCArrayBinder.prototype = new google.maps.MVCObject();
MVCArrayBinder.prototype.get = function(key) {
if (!isNaN(parseInt(key))){
return this.array_.getAt(parseInt(key));
} else {
this.array_.get(key);
}
}
MVCArrayBinder.prototype.set = function(key, val) {
if (!isNaN(parseInt(key))){
this.array_.setAt(parseInt(key), val);
} else {
this.array_.set(key, val);
}
}

代码片段:

/*
* Use bindTo to allow dynamic drag of markers to refresh poly.
*/

function MVCArrayBinder(mvcArray) {
this.array_ = mvcArray;
}
MVCArrayBinder.prototype = new google.maps.MVCObject();
MVCArrayBinder.prototype.get = function(key) {
if (!isNaN(parseInt(key))) {
return this.array_.getAt(parseInt(key));
} else {
this.array_.get(key);
}
}
MVCArrayBinder.prototype.set = function(key, val) {
if (!isNaN(parseInt(key))) {
this.array_.setAt(parseInt(key), val);
} else {
this.array_.set(key, val);
}
}

/**
* Handles click events on a map, and adds a new point to the Polyline.
* @param {MouseEvent} mouseEvent
*/
function addLatLng(event) {
var path = poly.getPath();
path.push(event.latLng);
var len = path.getLength();
var marker = new google.maps.Marker({
position: event.latLng,
title: '#' + len,
map: map,
icon: {
url: "https://maps.gstatic.com/intl/en_us/mapfiles/markers2/measle.png",
size: new google.maps.Size(7, 7),
anchor: new google.maps.Point(4, 4)
},
draggable: true
});
gmarkers.push(marker);
marker.bindTo('position', poly.binder, (len - 1).toString());
}
var locations = [
[-33.890542, 151.274856, 4, 'Bondi Beach'],
[-33.923036, 151.259052, 5, 'Coogee Beach'],
[-34.028249, 151.157507, 3, 'Cronulla Beach'],
[-33.80010128657071, 151.28747820854187, 2, 'Manly Beach'],
[-33.950198, 151.259302, 1, 'Maroubra Beach']
];

var poly;
var map;
var gmarkers = [];

function initialize() {
var polyOptions = {
strokeColor: '#000000',
strokeOpacity: 1.0,
strokeWeight: 3,
map: map
};
poly = new google.maps.Polyline(polyOptions);
var bounds = new google.maps.LatLngBounds();
map = new google.maps.Map(document.getElementById('map_canvas'), {
center: new google.maps.LatLng(10.9386, -84.888),
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
});

poly.binder = new MVCArrayBinder(poly.getPath());
for (var i = 0; i < locations.length; i++) {
var evt = {};
evt.latLng = new google.maps.LatLng(locations[i][0], locations[i][1]);
bounds.extend(evt.latLng);
addLatLng(evt);
}
gmarkers[0].setDraggable(false);
gmarkers[0].setIcon({
url: "https://maps.gstatic.com/intl/en_us/mapfiles/markers2/measle_blue.png",
size: new google.maps.Size(7, 7),
anchor: new google.maps.Point(4, 4)
});
gmarkers[gmarkers.length - 1].setDraggable(false);
gmarkers[gmarkers.length - 1].setIcon({
url: "https://maps.gstatic.com/intl/en_us/mapfiles/markers2/measle_blue.png",
size: new google.maps.Size(7, 7),
anchor: new google.maps.Point(4, 4)
});


poly.setMap(map);
map.fitBounds(bounds);
}

google.maps.event.addDomListener(window, "load", initialize);
html,
body,
#map_canvas {
width: 100%;
height: 100%;
margin: 0px;
padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
<div id="map_canvas"></div>

关于javascript - 避免顶点拖动 map api v3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20633275/

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