查看原文
其他

可视化 | 使用geopandas可视化地图数据

大邓 大邓和他的Python
2024-09-09

本文代码

https://textdata.cn/blog/2023-08-31-data-visualization-how-to-plot-a-map-with-geopandas/

Pandas 可能是最流行的用于数据分析的 Python 库。GeoPandas 扩展了 Pandas 的数据类型,使我们能够更轻松地在 Python 中处理地理空间数据。它目前有两种数据类型结构:GeoSeries 和 GeoDataFrame,它们分别是 pandas.Series 和 pandas.DataFrame 的子类。

GeoDataFrameGeoPandas 中的核心数据结构,可以存储几何列并执行空间操作。GeoSeries 数据结构可以包含任何几何类型,例如点、线、多边形等。

总体上,GeoDataFrame 是 pandas.Series 和 geopandas.GeoSeries 的组合。

为了按照本文中的方法进行操作,您需要从 ArcGIS Hub 下载一个世界国家的 Shapefile (https://hub.arcgis.com/datasets/esri::world-countries-generalized/)。如果您已经有自己的 Shapefile 数据,也可以使用您自己的数据。



一、安装GeoPandas

GeoPandas库是纯 Python 编写的,但是它的一些依赖库是用 C 编写的,比如 GEOS、GDAL、PROJ。有时在 Windows 上安装这些 C 库并不容易。

!pip3 install pyogrio
!pip3 install pyproj
!pip3 install rtree
!pip3 install shapely
!pip3 install geopandas
import geopandas as gpd
import warnings
warnings.filterwarnings('ignore')

print('Geopandas版本号: ', gpd.__version__)
Geopandas版本号: 0.13.2



二、读写数据

2.1 读入数据

geopandas库支持多种数据格式

  • shp
  • geojson
import os

os.listdir('data')
['.DS_Store',
'World_Countries_Generalized',
'World_Countries_Generalized.geojson',
'world-population.geo.json']

2.1.1 shp

import geopandas as gpd

#shp必须与shx同处于一个文件夹内
gdf = gpd.read_file('data/World_Countries_Generalized/World_Countries_Generalized.shp')
gdf.head()


2.1.2 geojson

GeoJson是Json文件,所以该类数据文件尾缀名一般为.geojson 或  .json

import geopandas as gpd

gdf2 = gpd.read_file('data/world-population.geo.json')
gdf2.head()



2.2 保存数据

我们可以使用 GeoDataFrame.to_file() 将切片或修改后的 GeoDataFrame 写回文件。

  • gdf.to_file('shp文件路径')
  • gdf.to_file('GeoJson文件路径', driver='GeoJSON')

默认的文件格式是 Shapefile,但我们可以使用 driver 关键字指定其他格式。例如,让我们将 DataFrame 保存为 GeoJSON 格式。

gdf2.to_file('output/World_Countries_Generalized.shp')
gdf2.to_file('output/World_Countries_Generalized.geojson', driver='GeoJSON')



三、GeoDataFrame数据类型

让我们以 gdf GeoDataFrame 为例。大多数用于 pandas 的方法在 GeoPandas 中仍然适用。在本节中,我们只会看到一些示例。

#数据形状
gdf2.shape
(211, 10)

211行,8列,最后一列是多边形几何数据


3.1 坐标参考系统(CRS)

通常我们使用一个二维坐标系统,其中经度(垂直的南北线)和纬度(东西方向的水平线)用于标识地球表面上的位置。

GeoDataFrame 包含了将几何列中定义的多边形映射到地球表面的CRS信息。要检查CRS,我们使用 .crs 方法。

gdf2.crs
<Geographic 2D CRS: EPSG:4326>
Name: WGS 84
Axis Info [ellipsoidal]:
- Lat[north]: Geodetic latitude (degree)
- Lon[east]: Geodetic longitude (degree)
Area of Use:
- name: World.
- bounds: (-180.0, -90.0, 180.0, 90.0)
Datum: World Geodetic System 1984 ensemble
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich

3.2 筛选

筛选出中国的数据

gdf2[gdf2['NAME']=='China']


3.2 中心

每个记录所代码实体(国家、省州、城市)的地理中心

gdf2.centroid
0 POINT (66.02695 33.83959)
1 POINT (20.06466 41.14350)
2 POINT (2.63167 28.16258)
3 POINT (1.58730 42.54147)
4 POINT (17.54495 -12.29359)
...
206 POINT (47.59134 15.77731)
207 POINT (20.80471 44.02662)
208 POINT (23.65690 -2.87535)
209 POINT (27.79925 -13.45302)
210 POINT (29.87045 -19.00312)
Length: 211, dtype: geometry

3.3 投影

几何数据(多边形)转换到 EPSG 3857 坐标参考系统,并计算每个多边形的中心点(centroid)。EPSG 3857 通常被称为 「Web Mercator 投影」,用于在 Web 地图上呈现地理数据。转换为此坐标参考系统可以用于生成更适合在 Web 地图上显示的数据。

根据代码运行提示, 更改代码。

gdf2.to_crs(3857).centroid
0 POINT (7354486.896 4017736.603)
1 POINT (2233478.912 5035365.825)
2 POINT (292615.786 3302567.699)
3 POINT (176697.417 5242446.985)
4 POINT (1953402.929 -1385745.990)
...
206 POINT (5299033.934 1780605.357)
207 POINT (2315093.566 5473720.440)
208 POINT (2633886.156 -323258.251)
209 POINT (3092719.338 -1515282.005)
210 POINT (3325201.834 -2158042.585)
Length: 211, dtype: geometry

3.4 计算区域面积

数据已经包含了一个 SHAPE_Area 列。假设没有这样的列,我们可以通过几何数据来计算面积。为了获得正确的面积,您必须使用等面积投影。适用于您的代码的投影是 EPSG 6933。它是柱面等面积投影。

gdf2.to_crs(6933).area
0 6.419639e+11
1 2.875576e+10
2 2.318240e+12
3 4.702513e+08
4 1.247851e+12
...
206 3.990873e+11
207 8.856234e+10
208 2.325712e+12
209 7.521495e+11
210 3.892279e+11
Length: 211, dtype: float64



四、可视化

因为geopandas绘图功能是在matplotlib的基础上实现的,gdf.plot()一行代码就能绘图

4.1 最简地图

gdf2.plot()


4.2 更改颜色

图的颜色和边界的颜色的更改

gdf2.plot(color='green', edgecolor='white')


4.3 colormap

使用matplotlib的colormaps配色

gdf2.plot(cmap='jet', linewidth=0.2, edgecolor='gray', column='NAME', figsize=(105))

output_30_1.png)


