如何从Google地图数据层中删除数据?

时间:2014-04-14 22:51:25

标签: javascript google-maps-api-3

我看到Google地图支持geojson。看看这里的文档: https://developers.google.com/maps/documentation/javascript/datalayer#load_geojson

鉴于" Google"的最后一个示例,如何才能使我可以点击按钮添加新的Geojson图层,以及另一个按钮来切换/删除" Google& #34;甚至是一封信?在我看来,map.data似乎是单个图层,而不是多个图层。

4 个答案:

答案 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 }); 选项很重要,否则数据层将不会显示。)

通过这种方式,可以更轻松地按图层对要素进行分组,以及打开或关闭整个图层。