Как удалить данные из слоя данных Карт Google?

Я вижу, что Google Maps поддерживает geojson. Глядя на документы здесь: https://developers.google.com/maps/documentation/javascript/datalayer#load_geojson

Учитывая последний пример с "Google", как я могу сделать так, чтобы я мог нажать кнопку, чтобы добавить новый слой Geojson, и еще одну кнопку для переключения/удаления "Google" или даже письма? Мне кажется, что map.data представляется одним слоем и не является несколькими слоями.

Ответ 1

Вы правы в том, что слой данных является одним слоем. Однако, если вы вручную извлечете GeoJSON и используете функцию addGeoJson вместо loadGeoJson, вы получите возвращаемые дополнительные функции. Вы можете удалить их позже.

Итак, вместо

map.data.loadGeoJson('https://storage.googleapis.com/maps-devrel/google.json');

Вы можете сделать что-то подобное (этот пример использует jQuery для получения данных и предполагает наличие кнопки с идентификатором 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]);
  }); 
}); 

(См. этот JSbin для рабочего примера, с которым вы можете играть с)

В более сложных условиях вам, вероятно, придется отслеживать, какой источник данных загружен пользователем, и созданные функции из-за этого, поэтому вы можете удалить их по запросу.

Ответ 2

Это сработало для меня:

map.data.forEach(function(feature) {
    // filter...
    map.data.remove(feature);
});

Ответ 3

В то время как 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

Ответ 4

В качестве ответа на ответ @mensi может быть важно отслеживать различные наборы функций, загруженных из разных источников данных. Вы можете сделать это, добавив свойство к каждой функции:

feature.setProperty('kind', 'region');
feature.setProperty('kind', 'lake');

Однако может быть проще создать несколько слоев данных. Карта Google по умолчанию начинается с одного слоя данных, но вы не ограничены этим. Ты можешь сделать:

var datalayer = new google.maps.Data({ map: mymap });

(Важно установить параметр map, иначе слой данных не будет отображаться.)

Таким образом, будет проще группировать объекты по слоям и включать или выключать целые слои.