Datashader:GeoDataFrames 的分类颜色映射

Datashader: categorical colormapping of GeoDataFrames

已安装的软件包

数据着色器 0.13.0,全息视图 1.14.4,地理视图 1.9.1,散景 2.3.2。

我想做什么

我正在尝试使用 Datashader 重新创建一个等值线图,其中一种颜色映射到大型 GeoDataFrame 中的一个类别,遵循 this example in the Pipeline page and as well as SO,它们的语法略有不同,并且都使用点作为例如,而不是多边形。

可重现的代码示例

下面是完整数据集的一小部分样本。

import pandas as pd
import geopandas as gpd
from spatialpandas import GeoDataFrame
import datashader as ds
import datashader.transfer_functions as tf


d = {'geometry': {0: 'POLYGON ((13.80961103741604 51.04076975651729, 13.80965521888065 51.04079016168103, 13.80963851766593 51.04080454197601, 13.80959433642561 51.04078412781548, 13.80961103741604 51.04076975651729))',
  1729: 'POLYGON ((13.80839606906416 51.03845025070634, 13.80827635138927 51.03836030644977, 13.80840483855695 51.03829244374037, 13.80852462026795 51.03838211873356, 13.80839606906416 51.03845025070634))',
  2646: 'POLYGON ((13.80894179055831 51.04544128170094, 13.80952887156242 51.0450399782091, 13.80954152432486 51.04504668985658, 13.80896834397535 51.04545611172818, 13.80894179055831 51.04544128170094))'},
 'category': {0: 'Within_500m', 1729: 'Outside_500m', 2646: 'River/stream'}}

gdf = gpd.GeoDataFrame(pd.DataFrame(d), geometry=gpd.GeoSeries.from_wkt(pd.DataFrame(d)['geometry']), crs="EPSG:4326")

gdf['category'] = gdf['category'].astype('category')

spatialpdGDF = GeoDataFrame(gdf)

color_key = {'Within_500m': 'red', 'Outside_500m': 'lightgrey', 'River/stream': 'lightblue'}
canvas = ds.Canvas(plot_width=1000, plot_height=1000)
agg = canvas.polygons(spatialpdGDF, 'geometry', agg=ds.count_cat('category'))
tf.shade(agg, color_key=color_key)

预期行为

我希望所有多边形都被栅格化并针对每个类别以单一颜色显示。

观察到的行为

完整数据集生成的图像几乎是白色的,一些轮廓非常隐约可见。

如果我改变背景颜色,一些多边形会更加突出,尽管标题也只是隐约可见。

tf.Images(tf.set_background(tf.shade(agg, color_key=color_key, name="Custom color key"), "black"))

这是否与 Datashader 计算有关,正如 Pipeline notebook 提到的那样,“根据每个类别对该像素的贡献来计算每个像素的透明度和颜色”?但是由于每个类别都是每个像素的唯一贡献者(即在这种情况下与其他类别没有空间重叠),为什么 alpha 似乎设置得如此之低以至于看不到任何东西?我还尝试了 agg=ds.by('category') 聚合器,结果相同。

顺便说一句,如果我删除 'category' 列(否则会导致“输入必须是数字”错误)并结合使用 GeoViews 和 HoloViews rasterize 我可以使用 一个颜色没有问题,但我还没有弄清楚如何使用这种方法在同一个Bokeh/or mpl图上绘制具有不同颜色映射的多个数据阴影GDF(通常的HoloViews“覆盖乘法”在这种情况下不起作用)。

import geoviews as gv
from holoviews.operation.datashader import rasterize

gv.extension('bokeh')

del gdf['category']

rasterize(gv.Polygons(gdf)).opts(cmap=['red'])

尝试agg=ds.by('category', ds.any()),这将忽略在任何像素中重叠的多边形。 ds.count_cat('category') 现在是 ds.by('category', ds.count()) 的别名,但从 Datashader 0.12.1 开始,您不再局限于 count,例如使用 any 丢弃有关重叠的信息。