Py学习  »  Python

6个用于清洗地理空间数据的Python工具库

GEE遥感训练营 • 6 月前 • 179 次点击  
地理空间数据清洗的重要性毋庸置疑,它犹如基石,支撑着任何地理信息系统(GIS)分析、建模和决策制定过程的准确性、可靠性和有效性。未经清洗的数据往往问题重重,空间误差如位置不精确、几何形状错误和拓扑错误会导致错误的距离计算和空间关系分析;属性错误如信息缺失、格式不一和错误分类则严重影响数据查询和专题制图;坐标系统的不统一导致数据叠加错位;数据冗余和不完整性则会扭曲分析结果并限制分析的完整性。

忽视地理空间数据清洗的后果是显著的。它会导致错误的分析结果,进而降低决策的有效性,甚至产生负面影响。在地理空间建模中,脏数据还会降低模型的预测能力。更甚者,在分析后期才发现数据问题,将大幅增加后期处理成本,并降低用户对地理信息系统产品和服务的信任度。

得益于Python工具的不断发展,地理空间数据清洗现在变得更加容易。Python拥有许多专门用于地理空间数据的软件包,包括Shapely、Pandas和Geopandas,可用于填充缺失值、重新投影数据集和修复几何图形等任务。本文将介绍用于清洗地理空间数据的6个Python工具库。

1. Geopandas

Geopandas是一个开源Python工具库,旨在简化地理空间数据的操作和分析。它扩展了 Pandas的功能,以支持诸如shapefile、GeoJSON等空间数据结构,从而更轻松地以熟悉的表格格式处理地理空间数据。以下是其主要特性和用途:

Geopandas引入了两种主要的地理空间数据类型: GeoDataFrame:类似于Pandas的DataFrame,但专门用于处理空间数据(点、线、面)。 GeoSeries:一种包含几何图形的Series对象,用于在GeoDataFrame中存储空间信息。

常见用例:

  • 地理空间数据清理:处理缺失的几何图形,修复无效的几何图形,或确保所有数据都位于正确的CRS中。

  • 空间分析: 执行空间连接、缓冲区分析和图层叠加等操作,以分析地理空间要素之间的关系。

1import geopandas as gpd
2
3# 加载 shapefile
4gdf = gpd.read_file('your_shapefile.shp')
5
6# 检查 CRS 并根据需要重新投影
7print(gdf.crs)
8gdf = gdf.to_crs(epsg=4326) # 转换为 WGS84
9
10# 缓冲区操作:创建每个几何图形周围 1 公里的缓冲区
11gdf['buffered'] = gdf.geometry.buffer( 1000)
12
13# 绘制地理空间数据
14gdf.plot()

https://github.com/geopandas/geopandas

2. Fiona

Fiona是一个用于简化地理空间数据格式的读取和写入的python工具库。它为处理矢量数据提供了一个高效的Pythonic接口,并构建于GDAL(地理空间数据抽象库)之上。Fiona专注于易用性和性能,使其成为管理地理空间文件输入和输出 (I/O) 的绝佳选择。

Fiona 支持多种地理空间文件格式,包括Shapefile、GeoJSON、KML、GML、GeoPackage和PostGIS。这使得在不同格式之间进行读取、写入和转换变得容易。

Fiona提供了一个高效的底层API,用于访问地理空间数据,而无需将整个文件加载到内存中。它允许您流式传输大型数据集,而不会过度占用内存。

Fiona用于从各种格式(如Shapefile或GeoJSON)读取数据,并将结果写回不同的格式,从而方便数据转换或导出。在处理大型地理空间文件时,Fiona可以按块或流的方式高效地读取和写入,从而避免将庞大的数据集完全加载到内存中。

1import fiona
2
3# 使用 Fiona 读取 Shapefile
4with fiona.open('your_shapefile.shp') as src:
5 print(src.crs) # 检查坐标参考系统
6 for feature in src:
7 print(feature) # 打印 shapefile 中的每个要素
8
9# 使用 Fiona 写入新的 Shapefile
10schema = {
11 'geometry': 'Polygon',
12 'properties': { 'id': 'int'}
13}
14with fiona.open('new_shapefile.shp', 'w', driver='ESRI Shapefile', crs='EPSG:4326', schema=schema) as dst:
15 dst.write({
16 'geometry': {'type': 'Polygon', 'coordinates': [[(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)]]},
17 'properties': {'id': 1}
18 })

