GeoPandas是一个开源的Python库,专门用于处理和分析地理空间数据。它建立在Pandas库的基础上,扩展了Pandas的数据类型,使得用户能够在Python中方便地进行GIS操作。GeoPandas的核心数据结构是GeoDataFrame
,它是Pandas的DataFrame
的子类,可以存储几何列并执行空间操作。此外,GeoPandas还依赖于Shapely库来执行几何操作,依赖于pyogrio进行文件访问,以及依赖于matplotlib进行绘图。
以下是GeoPandas的一些主要特性:
- 读取和写入多种地理空间数据格式:如Shapefile、GeoJSON、PostGIS、KML等。
- 支持地理空间几何图形的创建、编辑和分析:包括点、线、面等。
- 提供空间连接、缓冲区分析、几何运算等地理空间操作。
- 具备数据可视化能力:可以绘制地理空间数据的地图。
一:数据读取
以下是各种地理空间数据格式的简单介绍及示例:
1:Shapefile
Shapefile 是一种常见的地理空间数据格式,由多个文件组成,包括主文件(.shp)、索引文件(.shx)、属性表文件(.dbf)等。
Shapefile 的主文件(.shp
文件)是一种二进制文件,用于存储地理要素的几何形状和属性信息。以下是关于 Shapefile 主文件的一些特点:
Shapefile 的主文件由固定长度的文件头和一系列可变长度的记录组成。
- 文件头:包含有关 Shapefile 的总体信息,如文件代码、版本号、文件长度、几何类型等。文件头的长度为 100 字节。
- 记录:每个记录代表一个地理要素,记录的长度取决于几何类型和属性信息的复杂性。记录由记录头和几何形状数据组成。
- 坐标系统信息:Shapefile 本身不包含坐标系统信息,但通常会与一个投影文件(
.prj
文件)一起使用,该文件描述了 Shapefile 中地理要素的坐标系统。总的来说,Shapefile 的主文件是一种复杂的二进制文件格式,用于存储地理要素的几何形状和属性信息。要正确读取和处理 Shapefile 文件,需要使用专门的地理信息系统软件或库,如
geopandas
。
数据读取操作:
import geopandas as gpdgdf = gpd.read_file('path_to_shapefile.shp')
以下是一个用geopandas
读取一个 Shapefile 文件后,GeoDataFrame
(gdf
)可能的输出样例:
import geopandas as gpd# 假设读取一个表示城市边界的 Shapefile 文件
gdf = gpd.read_file('cities.shp')print(gdf.head())
输出可能如下:
id name geometry
0 1 New York POLYGON ((-74.006011 40.7127281, -74.0059741...
1 2 London MULTIPOLYGON (((-0.127592 51.5073219, -0.127...
2 3 Paris POLYGON ((2.3477772 48.8588587, 2.3478284 48.8...
3 4 Tokyo MULTIPOLYGON (((139.741229 35.681199, 139.741...
4 5 Los Angeles MULTIPOLYGON (((-118.243683 34.0522342, -118...
在这个例子中,假设 Shapefile 文件有id
、name
两个属性字段和表示几何形状的geometry
列。geometry
列中的值可以是点、线、多边形等不同的几何对象,具体取决于数据的内容。例如,这里显示了一些城市的名称以及对应的多边形几何形状表示城市边界。
2:GeoJSON
GeoJSON 是一种基于 JSON 的开放标准格式,用于表示地理空间数据。示例如下:
{"type": "FeatureCollection","features": [{"type": "Feature","geometry": {"type": "Point","coordinates": [10, 20]},"properties": {"name": "Sample Point"}},{"type": "Feature","geometry": {"type": "Polygon","coordinates": [[[11, 21],[12, 22],[13, 21],[11, 21]]]},"properties": {"name": "Sample Polygon"}}]
}
数据读取操作:
import geopandas as gpdgdf = gpd.read_file('path_to_geojson.json')
3:PostGIS
PostGIS 是 PostgreSQL 数据库的一个空间扩展,它在数据库中存储和处理地理空间数据。
示例(在 PostgreSQL 数据库中的查询结果):
-- 查询一个表中的几何列和属性列
SELECT geom, name FROM my_table;
假设表中有一个点和一个多边形对象,结果可能如下:
geom | name |
---|---|
POINT(10 20) | Point Object |
POLYGON((11 21,12 22,13 21,11 21)) | Polygon Object |
首先安装必要的库:psycopg2
或sqlalchemy
(如果使用 SQLAlchemy 连接数据库),其中,username
、password
、host
、port
和database_name
分别为数据库的用户名、密码、主机地址、端口号和数据库名称。your_table
是要查询的表名,geometry_column_name
是包含几何数据的列名。数据读取方式如下:
import geopandas as gpd
from sqlalchemy import create_engine# 创建数据库连接引擎
engine = create_engine('postgresql://username:password@host:port/database_name')# 查询数据库表并读取为 GeoDataFrame
sql = "SELECT * FROM your_table"
gdf = gpd.read_postgis(sql, engine, geom_col='geometry_column_name')
4:KML
KML(Keyhole Markup Language)是一种用于表示地理信息的 XML 格式,常用于 Google Earth 等软件。
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"><Placemark><name>Sample Point</name><Point><coordinates>10,20,0</coordinates></Point></Placemark><Placemark><name>Sample Polygon</name><Polygon><outerBoundaryIs><LinearRing><coordinates>11,21,0 12,22,0 13,21,0 11,21,0</coordinates></LinearRing></outerBoundaryIs></Polygon></Placemark>
</kml>
数据读取方式如下:
import geopandas as gpdgdf = gpd.read_file('path_to_kml.kml', driver='KML')
二:数据可视化
1:用Python标记世界地图
import geopandas as gpd
import matplotlib.pyplot as plt
import contextily as ctx
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体等中文字体
# 获取自然地球数据集(包含世界各国的边界等信息)
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))# 定义要标记的固定经纬度点
latitude = 40.7128 # 例如纽约市纬度
longitude = -74.0060 # 例如纽约市经度# 创建地图
fig, ax = plt.subplots(figsize=(15, 10))# 绘制世界地图
world.plot(ax=ax)# 绘制标记点
ax.scatter(longitude, latitude, color='red', s=100)# 添加地图背景图
ctx.add_basemap(ax, zoom=2, source=ctx.providers.Stamen.Terrain)plt.title('全球地图及标记点', size=15)
plt.show()
在这个示例中,首先读取世界地图数据集,然后定义了一个固定的经纬度点(这里以纽约市为例),在地图上绘制世界地图后,使用scatter
绘制标记点。最后添加地图背景图。可以根据实际需求修改标记的经纬度点和标签内容。标记后的世界地图如下:
2:用Python标记我国城市
import geopandas as gpd
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体等中文字体# 读取中国行政区划的 GeoDataFrame
china = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
china = china[china['iso_a3'] == 'CHN']# 创建地图
fig, ax = plt.subplots(figsize=(10, 8))# 绘制中国地图
china.plot(ax=ax)# 定义一些城市的经纬度和名称
cities = {'北京': (116.4074, 39.9042),'上海': (121.4737, 31.2304),'广州': (113.2644, 23.1291),'深圳': (114.0579, 22.5431),'成都': (104.0657, 30.5723)
}# 在地图上标记城市位置
for city_name, (longitude, latitude) in cities.items():ax.scatter(longitude, latitude, color='red', s=50)plt.show()
以上操作可以根据经纬度上标记一些城市位置,例如北京,上海,广州,深圳和成都,标记后的大致的地理位置演示图如下:
想要探索多元化的数据分析视角,可以关注之前发布的相关内容。