已安装的软件包
数据着色器 0.13.0,holoviews 1.14.4,geoviews 1.9.1.,散景 2.3.2。
我正在尝试做的事情
我正在尝试使用 Datashader 重新创建一个等值线图,其中一种颜色映射到大型 GeoDataFrame 中的一个类别,遵循管道页面中的这个示例以及这个以及这个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 笔记本所提到的,“根据每个类别对该像素的贡献,每个像素的透明度和颜色”?但是由于每个类别都是每个像素的唯一贡献者(即在这种情况下与其他类别没有空间重叠),为什么 alpha 似乎设置得如此之低以至于看不到任何东西?我还尝试了agg=ds.by('category')
具有相同结果的聚合器。
顺便说一句,如果我删除“类别”列(否则会导致“输入必须是数字”错误)并将 GeoViews 与 HoloViews 结合使用,rasterize
我可以毫无问题地使用一种颜色来可视化多边形,但我还没有弄清楚如何使用这种方法在同一个 Bokeh/或 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'])