GitHub: https://github.com/Toblerity/Fiona

3. Shapely

Shapely是一个用于操作和分析平面几何对象的Python库。它提供了简单高效的工具来创建、分析和操作诸如点、线和面之类的几何图形,使其成为空间分析和地理空间数据处理的关键库。

Shapely提供了易于使用的函数来创建基本的几何图形,如Point、LineString和Polygon。这些对象可以从坐标或其他数据结构创建。

Shapely允许进行各种空间操作,例如:

  • Intersection: 查找几何图形之间的重叠区域。

  • Union: 将多个几何图形合并为一个。

  • Difference: 从一个几何图形中减去另一个几何图形。

  • Buffering: 创建几何图形周围的缓冲区。

  • Convex Hull: 找到可以包围一组点的最小凸形状。

几何图形的创建和操作:

Shapely可用于从原始数据创建几何图形,修改它们(例如,平移、旋转),并执行诸如合并或分割之类的几何操作。无论用户需要检查两个多边形是否相交、找到多边形的质心,还是计算两点之间的距离,Shapely都能使这些任务变得简单直接。

1from shapely.geometry import Point, Polygon
2 from shapely.ops import unary_union
3
4# 创建几何图形
5point = Point(1, 1)
6polygon = Polygon([(0, 0), (0, 2), (2, 2), (2, 0)])
7
8# 执行几何操作(例如,交集)
9intersection = polygon.intersection(point)
10print(intersection) # 如果点位于多边形内,则应输出该点
11
12# 缓冲区操作:创建一个围绕该点的 1 公里缓冲区
13buffer = point.buffer(1) # 创建一个围绕该点的圆形缓冲区
14print(buffer)
15
16# 合并多个几何图形
17polygon2 = Polygon([(2, 0), (2, 2), (4, 2), (4, 0)])
18union = unary_union([polygon, polygon2])
19print(union) # 合并两个多边形

Shapely的API简单、直观且快速,适用于处理几何操作。它支持广泛的空间操作,包括几何关系、面积/长度计算和变换。Shapely与Geopandas和Fiona等库无缝集成,以便更轻松地操作和分析地理空间数据。

GitHub: https://github.com/shapely/shapely

4. PyProj

PyProj是PROJ的Python接口,PROJ是一个用于执行制图变换和投影的库。它提供了一种简单的方法来在不同的坐标参考系统 (CRS) 和大地测量变换和投影之间进行转换。这对于处理不同坐标系的地理空间数据并确保不同数据集之间的一致性至关重要。

PyProj允许用户在不同的CRS之间转换坐标,例如从局部投影转换为全局投影(例如,WGS84 到 UTM)。它支持大地测量计算,例如计算地球表面上点之间的距离、方位角和方位。用户可以定义自定义CRS和投影,PyProj将为您管理转换,使其灵活地适应非标准的坐标系统。

常见用例:

  • CRS 转换:将一组地理坐标从一个CRS转换为另一个CRS,这在组合来自可能使用不同坐标系统的不同来源的数据时是必要的。

  • 距离计算:计算地球表面上两点之间的距离(使用其经纬度),这在地理空间分析中经常需要。

1import pyproj
2
3# 定义 CRS:WGS84(纬度/经度)和 UTM Zone 33N
4wgs84 = pyproj.CRS('EPSG:4326') # WGS84 (纬度/经度)
5utm = pyproj.CRS('EPSG:32633') # UTM Zone 33N (投影坐标)
6
7# 定义一个转换器来转换两个 CRS
8transformer = pyproj.Transformer.from_crs(wgs84, utm)
9
10# 转换一组坐标(纬度、经度)到 UTM
11lat, lon = 52.205, 0.119
12utm_x, utm_y = transformer.transform(lat, lon)
13print(f"UTM 坐标:x={utm_x}, y={utm_y}")
14
15# 反向转换:将 UTM 转换回纬度/经度
16lat_reversed, lon_reversed = transformer.transform(utm_x, utm_y, direction=pyproj.enums.TransformDirection.INVERSE)
17print(f"纬度/经度:lat={lat_reversed}, lon={lon_reversed}")

GitHub: https://github.com/pyproj4/pyproj

5. Rasterio

Rasterio是一个用于读取和写入地理空间栅格数据(例如卫星图像或数字高程模型)的Python库。它简化了栅格数据的处理,使其更容易处理、操作和分析基于像素的地理空间数据。Rasterio构建于GDAL之上,效率极高,并在地理空间社区中得到广泛使用。

