#mapbox #mapbox-gl-js
#mapbox #mapbox-gl-js
Вопрос:
Итак, в настоящее время я группирую сетку точек на своей карте с помощью приведенного здесь примера Mapbox: Создание и оформление кластеров
Пример кода из Mapbox подсчитывает количество точек и отображает его следующим образом — используя переменную point_count_abbreviated
:
map.addLayer({
id: "cluster-count",
...
layout: {
"text-field": "{point_count_abbreviated}",
},
...
})
Мой источник GeoJSON выглядит примерно так:
{
"type": "Feature",
"geometry": { ... },
"properties": {
"location": { ... },
"id": 111,
...
"value": {
"count": 2
}
}
}
То, что я пытаюсь сделать, это сложить все «свойства.значение.количество»,
и отобразите сумму по каждому кластеру.
Я попробовал примеры из документации о clusterProperties
но поскольку моя переменная count вложена внутри объекта value,
Мне трудно заставить его работать.
Итак, я предполагаю, что что-то вроде этого в определении источника кластера:
clusterProperties: {"sum": [" ", ["object", "value", ['get, 'count']]]}
И отобразите его в слое:
layout: {
"text-field": ['get', 'sum'],
},
Не мог бы кто-нибудь, пожалуйста, указать мне правильное направление? 🙂
Ответ №1:
Мне удалось заставить это сработать. Логика выглядит следующим образом: получить переменную count внутри value-object внутри properties-object. Объект свойств — это зарезервированное выражение, описанное здесь.
В определении источника:
clusterProperties: {
sum: [" ", ["get", "count", ["get", "value", ["properties"]]]],
},
В слое, который отображает сумму:
"text-field": ["get", "sum"],
Ответ №2:
Спасибо, что поделились этим методом. Я хочу добавить одну деталь для тех, кто работает с преобразованными данными (CSV в GeoJSON). Я потратил часы, чтобы найти решение для преобразования числового поля в целые числа. Все данные были преобразованы в строку, и на официальной веб-странице csv2geojson нет информации о том, как ее преобразовать. Наконец, я добавил опцию -> numericFields: ‘customers’, и у меня это сработало.
function makeGeoJSON(csvData) {
csv2geojson.csv2geojson(csvData, {
latfield: 'Latitude',
lonfield: 'Longitude',
delimiter: ',',
numericFields: 'customers',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50,
}, function (err, data) {
map.on('load', function () {
map.addSource('geopoints', {
type: 'geojson',
data: data,
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50,
clusterProperties: {
sum: [" ", ["get", "customers", ["properties"]]],
},
});