Отображать накопленное свойство в кластере

#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"]]],
          },
        });