谷歌地图javascript
我有一个带有初始谷歌地图(城市)和组合框的页面。用户可以通过在地图上拖动标记来选择位置,然后将该值(lang,long)保存到隐藏字段并传递给服务器。不过,该组合列出了一些城市区域。当用户选择一个区域时,谷歌地图将被更改:城市地图将消失,并显示所选区域的地图。这是通过getJSON完成的,而且一切都很好 我的问题是如何启用具有相同功能的第二个地图(区域地图)(更新可拖动标记的位置)。我知道监听器最初是绑定到初始映射的,我只是不知道足够多的javascript来理解将这些函数放在哪里,以便在新映射上启用这些功能,也许是jquery live的功能 我在这方面得到了很大的帮助,但这并不能解决我的问题 代码如下谷歌地图javascript,javascript,google-maps,Javascript,Google Maps,我有一个带有初始谷歌地图(城市)和组合框的页面。用户可以通过在地图上拖动标记来选择位置,然后将该值(lang,long)保存到隐藏字段并传递给服务器。不过,该组合列出了一些城市区域。当用户选择一个区域时,谷歌地图将被更改:城市地图将消失,并显示所选区域的地图。这是通过getJSON完成的,而且一切都很好 我的问题是如何启用具有相同功能的第二个地图(区域地图)(更新可拖动标记的位置)。我知道监听器最初是绑定到初始映射的,我只是不知道足够多的javascript来理解将这些函数放在哪里,以便在新映射
<script type="text/javascript" src="/site_media/js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
$(function() {
$("#id_area").change(function() {
var url = '/areageo/'+this.value;
$.getJSON(url, function(data) {
if (data.lat){
$('#mapCanvas').empty();
// map options
var options = {
zoom: 14,
center: new google.maps.LatLng(data.lat, data.lon),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
// Creating the map
var map = new google.maps.Map(document.getElementById('mapCanvas'), options);
// Adding a marker to the map
var marker = new google.maps.Marker({
position: new google.maps.LatLng(data.lat, data.lon),
map: map,
title: 'Some title',
draggable: true,
});
}
}); //getJSON end function
}); //id_area change end function
});
var geocoder = new google.maps.Geocoder();
function geocodePosition(pos) {
geocoder.geocode({
latLng: pos
}, function(responses) {
if (responses && responses.length > 0) {
updateMarkerAddress(responses[0].formatted_address);
} else {
updateMarkerAddress('Cannot determine address at this location.');
}
});
}
function updateMarkerStatus(str) {
document.getElementById('markerStatus').innerHTML = str;
}
function updateMarkerPosition(latLng) {
document.getElementById('info').innerHTML = [
latLng.lat(),
latLng.lng()
].join(', ');
id_lat.value = [
latLng.lat()];
id_lon.value = [
latLng.lng()];
}
function updateMarkerAddress(str) {
document.getElementById('address').innerHTML = str;
}
// initial setup
function initialize() {
var latLng = new google.maps.LatLng(44.77184334415235, 20.55164378320319); // initial map position
var map = new google.maps.Map(document.getElementById('mapCanvas'), {
zoom: 12, // initial zoom
center: latLng,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
position: latLng,
title: 'Point A',
map: map,
draggable: true,
});
// Update current position info.
updateMarkerPosition(latLng);
geocodePosition(latLng);
// Add dragging event listeners.
google.maps.event.addListener(marker, 'dragstart', function() {
updateMarkerAddress('Dragging...');
});
google.maps.event.addListener(marker, 'drag', function() {
updateMarkerStatus('Dragging...');
updateMarkerPosition(marker.getPosition());
});
google.maps.event.addListener(marker, 'dragend', function() {
updateMarkerStatus('Drag ended');
geocodePosition(marker.getPosition());
});
}
// Onload handler to fire off the app.
google.maps.event.addDomListener(window, 'load', initialize);
</script>
$(函数(){
$(“#id_区域”)。更改(函数(){
var url='/areageo/'+this.value;
$.getJSON(url、函数(数据){
if(data.lat){
$('#mapCanvas').empty();
//地图选项
变量选项={
缩放:14,
中心:新的google.maps.LatLng(data.lat,data.lon),
mapTypeId:google.maps.mapTypeId.ROADMAP
};
//创建地图
var map=new google.maps.map(document.getElementById('mapCanvas'),选项);
//向地图添加标记
var marker=new google.maps.marker({
位置:新的google.maps.LatLng(data.lat,data.lon),
地图:地图,
标题:“一些标题”,
真的,
});
}
});//getJSON结束函数
});//id_区域更改结束函数
});
var geocoder=new google.maps.geocoder();
功能地理编码定位(pos){
地理编码({
车床:位置
},职能(回应){
if(responses&&responses.length>0){
UpdateMarkeradAddress(响应[0]。格式化的\u地址);
}否则{
UpdateMarkeradAddress('无法确定此位置的地址');
}
});
}
函数updateMarkerStatus(str){
document.getElementById('markerStatus')。innerHTML=str;
}
函数更新标记位置(latLng){
document.getElementById('info')。innerHTML=[
latLng.lat(),
latLng.lng()
]。加入(‘,’);
id_lat.value=[
latLng.lat();
id_lon.value=[
latLng.lng();
}
函数更新标记地址(str){
document.getElementById('address')。innerHTML=str;
}
//初始设置
函数初始化(){
var latLng=new google.maps.latLng(44.771843344132523520.55164378320319);//初始地图位置
var map=new google.maps.map(document.getElementById('mapCanvas'){
缩放:12,//初始缩放
中心:拉特林,
mapTypeId:google.maps.mapTypeId.ROADMAP
});
var marker=new google.maps.marker({
位置:latLng,
标题:“A点”,
地图:地图,
真的,
});
//更新当前职位信息。
更新市场定位(latLng);
地理共定位(latLng);
//添加拖动事件侦听器。
google.maps.event.addListener(标记'dragstart',函数(){
UpdateMarkeradAddress('拖动…');
});
google.maps.event.addListener(标记'drag',function(){
updateMarkerStatus('拖动…');
updateMarkerPosition(marker.getPosition());
});
google.maps.event.addListener(标记'dragend',function(){
updateMarkerStatus(“拖动结束”);
geocodePosition(marker.getPosition());
});
}
//用于启动应用程序的Onload处理程序。
google.maps.event.addDomListener(窗口“加载”,初始化);
简单的答案是不要扔掉地图。当用户选择郊区时,将现有地图缩放到该区域(必要时移动标记使其可见)。那么你就不必重新定义任何东西了
如果你有一张地图,试着用这张地图做任何事情。你永远不应该破坏它:只是让它展示一些别的东西。
所以你的
if(data.lat){…
block只需将地图集中在data.lat,data.lon上,并将现有的标记移动到该位置。因为标记仍然是同一个标记,而地图仍然是同一个地图,您不需要重新创建侦听器或任何东西。这听起来很好,也很合乎逻辑,我只需使用同一个地图并动态更改它即可使用我,再问一个问题,如果我使用函数initialize()声明初始映射,外部代码是否可以看到它{var latLng=new google.maps.latLng(44.77184,20.55164);var map=new google.maps.map(document.getElementById('mapCanvas'),{…如果var-map
出现在函数内部,则它是该函数的本地对象,在其他位置不可用。在全局范围(任何函数外部)中使用var-map;
,然后使用map=new google.maps.map(…)将映射对象分配给该对象
函数内部。是的。我得到了它-删除了变量,一切都很好。非常感谢安德鲁,你救了我!