GeoJSON представляет собой стандарт обмена географическими данными, основанный на JSON. В Google Maps JavaScript API он используется через слой данных (Data Layer), который обеспечивает загрузку, отображение и управление геометриями без необходимости вручную создавать маркеры, полигоны или линии.
Основная ценность GeoJSON в контексте картографических приложений заключается в том, что он отделяет данные от визуализации, позволяя динамически обновлять географические объекты и управлять ими как единым набором.
Google Maps API поддерживает стандарт RFC 7946, в котором координаты задаются в формате [долгота, широта], что критично при работе с данными:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [76.9457, 43.2565]
},
"properties": {
"name": "Объект"
}
}
]
}
Ключевые элементы:
[lng, lat]Основной способ интеграции — использование метода
loadGeoJson объекта map.data.
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 43.2565, lng: 76.9457 },
zoom: 10
});
map.data.loadGeoJson("data/objects.json");
Метод выполняет HTTP-запрос, загружает файл и автоматически добавляет все объекты в слой данных карты.
Особенности поведения:
При наличии уже загруженного JSON-объекта используется
addGeoJson:
fetch("data/objects.json")
.then(response => response.json())
.then(data => {
map.data.addGeoJson(data);
});
Отличие от loadGeoJson:
После загрузки все элементы отображаются с базовым стилем Google
Maps. Управление визуализацией осуществляется через
setStyle:
map.data.setStyle(feature => {
return {
fillColor: "#2E7D32",
fillOpacity: 0.4,
strokeColor: "#1B5E20",
strokeWeight: 2,
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: 6
}
};
});
Возможности стилизации:
propertiesПример условного стиля:
map.data.setStyle(feature => {
const type = feature.getProperty("type");
return {
fillColor: type === "park" ? "green" : "gray",
strokeWeight: 1
};
});
Data Layer поддерживает событийную модель:
map.data.addListener("click", event => {
const name = event.feature.getProperty("name");
console.log(name);
});
Основные события:
click — взаимодействие с объектомmouseover — наведениеmouseout — уход курсораaddfeature — добавление объектаremovefeature — удаление объектаОбъект события содержит:
feature — GeoJSON FeaturepropertiesПосле загрузки часто требуется вычислить границы всех объектов:
const bounds = new google.maps.LatLngBounds();
map.data.forEach(feature => {
feature.getGeometry().forEachLatLng(latlng => {
bounds.extend(latlng);
});
});
map.fitBounds(bounds);
Это позволяет автоматически масштабировать карту под загруженный набор данных независимо от его географического охвата.
Data Layer поддерживает изменение данных без перезагрузки карты:
map.data.add({
geometry: new google.maps.Data.Point({ lat: 43.25, lng: 76.95 }),
properties: { name: "Новый объект" }
});
Удаление объектов:
map.data.forEach(feature => {
if (feature.getProperty("id") === 10) {
map.data.remove(feature);
}
});
Обновление свойств:
feature.setProperty("status", "active");
При загрузке через loadGeoJson действует стандартная
политика CORS браузера.
Типовые ограничения:
Access-Control-Allow-Originfile:// могут блокироватьсяПример корректного запроса:
map.data.loadGeoJson("https://example.com/geo/data.json");
Data Layer позволяет скрывать или показывать элементы без удаления:
map.data.setStyle(feature => {
return {
visible: feature.getProperty("active") === true
};
});
Также можно использовать глобальную фильтрацию:
map.data.revertStyle();
Перед добавлением данных часто требуется их нормализация:
fetch("data.json")
.then(res => res.json())
.then(data => {
data.features = data.features.filter(f => f.geometry);
data.features.forEach(f => {
f.properties.timestamp = Date.now();
});
map.data.addGeoJson(data);
});
Типовые операции:
При работе с тысячами объектов критично учитывать нагрузку Data Layer:
Оптимизация через разделение данных:
["region1.json", "region2.json"].forEach(url => {
map.data.loadGeoJson(url);
});
Поддерживаемые типы GeoJSON:
Пример полигона:
{
"type": "Polygon",
"coordinates": [
[
[76.9, 43.2],
[77.0, 43.2],
[77.0, 43.3],
[76.9, 43.3],
[76.9, 43.2]
]
]
}
GeoJSON часто выступает промежуточным форматом между backend и картой:
async function loadFromAPI() {
const response = await fetch("/api/objects");
const geojson = await response.json();
map.data.addGeoJson(geojson);
}
Серверные системы обычно формируют FeatureCollection на основе:
Полная очистка Data Layer выполняется через удаление всех features:
map.data.forEach(feature => {
map.data.remove(feature);
});
После этого слой готов к новой загрузке GeoJSON без перезагрузки карты.