4.4 Legend Colorbar

图例配色

import matplotlib.pyplot as plt

gdf2['POP2005']=gdf2['POP2005'].astype(float)

gdf2.plot(cmap='hot',linewidth=0.2, edgecolor='gray',column='POP2005',legend=True,figsize=(105))
plt.title('World Population')
plt.show()


4.5 局部

使用gdf2除了可以绘制全世界地图,还可以绘制局部地图,如中国地图(含中国台湾)

gdf2[gdf2['NAME']=='China']


china_mainland = gdf2[gdf2['NAME'] =='China']
china_taiwan = gdf2[gdf2['NAME'] =='Taiwan']

fig, ax = plt.subplots(figsize=(105))

china_mainland.plot(ax=ax) 
china_taiwan.plot(ax=ax)

plt.title('Map of China')


精选内容

96G数据集 | 2亿条中国大陆企业工商注册信息

70G数据集 | 3571万条专利申请数据集(1985-2022年)

数据集 | 2006年-2022年企业社会责任报告

93G数据集 | 中国裁判文书网(2010~2021)

数据集 | 2001-2022年A股上市公司年报&管理层讨论与分析

数据集 | 3.9G全国POI地点兴趣点数据集

数据集 | 2014年-2022年监管问询函

CAR2023 | 文本分析在会计中的应用

管理世界 | 使用文本分析词构建并测量 短视主义

管理世界 | 使用 经营讨论与分析 测量 企业数字化指标

管理世界 | 用正则表达式、文本向量化、线性回归算法从md&a数据中计算 「企业融资约束指标

管理世界 | 政府与市场心理因素的经济影响及其测度

文本分析 | 中国企业高管团队创新注意力(含代码)

金融研究 | 使用Python构建「关键审计事项信息含量」

PNAS | 14000+篇心理学顶刊论文可复现性调研(含代码)

网络爬虫 | 使用Python采集B站弹幕和评论数据

网络爬虫 | 使用Python披露采集 Up 主视频详情信息

可视化 | 绘制《三体》人物关系网络图

可视化 | 99-21年地方政府报告关键词变化趋势

可视化 | Netflix 数据可视化最佳实践

使用 Word2Vec 和 TF-IDF 计算五类企业文化

采购合同数据集 | 政府采购何以牵动企业创新

实验数据 | 194城市楼市政策梳理(2010-2022)

数据集 | 07-21年上市公司「委托贷款公告」

单个csv文件体积大于电脑内存,怎么办?

高管数据 | 使用pandas对xlsx中的简介字段做文本分析



继续滑动看下一个
大邓和他的Python
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存