1

最初,我创建了一个英国邮政编码区域的交互式地图,其中单个区域根据其值(例如该邮政编码区域中的人口)进行颜色表示,如下所示。

from bokeh.plotting import figure
from bokeh.palettes import Viridis256 as palette
from bokeh.models import LinearColorMapper
from bokeh.models import ColumnDataSource
import geopandas as gpd

shp = 'file_path_to_the_downloaded_shapefile'
#read shape file into dataframe using geopandas
df = gpd.read_file(shp)

def expandMultiPolygons(row, geometry):
    if row[geometry].type = 'MultiPolygon':
       row[geometry] = [p for p in row[geometry]]
    return row
#Some rows were in MultiPolygons instead of Polygons.
#Expand MultiPolygons to multi rows of Polygons
df = df.apply(expandMultiPolygons, geometry='geometry', axis=1)
df = df.set_index('Area')['geometry'].apply(pd.Series).stack().reset_index()

#Visualize the polygons. To visualize different colors for different post areas, I added another column called 'value' which has some random integer value. 

p = figure()
color_mapper = LinearColorMapper(palette=palette)
source = ColumnDataSource(df)
p.patches('x', 'y', source=source,\
            fill_color={'field': 'value', 'transform': color_mapper},\
            fill_alpha=1.0, line_color="black", line_width=0.05)

其中 df 是四列的数据框:邮政编码区域、x 坐标、y 坐标、值(即人口)。

上面的代码在网络浏览器上创建了一个交互式地图,这很棒,但我注意到交互的速度不是很流畅。如果我放大或移动地图,它会缓慢渲染。数据框的大小只有 1106 行,所以我很困惑为什么它这么慢。

作为可能的解决方案之一,我遇到了 datashader ( https://datashader.readthedocs.io/en/latest/ ),但我发现示例脚本非常复杂,其中大多数都带有 Jupyter notebook 上的 holoview 包,但我想要使用散景创建仪表板。

有人建议我将数据着色器合并到上述散景脚本中吗?我是否需要在 datashader 中使用不同的函数来创建形状图而不是使用散景的补丁函数?

任何建议将不胜感激!!!

4

3 回答 3

6

如果不涉及数据文件,我无法直接回答您的问题,但可以提供一些意见:

  1. Datashader 不太可能用于此目的,因为 datashader 目前不支持渲染多边形。根据经验,Datashader 旨在聚合您的数据,如果它已经聚合,Datashader 通常不会有帮助。在这里,您的数据按邮政编码汇总,datashader 无法处理,但如果您拥有每个人的原始数据,它会很乐意呈现它。
  2. 如果您更喜欢直接使用 Bokeh 而不是通过更高级别的 HoloViews/GeoViews 界面,我建议您遵循 Matt Rocklin 关于加速 geopandas的工作;对于您的目的,他的方法应该非常快。
  3. 综上所述,HoloViewsGeoViews 通常应该是使用 Bokeh 的便捷方式,无论您是否要创建仪表板。例如,2017 JupyterCon 教程展示了如何使用这两个库制作简单的 Bokeh 仪表板。它不涵盖形状文件,但其他 GeoViews 示例中涵盖了这些文件。
于 2017-09-26T14:49:40.430 回答
1

正如我在评论中提到的,我相信你的多边形的复杂性可能会导致你的问题。您链接到的文件包含几个不同大小和复杂性的 shapefile。您可以简化这些,即减少每个多边形的点数。这可以改变它们的外观。它的范围可以从几乎没有差异到更多“前卫”到有棱角的外观。这取决于您选择的简化级别。根据您的需要,您可以选择不同级别的简单性。

我知道完成这项工作的三个简单选项:

  1. 图形用户界面:尝试QGis。它是用于地理空间数据处理的出色开源工具。将您的 Shapefile 加载为新图层。然后使用“矢量”菜单下的“简化几何”工具。
  2. 命令行:GDAL是一个开源库。它带有一个有用的命令行工具。你可以像这样使用它:ogr2ogr outfile.shp infile.shp -simplify 0.000001
  3. 在线:访问mapshader。导入您的文件。选择简化并选择您的级别。然后,导出结果。我在这里真正喜欢的是您的文件会立即呈现。因此,您可以立即看到简化的结果。

除此之外,您还应该更新散景版本。它会定期更新,并且从那以后有一些性能改进。

使用 HoloViews 或 GeoViews 不会对您的表现产生积极影响。因此,它与您的问题无关。我猜@James A. Bednar 只是在那里给出了一些建议。

于 2017-09-27T20:40:55.043 回答
0

我找到了一种在移动滑块时加快英国地图交互式可视化的方法。

我首先为滑块的不同值创建了单个图像(2D),并使用 2D 图像而不是使用散景的补丁功能更新了地图。

由于图像是数组格式,因此在更改滑块中的值的同时更新图像要快得多。这种方法的一个缺点是我不能再在英国地图上使用悬停功能。

我参考了以下网址将多边形信息转换为数组:https ://gist.github.com/brendancol/db030013e981c46acb2886060dde607e#file-rasterio_datashader_polygons-py-L35

于 2017-09-29T08:58:55.103 回答