GeoJSON используется как основной формат обмена географическими данными при работе с веб-картами. В экосистеме HERE Technologies он применяется для загрузки, структурирования и визуализации пространственных объектов на интерактивных картах, включая точки, линии и полигоны. Формат GeoJSON основан на JSON и описывает геометрию вместе с атрибутами объектов, что делает его удобным для клиентской отрисовки без промежуточных преобразований.
GeoJSON строится вокруг базовых сущностей: FeatureCollection, Feature и Geometry. FeatureCollection представляет собой контейнер для набора объектов, Feature объединяет геометрию и свойства, а Geometry описывает пространственную форму.
Основные типы геометрии:
При интеграции с HERE Maps API важным аспектом является соответствие координатной системы WGS84 (долгота, широта), поскольку именно она используется в GeoJSON по спецификации.
В JavaScript SDK сначала создаётся карта и платформа доступа к сервисам:
const platform = new H.service.Platform({
apikey: 'YOUR_API_KEY'
});
const defaultLayers = platform.createDefaultLayers();
const map = new H.Map(
document.getElementById('mapContainer'),
defaultLayers.vector.normal.map,
{
center: { lat: 52.5200, lng: 13.4050 },
zoom: 10,
pixelRatio: window.devicePixelRatio || 1
}
);
const beh * avior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map));
const ui = H.ui.UI.createDefault(map, defaultLayers);
После инициализации карты становится доступна работа с GeoJSON-слоями
через H.data.geojson.Reader.
HERE Maps API предоставляет встроенный парсер GeoJSON, который преобразует структуру в визуальные объекты карты.
const geojsonData = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "Объект A",
"category": "point"
},
"geometry": {
"type": "Point",
"coordinates": [13.4050, 52.52]
}
}
]
};
const reader = new H.data.geojson.Reader(geojsonData, {
style: (feature) => {
const props = feature.getProperties();
if (props.category === 'point') {
return {
icon: new H.map.Icon('marker.png')
};
}
return {};
}
});
map.addLayer(reader.getLayer());
Reader автоматически преобразует FeatureCollection в набор map objects, сохраняя свойства каждого элемента для последующей обработки.
Стилизация выполняется на уровне feature, что позволяет динамически изменять визуальное представление объектов.
style: (feature) => {
const props = feature.getProperties();
if (props.population > 1000000) {
return {
fillColor: 'rgba(255, 0, 0, 0.6)',
strokeColor: '#ff0000',
lineWidth: 2
};
}
return {
fillColor: 'rgba(0, 0, 255, 0.4)',
strokeColor: '#0000ff',
lineWidth: 1
};
}
Такой подход позволяет реализовать тематическое картографирование (choropleth mapping), где визуальные параметры зависят от атрибутов данных.
Каждый объект, созданный из GeoJSON, становится интерактивным элементом карты. К нему можно привязывать события:
map.addEventListener('tap', function (evt) {
const target = evt.target;
if (target instanceof H.map.Polygon || target instanceof H.map.Marker) {
const data = target.getData();
console.log('Выбран объект:', data.properties);
}
});
Метод getData() возвращает исходные свойства Feature,
что позволяет связывать визуальные элементы с бизнес-логикой
приложения.
GeoJSON-данные часто обновляются в реальном времени или требуют фильтрации по условиям.
const filtered = {
...geojsonData,
features: geojsonData.features.filter(f =>
f.properties.category === 'important'
)
};
reader.setData(filtered);
Обновление через setData() пересоздаёт слой без
необходимости полной переинициализации карты.
При работе с большими массивами данных возникают проблемы производительности, связанные с количеством DOM-объектов и вычислением геометрии.
Основные стратегии оптимизации:
H.clustering.ProviderПример кластеризации:
const provider = new H.clustering.Provider(dataPoints, {
clusteringOptions: {
eps: 32,
minWeight: 2
}
});
const layer = new H.map.layer.ObjectLayer(provider);
map.addLayer(layer);
GeoJSON строго требует порядок координат
[longitude, latitude], однако внешние источники часто
нарушают это правило. Перед загрузкой данных необходимо выполнять
нормализацию:
function normalizeFeature(feature) {
if (feature.geometry.type === 'Point') {
const [lng, lat] = feature.geometry.coordinates;
feature.geometry.coordinates = [lng, lat];
}
return feature;
}
Ошибки в порядке координат приводят к смещению объектов на тысячи километров.
Мультигеометрические объекты требуют особого подхода при стилизации и обработке событий. Например, MultiPolygon может содержать несколько независимых областей:
{
"type": "Feature",
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[[[13.4, 52.5], [13.5, 52.5], [13.5, 52.6], [13.4, 52.5]]],
[[[13.6, 52.5], [13.7, 52.5], [13.7, 52.6], [13.6, 52.5]]]
]
}
}
В HERE Maps API такие объекты интерпретируются как единый feature, но каждая под-геометрия может участвовать в отдельных вычислениях площади или пересечений.
GeoJSON-данные можно комбинировать с кастомными слоями для расширения функциональности. Это позволяет накладывать аналитические данные поверх базовой карты.
const customLayer = new H.map.layer.ObjectLayer(
new H.map.Group()
);
map.addLayer(customLayer);
Далее GeoJSON может использоваться как источник данных для генерации объектов внутри слоя, включая динамическое обновление на основе API-запросов.
При высоких нагрузках GeoJSON часто предварительно обрабатывается на сервере:
Такой подход уменьшает нагрузку на клиентскую часть и ускоряет рендеринг в браузере.
Каждый Feature может содержать произвольные свойства, которые используются для логики отображения:
feature.properties = {
id: 101,
status: 'active',
priority: 5,
label: 'Node A'
};
Эти данные могут применяться для:
map.addEventListener('pointerenter', (evt) => {
const feature = evt.target.getData();
if (feature.properties.status === 'active') {
evt.target.setStyle({ strokeColor: '#00ff00' });
}
});
Клиентская часть HERE Maps API не предназначена для сложных геопространственных вычислений. При необходимости:
используются серверные библиотеки (например, Turf.js или PostGIS), а в браузер передаётся уже подготовленный GeoJSON.
При частом обновлении данных важно управлять памятью:
map.removeLayer(reader.getLayer());
reader.dispose();
Игнорирование удаления слоёв приводит к накоплению объектов и деградации производительности.
Типичные ошибки:
Обработка выполняется через валидацию перед загрузкой:
if (!geojson || geojson.type !== 'FeatureCollection') {
throw new Error('Invalid GeoJSON structure');
}