最后的结果是,整个全球数据都被成功绘制出来了:
文章插图
全球人口分布(作者本人的图片)
3.可视化和转换WorldPop数据【基于Python实现大规模光栅人口数据可视化】我想向大家展示的第二个数据来源是WorldPop人口数据库,它以不同的分辨率分别列出了各大洲和相应的国家 。在这个例子中,为了补充前面绘制的所有大陆和全球级别的数据情况,我在这一部分中主要集中在各国家和相应城市级别数据上 。例如,我选择了德国和2020年策划的100米的分辨率,并向您展示如何从整个国家中划出一个城市,并使用GeoPandas库将其转化为易于使用的向量格式 。
3.1.可视化WorldPop数据使用与前面相同的方法,我们可以再次快速可视化这一部分的光栅文件:
#分析数据data_file = 'deu_ppp_2020_constrAIned.tif'data_array = rioxarray.open_rasterio(data_file, chunks=True, lock=False)# 准备数据data_array = xr.DataArray(data_array)[0]data_array = data_array.where(data_array > 0)data_array = data_array.compute()data_array = np.flip(data_array, 0)# 取得图像尺寸size = 1200asp = data_array.shape[0] / data_array.shape[1]#创建数据着色器画布cvs = ds.Canvas(plot_width=size, plot_height=int(asp*size))raster = cvs.raster(data_array)# 绘制图像cmap = palette["fire"]img = tf.shade(raster, how="eq_hist", cmap=cmap)img = tf.set_background(img, "black")img
此代码片断将输出以下视觉效果:文章插图
德国的人口分布图(作者本人的图片)
3.2.转换WorldPop数据在可视化了整个地球、欧洲大陆和德国之后,我想更多地了解一下柏林市信息,并向您展示如何将这些光栅数据转换为向量格式 , 并使用GeoPandas轻松操作 。为此,我在这里以geojson格式访问柏林的行政边界 。
这个管理文件包含柏林的行政区,所以首先,我将它们合并为一个整体 。
from shapely.ops import cascaded_unionimport geopandas as gpdadmin = gpd.read_file('tufts-berlin-bezirke-boroughs01-geojson.json')admin = gpd.GeoDataFrame(cascaded_union(admin.geometry.to_list()), columns = ['geometry']).head(1)admin.plot()
此代码块输出以下所示的视觉效果:文章插图
柏林的行政边界图(作者本人的图片)
现在 , 将xarray转换为Pandas DataFrame,提取几何体信息 , 并构建GeoPandas GeoDataFrame 。一种方法是:
import pandas as pddf_berlin = pd.DataFrame(data_array.to_series(), columns = ['population']).dropna()
现在,在此基础上构建一个GeoDataFrame,重点关注柏林信息:from shapely.geometry import Point#找到限制边界框以便于坐标选择minx, miny, maxx, maxy = admin.bounds.T[0].to_list()points = []population = df_berlin.population.to_list()indicies = list(df_berlin.index)# 从落入该边界框的点创建点几何图形geodata = https://www.isolves.com/it/cxkf/yy/Python/2023-12-14/[]for ijk, (lon, lat) in enumerate(indicies): if minx <= lat <= maxx and miny <= lon <= maxy:geodata.Append({'geometry' : Point(lat, lon), 'population' : population[ijk]})# 构建一个GeoDataFramegdf_berlin = gpd.GeoDataFrame(geodata)gdf_berlin = gpd.overlay(gdf_berlin, admin)
然后,将人口可视化为向量数据:import matplotlib.pyplot as pltf, ax = plt.subplots(1,1,figsize=(15,15))admin.plot(ax=ax, color = 'k', edgecolor = 'orange', linewidth = 3)gdf_berlin.plot(column = 'population',cmap = 'inferno',ax=ax,alpha = 0.9,markersize = 0.25)ax.axis('off')f.patch.set_facecolor('black')
此部分代码块输出以下视觉效果:文章插图
柏林的人口分布图(作者本人的图片)
最后 , 我们得到了一个标准的GeoDataFrame,它具有100米分辨率的人口级别,分配给光栅文件中每个像素对应的每个点的几何体 。
总结在这篇文章中,我探索了两个全球人口数据集的可视化展示,它们通过结合各种近似、测量和建模方法,使用光栅网格以100米的显著空间分辨率实现估计人口水平 。这类信息对城市发展和位置智能的广泛应用非常有价值,如基础设施规划、选址、社区概况等 。从技术层面来看,我展示了三个空间层面的例子,涵盖了整个地球,然后放大到国家,最后是城市 。虽然该方法可以处理更小的分辨率,但这一切都发生在一台笔记本电脑上已经令人非常满意 。另外注意到 , 编程实现过程中我使用了几个强大的Python/ target=_blank class=infotextkey>Python开源库,如Xarray、DataShader和GeoPandas 。
推荐阅读
- 如何实现链式调用?
- Python UUID 完全指南
- Python神器解密:掌握property特性巧管理属性
- Python进阶指南,惰性求值,lambda表达式
- 构建更好的基于LLM的应用程序的四大秘诀
- 如何在Python中使用ChatGPT API处理实时数据
- Go语言实现GoF设计模式:适配器模式
- 编程语言大比拼:Python、Java、C、C++、Go 实现 'Hello World' 和九九乘法表"
- 你知道怎样在 Python 中管理内存吗
- 从MySQL看主从架构高可用性实现