javascript - Google Maps Api:无法点击数据层后面的可点击多边形
问题描述
您好我正在使用 google maps api(JavaScript) 来构建交互式世界地图。在我遇到这个问题之前,一切都很顺利。我正在使用多边形来显示一个国家的轮廓。这些多边形在点击时会触发一个显示国家信息的模式。这一直有效,直到我开始使用“数据层:地震数据”。我没有使用地震数据,而是使用我工作的公司的销售信息。因此,如果我们的大部分客户来自荷兰,那么分配给荷兰的数据层将非常大。问题是由于数据层,国家不再可点击。我无法单击“通过”数据层。是否有可能触发数据层背后的事件?
此代码显示数据层:
map.data.loadGeoJson('./data/test.json');
map.data.setStyle(function(feature) {
var percentage = parseFloat(feature.getProperty('percentage'));
return ({
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: percentage,
fillColor: '#00ff00',
fillOpacity: 0.35,
strokeWeight: 0
}
})
});
map.data.addListener('mouseover', function(event) {
map.data.overrideStyle(event.feature, {
title: 'Hello, World!'
});
});
map.data.addListener('mouseout', function(event) {
map.data.revertStyle();
});
function eqfeed_callback(data) {
map.data.addGeoJson(data);
}
此代码显示多边形:
function drawMap(data) {
var rows = data['rows'];
for (var i in rows) {
if (rows[i][0] != 'Antarctica') {
var newCoordinates = [];
var geometries = rows[i][1]['geometries'];
if (geometries) {
for (var j in geometries) {
newCoordinates.push(constructNewCoordinates(geometries[j]));
}
} else {
newCoordinates = constructNewCoordinates(rows[i][1]['geometry']);
}
var country = new google.maps.Polygon({
paths: newCoordinates,
strokeColor: 'transparent',
strokeOpacity: 1,
strokeWeight: 0.3,
fillColor: '#cd0000',
fillOpacity: 0,
name: rows[i][0]
});
google.maps.event.addListener(country, 'mouseover', function() {
this.setOptions({
fillOpacity: 0.3
});
});
google.maps.event.addListener(country, 'mouseout', function() {
this.setOptions({
fillOpacity: 0
});
});
google.maps.event.addListener(country, 'click', function() {
var countryName = this.name;
var code = convert(countryName); // Calls a function that converts the name of the country to its official ISO 3166-1 alpha-2 code.
var modal = document.querySelector('.modal');
var instance = M.Modal.init(modal);
instance.open();
});
country.setMap(map);
}
}
如果在文档中读到更改 zIndex 将不起作用,因为“标记始终显示在线串和多边形的前面。”
有没有办法点击数据层后面的多边形?
编辑 我试图给多边形一个更高的 zIndex 并且我使数据层不可点击
map.data.loadGeoJson('./data/test.json');
map.data.setStyle(function(feature) {
var percentage = parseFloat(feature.getProperty('percentage'));
return ({
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: percentage,
fillColor: '#00ff00',
fillOpacity: 0.35,
strokeWeight: 0,
clickAble: false,
zIndex: 50
}
})
});
function eqfeed_callback(data) {
map.data.addGeoJson(data);
}
function drawMap(data) {
var rows = data['rows'];
for (var i in rows) {
if (rows[i][0] != 'Antarctica') {
var newCoordinates = [];
var geometries = rows[i][1]['geometries'];
if (geometries) {
for (var j in geometries) {
newCoordinates.push(constructNewCoordinates(geometries[j]));
}
} else {
newCoordinates = constructNewCoordinates(rows[i][1]['geometry']);
}
var country = new google.maps.Polygon({
paths: newCoordinates,
strokeColor: 'transparent',
strokeOpacity: 1,
strokeWeight: 0.3,
fillColor: '#cd0000',
fillOpacity: 0,
name: rows[i][0],
zIndex: 100
});
google.maps.event.addListener(country, 'mouseover', function() {
this.setOptions({
fillOpacity: 0.3
});
});
google.maps.event.addListener(country, 'mouseout', function() {
this.setOptions({
fillOpacity: 0
});
});
google.maps.event.addListener(country, 'click', function() {
var countryName = this.name;
var code = convert(countryName); // Calls a function that converts the name of the country to its official ISO 3166-1 alpha-2 code.
var modal = document.querySelector('.modal');
var instance = M.Modal.init(modal);
instance.open();
});
country.setMap(map);
}
}
//console.log(map);
//test(map)
}
编辑 显然数据层不是问题,但图标是。这就是为什么当我这样做时它不起作用:
map.data.setStyle(function(feature) {
var percentage = parseFloat(feature.getProperty('percentage'));
return ({
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: percentage,
fillColor: '#00ff00',
fillOpacity: 0.35,
strokeWeight: 0,
clickable: false
}
})
});
正确的做法是这样的:
map.data.setStyle(function(feature) {
var percentage = parseFloat(feature.getProperty('percentage'));
return ({
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: percentage,
fillColor: '#00ff00',
fillOpacity: 0.35,
strokeWeight: 0
},
clickable: false
})
});
解决方案
您在这里基本上有两个选择:
将
zIndex
多边形的 设置为比数据层更高的数字。您的多边形将是可点击的,但显然会出现在数据层上方,这可能不是您想要的。将
clickable
数据层的属性设置为 false,以便您可以单击下方的元素。如果您不需要对数据层上的点击做出反应,这将起作用......
选项 2 示例代码:
map.data.setStyle({
clickable: false
});
编辑:下面的完整工作示例,使用选项 2。如您所见,多边形位于数据层下方,但您仍然可以单击它。
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 4,
center: {
lat: -28,
lng: 137
}
});
var polygon = new google.maps.Polygon({
strokeOpacity: 0,
strokeWeight: 0,
fillColor: '#00FF00',
fillOpacity: .6,
paths: [
new google.maps.LatLng(-26, 139),
new google.maps.LatLng(-23, 130),
new google.maps.LatLng(-35, 130),
new google.maps.LatLng(-26, 139)
],
map: map
});
polygon.addListener('click', function() {
console.log('clicked on polygon');
});
// Load GeoJSON
map.data.loadGeoJson('https://storage.googleapis.com/mapsdevsite/json/google.json');
// Set style
map.data.setStyle({
fillColor: '#fff',
fillOpacity: 1,
clickable: false
});
}
#map {
height: 200px;
}
<script async defer src="https://maps.googleapis.com/maps/api/js?callback=initMap"></script>
<div id="map"></div>
推荐阅读
- python - 使用字符串时间格式函数 strftime 构造下一个字符串
- javascript - 如何在 Chrome 扩展中按类抓取页面内容?
- firebase - Firebase 存储安全规则中有哪些不同类型的匹配?
- ios - 使用 NSManagedObject 作为 MKAnnotation 会导致 MKMapView 在较新的设备中崩溃
- laravel - Laravel 验证规则 - 如何可选,但前提是另一个条件为真
- jasmine - JasmineJS + AngularJS:如何模拟 Spy#callFake() 中的延迟
- php - 调试 Laravel 应用程序以及它是如何运行的?
- windows - 如何修复“builddir 未被识别为内部或外部命令”。构建libiconv时出错?
- sql - 如何修复sql连接
- php - exit() 被跳过/忽略并且不停止脚本执行