Datashader:GeoDataFrames 的分类颜色映射

如何解决Datashader:GeoDataFrames 的分类颜色映射

已安装的软件包

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

我想做什么

我正在尝试使用 Datashader 按照管道页面中的 this 示例和 this 以及 {{3} } 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)

预期行为

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

观察到的行为

完整的数据集导致图像几乎为白色,有些轮廓非常模糊。

this

如果我改变背景颜色,一些多边形会更加突出,即使标题也只是依稀可见。

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

enter image description here

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

顺便说一句,如果我删除“类别”列(否则会导致“输入必须为数字”错误)并将 GeoViews 与 Holoviews rasterize 结合使用,我可以使用 one 颜色没有问题,但我还没有想出如何使用这种方法在同一个散景/或 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 丢弃有关重叠的信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?