1. 程式人生 > 實用技巧 >讀書筆記——《python地理空間分析指南》

讀書筆記——《python地理空間分析指南》

本文為《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])