标记新位置已创建,但旧位置也显示在 ajax 谷歌地图中
Marker new postion created but old is also showing in ajax google map
嗨,我
正在尝试从 Ajax 获取标记 latlon,我每秒获取 ajax 数据并且还能够在半径内创建标记,现在我面临更新标记位置的问题,如当前创建的新标记和旧标记也显示。请帮助更新我从 ajax 获得的标记并删除额外的标记。
var map = null;
var geocoder = null;
var markers = {};
var infoWindow = null;
var minZoomLevel = 16;
jQuery('#search').click(function() {
var address = jQuery('#address').val() || 'India';
if (map === null)
initializeMap();
searchAddress(address);
});
function initializeMap() {
var mapOptions = {
zoom: minZoomLevel,
draggable: true,
disableDefaultUI: true,
scrollwheel: true,
disableDoubleClickZoom: true,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
initialLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
map.setCenter(initialLocation);
// Limit the zoom level
google.maps.event.addListener(map, 'zoom_changed', function () {
if (map.getZoom() < minZoomLevel) map.setZoom(minZoomLevel);
});
});
}
google.maps.event.addListener(map, "idle", function(event) {
searchStoresBounds();
});
geocoder = new google.maps.Geocoder();
infoWindow = new google.maps.InfoWindow();
}
function searchAddress(address) {
geocoder.geocode( { 'address': address}, function(results, status) {
if (status === google.maps.GeocoderStatus.OK) {
var latlng = results[0].geometry.location;
map.setCenter(latlng);
// Limit the zoom level
google.maps.event.addListener(map, 'zoom_changed', function () {
if (map.getZoom() < minZoomLevel) map.setZoom(minZoomLevel);
});
searchStoresBounds();
} else {
alert('Geocode was failed: ' + status);
}
});
}
setInterval(function searchStoresBounds() {
var bounds = map.getCenter().toUrlValue();
var url = './store.php';
var parameter = { bounds: bounds };
jQuery.ajax({
url: url,
data: parameter,
dataType: 'json',
success: showStores
});
}, 1000);
function showStores(data, status, xhr) {
if (data['status'] != 'OK')
return;
var id;
// add markers for new stores
for (id in data['data']) {
if (markers[id] === undefined)
createMarker(id, data['data'][id]);
}
var b = map.getBounds();
// remove markers out of the bounds
for (id in markers) {
if (! b.contains(markers[id].getPosition())) {
markers[id].setMap(null);
delete markers[id];
}else{createMarker(id, data['data'][id]);}
}
}
function createMarker(id, store) {
var latlng = new google.maps.LatLng(
parseFloat(store['lat']),
parseFloat(store['lng'])
);
var html = "<b>" + store['address'] + "</b>";
var x = store['distance'];
var y = 1000;
var z = x * y;
var m = 85;
var t = z / m;
document.getElementById("demo").innerHTML = Math.ceil(t);
var headm = store['bearing'];
var car = "M17.402,0H5.643C2.526,0,0,3.467,0,6.584v34.804c0,3.116,2.526,5.644,5.643,5.644h11.759c3.116,0,5.644-
2.527,5.644-5.644 V6.584C23.044,3.467,20.518,0,17.402,0z M22.057,14.188v11.665l-2.729,0.351v-4.806L22.057,14.188z
M20.625,10.773 c-1.016,3.9-2.219,8.51-2.219,8.51H4.638l-2.222-8.51C2.417,10.773,11.3,7.755,20.625,10.773z
M3.748,21.713v4.492l-2.73-0.349 V14.502L3.748,21.713z M1.018,37.938V27.579l2.73,0.343v8.196L1.018,37.938z
M2.575,40.882l2.218-3.336h13.771l2.219,3.336H2.575z M19.328,35.805v-7.872l2.729-0.355v10.048L19.328,35.805z";
var icon = {
path: car,
scale: .7,
strokeColor: 'White',
strokeWeight: .4,
fillOpacity: 1,
fillColor: '#333333',
offset: '5%',
rotation: parseInt(headm),
// rotation: parseInt(heading[i]),
anchor: new google.maps.Point(10, 25) // orig 10,50 back of car, 10,0 front of car, 10,25 center of car
};
var marker = new google.maps.Marker({
map: map,
position: latlng,
icon: icon,
});
google.maps.event.addListener(marker, 'click', function() {
infoWindow.setContent(html);
infoWindow.open(map, marker);
});
markers[id] = marker;
}
由于
这部分,您正面临问题
var marker = new google.maps.Marker({
map: map,
position: latlng,
icon: icon,
});
每次从 ajax 获取数据时,它都会创建一个新标记。
在 js 页面顶部添加以下声明
var marker;
并将标记创建更改为以下内容
if(marker)
{
marker.setMap(null);
}
marker = new google.maps.Marker({
map: map,
position: latlng,
icon: icon,
});
在创建新标记之前,将从地图中移除前一个标记。if(标记)部分用于检查是否已创建标记实例,因为第一次运行时将没有标记,并且在尝试删除标记时会出现错误。
编辑 1 :
由于您有多个标记,因此您需要存储标记数组并删除它们,然后再在地图上添加新标记
在页面顶部,您需要声明
var markerArray = new Array();
在添加标记之前,您需要清除以前的标记
for(var i = 0; i<markerArray.length; i++)
{
markerArray[i].setMap(null);
}
markerArray = new Array()
之后将是你当前的代码
var marker = new google.maps.Marker({
map: map,
position: latlng,
icon: icon,
});
markerArray.push(marker);
您需要将标记添加到 markerArray,以便在下次执行代码时可以清除它。
相关文章:
- 当选择值x时,Javascript需要在正确的位置显示文本区域,从而循环通过具有选择选项的表单
- 在固定位置显示随机图像
- 在两个位置显示数组中的随机单词
- 如何编写 JQuery 函数以在 Django 模板的特殊位置显示文本
- 更改信息窗口的位置显示在谷歌地图API v3中
- 地图框如何在当前位置显示标记
- 在单击位置显示动画
- Angularjs-将指令中的值绑定到文档中的任意位置显示/隐藏
- 无序列表 jQuery 在固定位置显示列表中的选定项
- 如何将图像链接与 HTML 和 CSS 一起使用时,悬停时在其他位置显示图像
- 默认情况下,在 angularjs 中选择下拉列表中的最后一个位置显示占位符
- 如何使用文本在页面上的不同位置显示更多文本
- 在 Y 屏幕位置显示 CSS 动画
- 如何根据同一城市内的地理位置显示独特的内容
- 隐藏元素,但将该位置显示为空白
- 如何隐藏一个锚标记并在同一位置显示另一个锚标记
- 通过单击单个链接在网站的多个位置显示和隐藏文本
- AngularJS-如何在浏览器上的任意位置显示奇数次点击的元素
- 如何使用php在谷歌地图中按位置显示多个区域
- 一个不断变化的JavaScript变量在HTML中的多个位置显示(并更新)