Rasterio提供了简单的方法来读取和写入各种栅格格式,包括GeoTIFF、JPEG、PNG等。它支持高效处理大型栅格文件。Rasterio与坐标参考系统CRS协同工作以处理栅格数据的投影。它支持重新投影栅格,这对于处理来自多个具有不同坐标系统的来源的数据集至关重要。

常见用例:

  • 读取和写入GeoTIFF:Rasterio被广泛用于读取和写入GeoTIFF文件,这是一种用于卫星图像和其他地理空间栅格数据的常见格式。

  • 重新投影栅格数据:将栅格数据从一个CRS转换为另一个CRS是组合来自不同来源的栅格图层的关键任务。

1import rasterio
2from rasterio.plot import show
3
4# 打开栅格文件
5with rasterio.open('your_raster.tif') as src:
6 # 从栅格读取数据
7 band1 = src.read(1) # 读取第一个波段
8 print(src.crs) # 检查栅格的 CRS
9
10 # 绘制栅格
11 show(src)
12
13 # 获取栅格元数据
14 print(src.meta)
15
16# 重新投影栅格(如果需要)
17from rasterio.warp import calculate_default_transform, reproject, Resampling
18with rasterio.open('your_raster.tif') as src:
19 # 定义新的 CRS(例如,EPSG:4326)
20 dst_crs = 'EPSG:4326'
21 transform, width, height = calculate_default_transform(
22 src.crs, dst_crs, src.width, src.height, *src.bounds)
23
24 # 创建一个新文件来存储重新投影的栅格
25 with rasterio.open('reprojected_raster.tif', 'w', driver='GTiff', count=src.count, dtype=src.dtypes[0],
26 crs=dst_crs, transform=transform, width=width, height=height) as dst:
27 for i in range(1, src.count + 1):
28 reproject(
29 source=rasterio.band(src, i),
30 destination=rasterio.band(dst, i),
31 src_transform=src.transform,
32 src_crs=src.crs,
33 dst_transform=transform,
34 dst_crs=dst_crs,
35 resampling=Resampling.nearest)

Rasterio专门为栅格数据进行了优化,使其成为地理空间栅格操作的首选库。 它使用诸如窗口化等技术高效处理大型栅格数据集,从而确保分析期间的最小内存使用量。

GitHub: https://github.com/rasterio/rasterio

6. TopoPyScale

TopoPyScale是一个用于分析和建模地形和地貌的Python库。它专注于分析地形特征及其尺度属性,例如海拔、坡度和坡向。TopoPyScale特别适用于分析和理解景观特征,尤其是在涉及DEM数字高程模型)和地形数据的地理空间分析中。

TopoPyScale允许计算关键的地形特征,例如坡度、坡向和曲率,这些对于理解景观的物理特征至关重要。该库提供了用于分析地形尺度的工具,这对于研究不同空间尺度下地形的自相似性至关重要。

常见用例:

  • 地形特征提取:从DEM数据中提取关键的地形特征(例如,坡度、坡向、曲率),以进行进一步的空间分析或建模。

  • 分形和尺度分析:分析地形的尺度属性以理解景观的自相似性,这在地形地貌研究或建模地形特征中可能很重要。

1import TopoPyScale
2import numpy as np
3import matplotlib.pyplot as plt
4
5# 示例:加载 DEM(数字高程模型)
6dem = np.loadtxt("dem_data.txt") # 替换成您的 DEM 数据源
7
8# 计算地形坡度和坡向
9slope = TopoPyScale.slope(dem)
10aspect = TopoPyScale.aspect(dem)
11
12# 可视化坡度和坡向
13plt.figure(figsize=(12, 6))
14
15# 绘制坡度
16plt.subplot(1, 2, 1)
17plt.imshow(slope, cmap='terrain')
18plt.title("Slope")
19plt.colorbar()
20
21# 绘制坡向
22plt.subplot(1, 2, 2)
23plt.imshow(aspect, cmap='twilight')
24plt.title("Aspect")
25plt.colorbar()
26
27plt.show()
28
29# 示例:地形的分形分析
30fractal_dim = TopoPyScale.fractal_dimension(dem)
31print(f"地形的分形维度:{fractal_dim}")

GitHub: https://github.com/TopoPyScale/topopyscale

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/178351
 
179 次点击