Mapbox JS - назначение цветов Tileset - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь создать цветную карту областей Великобритании - мне нужно, чтобы цвета управлялись локальными данными (например, продажи по почтовому индексу), которые всегда будут меняться в зависимости от выбора пользователя, например, диапазонов дат отчета и т. Д. У меня естьИсточник набора листов, который я назначаю слою, как показано ниже (чувствительные значения не отображаются):

         this.map.addLayer({
            "id": "uk-pc-data",
            "type": "fill",
            "source-layer": "***",
            "source": {
                type: 'vector',
                url: '***'
            }
        });

Затем я могу стилизовать области почтовых индексов в наборе плиток, обратившись к свойству имени в наборе плиток.особенности, такие как:

           "paint": {
                "fill-color": [
                    "match",
                    ["get", "name", [{name: "PR"}, {name: "CH"}, {name: "LN"}]],
                    [
                        "PR",
                        "DD",
                        "AL",
                        "PO"
                    ],
                    "hsla(344, 84%, 29%, 0.37)",
                    "hsla(131, 94%, 34%, 0)"
                ]
            }

Выше назначит один цвет для совпавших областей, и по умолчанию для всех других (не совпавших);Что я хотел бы сделать, так это вычислить значение цвета локально (основываясь на постоянно изменяющихся данных) на основе имени элемента, например

            "paint": {
                "fill-color": function (feature = {}) {
                    return localSalesByArea(feature.name)
                }
            }

Это, однако, представляется невозможным: любая помощь илиуказатели оценены;Я просматривал примеры из Mapbox, такие как choroplet, heatmaps, выражения, но, похоже, они основаны на значениях, передаваемых через сам набор данных (т. Е. Заполнение), в моем случае значения, определяющие цветовую шкалу, разделены (они поступают из внутренней отчетностиAPI)

1 Ответ

0 голосов
/ 24 декабря 2018

Если данные, по которым определяются цвета, не существуют в наборе плиток, вам, в основном, нужно выполнить гигантский поиск по имени.

У вас будет функция, которая генерирует выражение fill-color, что-токак:

function makeFillExpression(valuesByName) {
    function valueToColor(value) {
        return /* insert your choroplething special sauce here */;
    }
    return ret = [
        "match",
        ["get", "name"],
        Object.keys(valuesByName).map(name => valueToColor(valuesByName[name])),
        'black'
    ];
}

Да, это будет очень большое и громоздкое выражение.

...