【问题标题】:Mapbox GL JS: Coloring individual features in large GeoJSONMapbox GL JS:为大型 GeoJSON 中的单个特征着色
【发布时间】:2020-12-22 02:31:33
【问题描述】:

我在 Mapbox 中有一张州地图,每个选区都是一个单独的特征。我想根据政党投票之间的差异来改变每个选区的颜色。 Here's an example of what I'm trying to achievewhat I have right now

我尝试使用 map.setPaintProperty,但是设置一个功能会强制您更改与 ID 不匹配的所有其他功能。

map.setPaintProperty("wisconsin", "fill-color", 
    ["match",["get", "id"],
       features[i].properties["OBJECTID"],
       color, "#ffffff"
    ]
);

我该怎么做?或者有其他方法吗?

【问题讨论】:

    标签: javascript geojson mapbox-gl-js


    【解决方案1】:

    所以,您想做数据驱动的样式。基本上有三种方法。

    表达式映射属性到颜色

    如果您要可视化的属性在数据中(即,每个特征都有一个.population 属性),您可以使用如下表达式:

    'fill-color': ['interpolate-hcl', ['linear'], ['get', 'population'], 0, 'red', 1e6, 'blue']
    

    https://docs.mapbox.com/help/glossary/data-driven-styling/

    将每个 ID 映射到特定颜色的表达式

    如果您的属性不包含在您的数据源中,您可以通过编程方式生成一个巨大的表达式,如下所示:

    'fill-color': ['match', ['get', 'id'],
      1020, 'red',
      1033, 'green',
      1038, 'red',
      1049, 'white',
      // ...
    

    在运行时使用 feature-state 添加属性

    最后,您可以通过调用setFeatureState 在运行时实际添加您想要的属性,从而获得比前一种情况更好的渲染性能,尽管有一些额外的复杂性。

    你的风格是这样的:

    'fill-color': ['interpolate-hcl', ['linear'], ['feature-state', 'population'], 0, 'red', 1e6, 'blue']
    

    然后您遍历视口中的每个功能以实际添加该属性:

    for (const district of districts) {
      map.setFeatureState({ source: 'mysource', sourceLayer: 'mysourcelayer', id: district.id }, { population: district.population});
    }
    

    https://docs.mapbox.com/mapbox-gl-js/api/map/#map#setfeaturestate

    【讨论】:

    • 好的,我已经实现了我想要的,但是有些区域太小以至于无法渲染,therefore not getting the styling needed
    • 顺便说一句,如果您接受带有复选标记的答案,将会很有帮助。这意味着我可以将其用作其他类似问题的重复目标。
    • 我经历过并做到了。对于任何有类似问题但功能非常小的人,我只需将FeatureState设置为使用getRenderedFeatures新呈现的任何功能
    • 按照这里的第二个示例,我得到了一个错误Expected an even number of arguments.,我通过添加一个作为默认值的最终单个参数解决了这个问题。
    • 值得注意的是,特征状态的性能特征非常糟糕。渲染数据所花费的时间是大型数据集的许多倍(在我的测试中大约长了 2-4 倍)。并且地图的性能总体上会显着下降(不稳定的平移、跳跃的移动、缓慢的加载图块等)。如果性能是一个问题,我不会推荐它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多