Javascript 事件侦听器中的数据层没有响应(Google Maps API)
我有一个函数,将geoJSON加载到地图中,然后在达到特定缩放级别时替换它。当Javascript 事件侦听器中的数据层没有响应(Google Maps API),javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我有一个函数,将geoJSON加载到地图中,然后在达到特定缩放级别时替换它。当window.map.data.setMap(null)为被注释掉,但仅在缩放级别更改时堆积在所有贴图上。取消注释setMap(null)行会在缩放级别更改时删除贴图,但不允许新文件替换它;在将数据层绑定到变量时,我始终没有定义(请参见末尾的图片): 这是我当前设置断点时得到的结果: 我缺少的联系是什么?文档()表明loadGeoJSON和zoomchange是不兼容的方法,这似乎不太可能。在我看来,您要做的是为每个
window.map.data.setMap(null)为代码>被注释掉,但仅在缩放级别更改时堆积在所有贴图上。取消注释setMap(null)
行会在缩放级别更改时删除贴图,但不允许新文件替换它;在将数据层绑定到变量时,我始终没有定义(请参见末尾的图片):
这是我当前设置断点时得到的结果:
我缺少的联系是什么?文档()表明loadGeoJSON和zoomchange是不兼容的方法,这似乎不太可能。在我看来,您要做的是为每个数据集创建一个数据层。然后根据缩放级别对其进行管理。当它们第一次可见时创建它们,当它们隐藏时将其map属性设置为null,当希望它们可见时将其设置为map变量
var districtLayer, cityLayer, countyLayer;
window.map.addListener('zoom_changed', function() {
var zoomLevel = map.getZoom();
if (zoomLevel < 12 && zoomLevel > 9) {
// city level, hide district and county layers
if (districtLayer && districtLayer.setMap)
districtLayer.setMap(null);
if (countyLayer && countyLayer.setMap)
countyLayer.setMap(null);
if (countyLayer && countyLayer.setMap)
countyLayer.setMap(null);
if (!cityLayer) {
cityLayer = new google.maps.Data();
cityLayer.addGeoJson(cities);
}
cityLayer.setMap(map);
} else if (zoomLevel <= 9) {
// county level, hide city and county layers
if (cityLayer && cityLayer.setMap)
cityLayer.setMap(null);
if (districtLayer && districtLayer.setMap)
districtLayer.setMap(null);
if (!countyLayer) {
countyLayer = new google.maps.Data();
countyLayer.addGeoJson(county);
}
countyLayer.setMap(map);
} else if (zoomLevel >= 12) {
// city level, hide district and county layers
if (cityLayer && cityLayer.setMap)
cityLayer.setMap(null);
if (countyLayer && countyLayer.setMap)
countyLayer.setMap(null);
if (!districtLayer) {
districtLayer = new google.maps.Data();
districtLayer.addGeoJson(district);
}
districtLayer.setMap(map);
}
});
哦,哇,太好了!所以我会将geojson作为变量加载进来,然后根据需要调用它们。非常感谢。
// load data - do the same for data2, data3 or whatever
data1 = new google.maps.Data();
data1.loadGeoJson(url1);
// create some layer control logic for turning on data1
data1.setMap(map) // or restyle or whatever
// turn off data1 and turn on data2
data1.setMap(null) // hides it
data2.setMap(map) // displays data2
var districtLayer, cityLayer, countyLayer;
window.map.addListener('zoom_changed', function() {
var zoomLevel = map.getZoom();
if (zoomLevel < 12 && zoomLevel > 9) {
// city level, hide district and county layers
if (districtLayer && districtLayer.setMap)
districtLayer.setMap(null);
if (countyLayer && countyLayer.setMap)
countyLayer.setMap(null);
if (countyLayer && countyLayer.setMap)
countyLayer.setMap(null);
if (!cityLayer) {
cityLayer = new google.maps.Data();
cityLayer.addGeoJson(cities);
}
cityLayer.setMap(map);
} else if (zoomLevel <= 9) {
// county level, hide city and county layers
if (cityLayer && cityLayer.setMap)
cityLayer.setMap(null);
if (districtLayer && districtLayer.setMap)
districtLayer.setMap(null);
if (!countyLayer) {
countyLayer = new google.maps.Data();
countyLayer.addGeoJson(county);
}
countyLayer.setMap(map);
} else if (zoomLevel >= 12) {
// city level, hide district and county layers
if (cityLayer && cityLayer.setMap)
cityLayer.setMap(null);
if (countyLayer && countyLayer.setMap)
countyLayer.setMap(null);
if (!districtLayer) {
districtLayer = new google.maps.Data();
districtLayer.addGeoJson(district);
}
districtLayer.setMap(map);
}
});