如何在 MapboxGL 中有效地更新 GeoJson 多边形的填充?

How can you efficiently update the fill of GeoJson polygons in MapboxGL?

我正在构建一个应用程序,该应用程序将使用大型 GeoJSON 集(大约 3MB)渲染地图。该地图是一个等值线,不同的 GeoJSON 多边形根据它们“包含”的数据进行不同的着色。

我 运行 遇到的问题是我不确定如何将 GeoJSON(例如多边形数据)与实际数据分开。假设我们像这样设置数据(或按照 Mapbox 的建议,仅通过 URL 到数据源):

const { data } = await axios.post(sourceUrl, settings);
map.current.addSource("states", {
  type: "geojson",
  data,
}

此地图中的基础数据需要随着用户交互而频繁更新。但是,现在 GeoJSON 包含多边形数据(坐标)和属性(数据本身)。

例如,用户可能会单击一个复选框,或输入一个搜索参数。这当前对我们的数据库进行了 GET,该数据库运行查询并 returns 新数据。我们 可以 return 一个新的 GeoJSON 对象,其中添加了这些数据,然后调用 .getSource("source").setData(newData) 将所有新的 GeoJSON,但这会非常低效。多边形没有变化,只有它们包含的数据在变化。

我研究过数据驱动的样式,但这似乎也不是我需要的。我们的地图基础数据集太大,无法塞入单个 GeoJSON 层,我们无法通过网络传输数百 MB 以在客户端应用数据驱动的样式。

我们如何才能将 GeoJSON 多边形渲染到地图一次,然后根据不同数据集的更改方式更新它们的填充颜色?

简短的回答是,使用特征状态。 This tutorial 解释了所有细节。您可以使用相同的方法用数据更新数千个要素,而无需更新任何几何图形。