我看到Google地图支持geojson。看看这里的文档: https://developers.google.com/maps/documentation/javascript/datalayer#load_geojson
鉴于" Google"的最后一个示例,如何才能使我可以点击按钮添加新的Geojson图层,以及另一个按钮来切换/删除" Google& #34;甚至是一封信?在我看来,map.data似乎是单个图层,而不是多个图层。
答案 0 :(得分:29)
您的正确之处在于数据层是单层。但是,如果您手动检索GeoJSON并使用addGeoJson
函数而不是loadGeoJson
,则会返回添加的功能。您可以稍后删除它们。
所以而不是
map.data.loadGeoJson('https://storage.googleapis.com/maps-devrel/google.json');
你可以这样做(这个例子使用jQuery来获取数据并假设有一个ID为removeBtn的按钮):
// Load the GeoJSON manually (works cross-origin since google sets the required HTTP headers)
$.getJSON('https://storage.googleapis.com/maps-devrel/google.json', function (data) {
var features = map.data.addGeoJson(data);
// Setup event handler to remove GeoJSON features
google.maps.event.addDomListener(document.getElementById('removeBtn'), 'click', function () {
for (var i = 0; i < features.length; i++)
map.data.remove(features[i]);
});
});
(See this JSbin for a working example you can play around with)
在更复杂的情况下,您可能必须跟踪用户加载的数据源以及因此而创建的功能,以便您可以在请求时将其删除。
答案 1 :(得分:21)
这对我有用:
map.data.forEach(function(feature) {
// filter...
map.data.remove(feature);
});
答案 2 :(得分:17)
虽然map.data
被设计为单个数据源的常见情况的占位符,但您可以使用多个,并且仍然使用addGeoJSon
使用类似的内容:
// 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
答案 3 :(得分:0)
作为@mensi答案的后续措施,跟踪从不同数据源加载的不同功能集可能很重要。您可以通过向每个功能添加属性来做到这一点:
# Determine the control limit values (red lines)
Golden_Egg_df$egg_diameter[11] <- 5
p2 <- ggplot(Golden_Egg_df, aes(x = month, y = egg_diameter)) +
geom_point() +
geom_line() +
stat_QC(method = "XmR") +
facet_grid(~ grp, scales = "free_x", space = "free_x") +
scale_x_continuous(breaks = 1:12, labels = month.abb)
pb2 <- ggplot_build(p2)
thres2 <- range(pb2$data[[3]]$yintercept)
thres2
#> [1] -2.274056 7.445141
# Circle anything outside the control limits (red lines)
p2 + geom_point(
data = subset(Golden_Egg_df,
egg_diameter > max(thres2) | egg_diameter < min(thres2)),
shape = 21,
size = 4,
col = "red"
)
但是,创建多个数据层可能更容易。默认情况下,Google Map从一个数据层开始,但您不仅限于此。您可以这样做:
feature.setProperty('kind', 'region');
feature.setProperty('kind', 'lake');
(设置var datalayer = new google.maps.Data({ map: mymap });
选项很重要,否则数据层将不会显示。)
通过这种方式,可以更轻松地按图层对要素进行分组,以及打开或关闭整个图层。