Как настроить параметры уменьшения с помощью кластеров Mapbox? - PullRequest
0 голосов
/ 23 мая 2018

Я использую кластеры POC с Mabpox-gl-js v0.45.

Я хотел бы настроить свойства моего кластера (фактические значения по умолчанию: point_count и point_count_abbreviated).Каждая из моих точек (по одной на каждый город) имеет свойство поверхности (целое число), которое я хочу суммировать при кластеризации точек.

Я вижу в источниках mapbox ссылку на уменьшениефункция для вычисления пользовательских свойств:

SuperCluster.prototype = {
    options: {
        minZoom: 0,   // min zoom to generate clusters on
        // .....
        log: false,   // whether to log timing info

        // a reduce function for calculating custom cluster properties
        reduce: null, // function (accumulated, props) { accumulated.sum += props.sum; }

        // initial properties of a cluster (before running the reducer)
        initial: function () { return {}; }, // function () { return {sum: 0}; },

        // properties to use for individual points when running the reducer
        map: function (props) { return props; } // function (props) { return {sum: props.my_value}; },
    },

Но я не вижу упоминаний об этом в документации. Как я могу установить эти параметры?

Кажется, Mapbox не публикует эти интерфейсы ( см. Документацию кластера ), и не упоминаются при условии :

map.addSource("earthquakes", {
    type: "geojson",
    // Point to GeoJSON data. This example visualizes all M1.0+ earthquakes
    // from 12/22/15 to 1/21/16 as logged by USGS' Earthquake hazards program.
    data: "/mapbox-gl-js/assets/earthquakes.geojson",
    cluster: true,
    clusterMaxZoom: 14, // Max zoom to cluster points on
    clusterRadius: 50 // Radius of each cluster when clustering points (defaults to 50)
});

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Кто-то дал мне обходной путь: не используйте встроенный supecluster, но создайте свой собственный и используйте его в качестве источника:

var myCluster = supercluster({
    radius: 40,
    maxZoom: 16,
    reduce: function(p) { /* I can use reduce/map/... functions! */ }
});

// My clustered source is created without Mapbox's clusters since I managed my clusters outside Mapbox library.
map.addSource("earthquakes", {
    type: "geojson",
    data : {
      "type" : "FeatureCollection",
      "features" : []
    }
});

function loadRemoteGeoJson() {
    var features
    // Do what you want, when you want to retrieve remote features...
    // ...
    // In the end set features into your supercluster
    myCluster.load(features)
    pushClusterIntoMapbox(map)
}

// Function to call when you load remote data AND when you zoom in or out !
function pushClusterIntoMapbox(map) {
  // I maybe should be bounded here...
  var clusters = myCluster.getClusters([ -180.0000, -90.0000, 180.0000, 90.0000 ], Math
      .floor(map.getZoom()))

  // My colleague advice me to use http://turfjs.org as helper but I think it's quite optionnal
  var features = turf.featureCollection(clusters)
  map.getSource("earthquakes").setData(features)
}
0 голосов
/ 30 мая 2018

Похоже, что это работает как обычное снижение.Он будет вызываться по одному для каждой точки и позволит вам использовать свойства точки для создания общих свойств кластера.

Так что если вы определите свое уменьшение следующим образом:

supercluster({
  reduce: (clusterProps, pointProps) => {
    clusterProps.sum += pointProps.surface;
  }
});

Тогда свойство sum в кластере будет суммой всех surface свойств в точках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...