本文为《Python地理空间分析指南(第2版)》的读书摘录,顺便挖个坑,进一步对python的几个包做学习整理。
本笔记的用途:了解python地理空间处理的技术框架和实现途径。
第三章 地理空间技术概览
一般来说,地理空间软件包不同程度上实现了以下4种高级核心功能:数据访问;几何计算(包括数据重投影);可视化;元数据工具。
GDAL, OGR, GEOS和PROJ.4库是地理空间分析产业商业、开源软件的核心和灵魂。
数据访问
GDAL (The Geospatial Data Abstraction Library) 为栅格数据提供了一个单一、抽象的数据模型。
OGR 处理矢量数据,X11/MIT开源授权协议。
几何计算
PROJ.4 投影库能够描述任何投影信息,为GDAL和OGR库处理矢量、栅格数据提供支持。
CGAL 计算几何算法库
JTS 是Java地理空间计算几何库,实现了SQL的开放地理空间联盟(OGC)简单要素标准。
GEOS 开源几何引擎,JTS的C++版本实现。
PostGIS 空间数据库,是PostgreSQL的一个模块,免费开源。
可视化
QGIS (Quantum GIS) 开源的地理信息系统,是基于GDAL/OGR库和GEOS库构建的,所以能使用PostGIS,并且支持这些软件包提供的数据源。
OpenEV 最快的栅格数据查看器,支持GDAL/OGR库和PROJ.4库的所有功能,方便浏览和数据转换。
ArcGIS
元数据管理
地理空间数据集的元数据能够遵循并保证数据集的完整性,而且可以追溯到数据生产商。格式正确的元数据还允许自动编目、索引搜索和数据集集成。
GeoNetwork 是开源的、使用Java实现的管理地理空间数据的目录服务。
Python库
网络库 urllib ftplib zipfile xml beautifulsoup4 lxml
Json库 json geojson osgeo.ogr
shapefile文件 Pyshp
import shapefile
shp = shapefile.Reader("point.shp")
for feature in shp.shapeRecords():
point = feature.shape.points[0]
rec = feature.record[0]
print(point[0], point[1], rec)
dbf文件 dbfpy3
Shaplely库 是高级的Python风格的GEOS库几何操作的做,它完全依赖其他模块导入或导出数据,功能聚焦于几何操作方面。
from shapely import wkt, geometry
wktPoly = "POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))"
poly = wkt.loads(wktPoly)
print(poly.buffer(5.0).difference(poly).area) # 158.4137
Fiona 模块为OGR库的数据访问功能提供了一套简洁的Python API,默认输出格式是GeoJSON。
import fiona
import pprint
f = fiona.open("...")
print(f.driver, f.crs, f.bounds, f.schema)
pprint.pprint(f[1])
GDAL
from osgeo import gdal
raster = gdal.Open("....tif")
print(raster.RasterCount, raster.RasterXSize)
PIL 图像编辑,升级版本Pillow,轻量级PNGCanvas,栅格化Shapefile文件
GeoPandas
import geopandas
import matplotlib.pyplot as plt
gdf = geopandas.GeoDataFrame
census = gdf.from_file("....shp") # 打开并存储为GeoJSON格式
census.plot()
plt.show()
Numpy
pymysql 提供有限的空间功能
pyFPDF 一种轻量级的创建包括地图等PDF文件的解决方案。
Spectral Python 一款专门处理遥感应用的高级功能包。
重投影
Shapefile文件编辑
.shp文件包含几何图形,.dbf文件包含几何图像相关的属性信息。
import shapefile
r = shapefile.Reader("M")
print(r.bbox, r.shapeType, r.numRecords)
# dbf文件是简单的数据库格式,类似行列式的电子表格结构,每一列通过标签定义它包含的信息。
print(r.fields)
# field name, field type, field length, decimal length
# DeletionFlag, ...
# 通过字段访问数据
fieldNames = [item[0] for item in r.fields[1:]]
name10 = fieldNames.index("NAME10")
print(r.record(2)[name10])