最初,我创建了一个英国邮政编码区域的交互式地图,其中单个区域根据其值(例如,该邮政编码区域中的人口)进行颜色表示,如下所示。
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坐标,值(即人口)。
上面的代码在Web浏览器上创建了一个很好的交互式地图,但是我注意到交互性在速度上并不是很平滑。如果我放大或移动地图,它会慢慢渲染。数据帧的大小只有1106行,所以我很困惑为什么它这么慢。
作为可能的解决方案之一,我遇到了数据共享器(https://datashader.readthedocs.io/en/latest/),但我发现示例脚本非常复杂,其中大多数都是在Jupyter笔记本上使用holoview包但我想创建一个仪表板使用背景虚化。
有没有人建议我将数据分析器合并到上面的散景脚本中?我是否需要在数据分析器中使用不同的功能来创建形状贴图而不是使用散景贴片功能?
任何建议都将受到高度赞赏!!!
答案 0 :(得分:5)
如果没有涉及数据文件,我无法直接回答您的问题,但可以提供一些观察结果:
答案 1 :(得分:0)
正如我的评论中提到的,我相信您的多边形的复杂性可能会导致您的问题。您链接的文件包含几个不同大小和复杂程度的shapefile。您可以简化这些,即减少每个多边形的点数。这可以改变它们的外观。它可以从几乎没有区别,更多的“边缘”到角度外观。这取决于您选择的简化程度。根据您的需要,您可以选择不同级别的简单性。
我知道有三个简单的方法可以完成这项工作:
ogr2ogr outfile.shp infile.shp -simplify 0.000001
除此之外,您还应该更新散景版本。它定期更新,自那以后有一些性能改进。
使用HoloViews或GeoViews不会对您的表现产生积极影响。因此,它与您的问题无关。我猜@James A. Bednar只是在那里提出一些建议。
答案 2 :(得分:0)
当我移动滑块时,我找到了加快英国地图交互式可视化的方法。
我首先为不同的滑块值创建了单独的图像(2D),并使用2D图像而不是使用散景补丁功能更新了地图。
由于图像采用数组格式,因此在更改滑块中的值时更新图像要快得多。这种方法的一个缺点是我不能再在英国地图上使用悬停功能。
我引用了以下url将多边形信息转换为数组:https://gist.github.com/brendancol/db030013e981c46acb2886060dde607e#file-rasterio_datashader_polygons-py-L35