GDAL 在 Python 中的开发起步
文章目录
- 1. 本地开发环境
- 2. OSGeo与GDAL
- 3. GDAL在Python中引入方式
- 4. GDAL的核心概念--注册数据驱动
- 5. 查看驱动列表
- 6. Python 的模块导入机制
1. 本地开发环境
本文使用如下开发环境,以供参考。
Python 3.12.8GDAL:3.11.1
2. OSGeo与GDAL
osgeo官网地址:https://www.osgeo.org/
在2006年之后,因为GDAL成为了OSGEO的子项目,对代码进行了重构,将gdal、ogr与osr等模块整合到了osgeo命名空间之下,所以现在推荐使用以下导入方式。
GDAL网址:https://www.osgeo.org/projects/gdal/
3. GDAL在Python中引入方式
早期 GDAL 直接提供 import gdal,但后来统一放在 osgeo 包里(避免命名冲突)。
from osgeo import gdal
from osgeo import ogr
from osgeo import osr
from osgeo import gdal_array
from osgeo import gdalconst
- gdal: 用于栅格数据(如 GeoTIFF, HDF, NetCDF 等)的读写、转换、处理。
- ogr: 用于矢量数据(如 Shapefile, GeoJSON, KML 等)的读写、处理。
- osr: 用于处理坐标系和投影(SRS)。
- gdal_array: 将 GDAL 数据集(Dataset)转换为 NumPy 数组,或反向转换,便于进行数值计算。
- gdalconst: 包含一些常用的常量(如 gdalconst.GA_ReadOnly)。
更清晰的命名空间:
osgeo 包含多个子模块:gdal(栅格)、ogr(矢量)、osr(坐标系)、gdal_array 等。
用 from osgeo import gdal 可以明确表明 这是 osgeo 里的 gdal 模块。
对比示例:
# 方式一:直接导入整个路径
import osgeo.gdal
dataset = osgeo.gdal.Open("file.tif")# 方式二:推荐写法(更简洁)
from osgeo import gdal
dataset = gdal.Open("file.tif")
两者效果是一样的,只是写法不同。
4. GDAL的核心概念–注册数据驱动
GDAL的数据驱动(Driver)是其核心概念之一,从而使得GDAL能够支持各种各样的地理空间数据格式。注册驱动的目的就是为了告诉系统当前环境何种格式是可用的。
-
驱动(Driver):一个驱动就是一个用于读写特定数据格式(如 GeoTIFF, Shapefile, GeoJSON, PNG)的代码库。
-
注册(Register):将驱动添加到GDAL内部驱动管理器中,当调用GDALOpen或Create时,GDAL才知道调用哪个驱动来处理数据。
自动注册所有驱动,gdal和ogr模块都提供了便捷的函数来一次性注册所有的驱动。
from osgeo import gdal
from osgeo import ogr# 注册所有栅格格式驱动(用于gdal)
gdal.AllRegister()# 注册所有矢量格式驱动(用于ogr)
ogr.RegisterAll()# 现在你可以打开文件了,GDAL会自动识别格式并选择合适的驱动
dataset = gdal.Open('test.tif') # 会自动使用GTiff驱动
vector_ds = ogr.Open('test.shp') # 会自动使用ESRI Shapefile驱动
5. 查看驱动列表
可以通过遍历已注册驱动来查看GDAL版本支持哪些地理空间数据格式。新建一个文本文件drivers.txt,在其中写入以下代码:
driver.py
from osgeo import gdal
from osgeo import ogrprint("Available Raster Drivers: "+str(gdal.GetDriverCount())+" 种")
for i in range(gdal.GetDriverCount()):driver = gdal.GetDriver(i)print(f" - {driver.ShortName}: {driver.LongName}")print("nAvailable Vector Drivers: "+str(ogr.GetDriverCount())+" 种")
# 注意:ogr.GetDriverCount() 已弃用,推荐使用 OGRSFDriverRegistrar
# 更现代的方式是使用 ogr.GetDriverByName 或遍历
for i in range(ogr.GetDriverCount()):driver = ogr.GetDriver(i)print(f" - {driver.GetName()}")
其中gdal.GetDriverCount()和ogr.GetDriverCount()用于统计支持的栅格数据和矢量数据格式总数。对于栅格数据具有ShortName和LongName两个名称,其中ShortName相当于驱动名称简写,而LongName这是对应驱动的文字描述数据。
保存该文本文件,并将其后缀修改为.py
之后打开cmd命令行窗口,导航到drivers.py文件目录,运行命令图片
python driver.py
从以下输出信息得知GDAL当前版本支持的栅格驱动为201种,矢量驱动为74种。
Available Raster Drivers: 201 种- VRT: Virtual Raster- DERIVED: Derived datasets using VRT pixel functions- GTI: GDAL Raster Tile Index- SNAP_TIFF: Sentinel Application Processing GeoTIFF- GTiff: GeoTIFF- COG: Cloud optimized GeoTIFF generator- LIBERTIFF: GeoTIFF (using LIBERTIFF library)- NITF: National Imagery Transmission Format- RPFTOC: Raster Product Format TOC format- ECRGTOC: ECRG TOC format- HFA: Erdas Imagine Images (.img)- SAR_CEOS: CEOS SAR Image- CEOS: CEOS Image- JAXAPALSAR: JAXA PALSAR Product Reader (Level 1.1/1.5)- GFF: Ground-based SAR Applications Testbed File Format (.gff)- ESRIC: Esri Compact Cache- AIG: Arc/Info Binary Grid- AAIGrid: Arc/Info ASCII Grid- GRASSASCIIGrid: GRASS ASCII Grid- ISG: International Service for the Geoid- DTED: DTED Elevation Raster- PNG: Portable Network Graphics- JPEG: JPEG JFIF- MEM: In Memory raster, vector and multidimensional raster- JDEM: Japanese DEM (.mem)- GIF: Graphics Interchange Format (.gif)- BIGGIF: Graphics Interchange Format (.gif)- ESAT: Envisat Image Format- FITS: Flexible Image Transport System- BSB: Maptech BSB Nautical Charts- BMP: MS Windows Device Independent Bitmap- DIMAP: SPOT DIMAP- AirSAR: AirSAR Polarimetric Image- RS2: RadarSat 2 XML Product- SAFE: Sentinel-1 SAR SAFE Product- PCIDSK: PCIDSK Database File- PCRaster: PCRaster Raster File- ILWIS: ILWIS Raster Map- SRTMHGT: SRTMHGT File Format- Leveller: Leveller heightfield- Terragen: Terragen heightfield- netCDF: Network Common Data Format- HDF4: Hierarchical Data Format Release 4- HDF4Image: HDF4 Dataset- ISIS3: USGS Astrogeology ISIS cube (Version 3)- ISIS2: USGS Astrogeology ISIS cube (Version 2)- PDS: NASA Planetary Data System- PDS4: NASA Planetary Data System 4- VICAR: MIPL VICAR file- TIL: EarthWatch .TIL- ERS: ERMapper .ers Labelled- JP2OpenJPEG: JPEG-2000 driver based on JP2OpenJPEG library- L1B: NOAA Polar Orbiter Level 1b Data Set- GRIB: GRIdded Binary (.grb, .grb2)- RMF: Raster Matrix Format- WCS: OGC Web Coverage Service- WMS: OGC Web Map Service- MSGN: EUMETSAT Archive native (.nat)- RST: Idrisi Raster A.1- GSBG: Golden Software Binary Grid (.grd)- GS7BG: Golden Software 7 Binary Grid (.grd)- COSAR: COSAR Annotated Binary Matrix (TerraSAR-X)- TSX: TerraSAR-X Product- COASP: DRDC COASP SAR Processor Raster- MAP: OziExplorer .MAP- KMLSUPEROVERLAY: Kml Super Overlay- WEBP: WEBP- PDF: Geospatial PDF- MBTiles: MBTiles- PLMOSAIC: Planet Labs Mosaics API- CALS: CALS (Type 1)- WMTS: OGC Web Map Tile Service- SENTINEL2: Sentinel 2- MRF: Meta Raster Format- PNM: Portable Pixmap Format (netpbm)- DOQ1: USGS DOQ (Old Style)- DOQ2: USGS DOQ (New Style)- PAux: PCI .aux Labelled- MFF: Vexcel MFF Raster- MFF2: Vexcel MFF2 (HKV) Raster- GSC: GSC Geogrid- FAST: EOSAT FAST Format- LAN: Erdas .LAN/.GIS- CPG: Convair PolGASP- NDF: NLAPS Data Format- EIR: Erdas Imagine Raw- LCP: FARSITE v.4 Landscape File (.lcp)- GTX: NOAA Vertical Datum .GTX- LOSLAS: NADCON .los/.las Datum Grid Shift- NTv2: NTv2 Datum Grid Shift- ACE2: ACE2- SNODAS: Snow Data Assimilation System- KRO: KOLOR Raw- ROI_PAC: ROI_PAC raster- RRASTER: R Raster- BYN: Natural Resources Canada's Geoid- NOAA_B: NOAA GEOCON/NADCON5 .b format- NSIDCbin: NSIDC Sea Ice Concentrations binary (.bin)- RIK: Swedish Grid RIK (.rik)- USGSDEM: USGS Optional ASCII DEM (and CDED)- GXF: GeoSoft Grid Exchange Format- BAG: Bathymetry Attributed Grid- S102: S-102 Bathymetric Surface Product- S104: S-104 Water Level Information for Surface Navigation Product- S111: Surface Currents Product- HDF5: Hierarchical Data Format Release 5- HDF5Image: HDF5 Dataset- NWT_GRD: Northwood Numeric Grid Format .grd/.tab- NWT_GRC: Northwood Classified Grid Format .grc/.tab- ADRG: ARC Digitized Raster Graphics- SRP: Standard Raster Product (ASRP/USRP)- PostGISRaster: PostGIS Raster driver- SAGA: SAGA GIS Binary Grid (.sdat, .sg-grd-z)- XYZ: ASCII Gridded XYZ- HF2: HF2/HFZ heightfield raster- CTG: USGS LULC Composite Theme Grid- ZMap: ZMap Plus Grid- NGSGEOID: NOAA NGS Geoid Height Grids- IRIS: IRIS data (.PPI, .CAPPi etc)- PRF: Racurs PHOTOMOD PRF- EEDAI: Earth Engine Data API Image- EEDA: Earth Engine Data API- DAAS: Airbus DS Intelligence Data As A Service driver- SIGDEM: Scaled Integer Gridded DEM .sigdem- EXR: Extended Dynamic Range Image File Format- AVIF: AV1 Image File Format- TGA: TGA/TARGA Image File Format- OGCAPI: OGCAPI- STACTA: Spatio-Temporal Asset Catalog Tiled Assets- STACIT: Spatio-Temporal Asset Catalog Items- JPEGXL: JPEG-XL- GDALG: GDAL Streamed Algorithm driver- GNMFile: Geographic Network generic file based model- GNMDatabase: Geographic Network generic DB based model- ESRI Shapefile: ESRI Shapefile- MapInfo File: MapInfo File- LVBAG: Kadaster LV BAG Extract 2.0- S57: IHO S-57 (ENC)- DGN: Microstation DGN- OGR_VRT: VRT - Virtual Datasource- CSV: Comma Separated Value (.csv)- GML: Geography Markup Language (GML)- GPX: GPX- LIBKML: Keyhole Markup Language (LIBKML)- KML: Keyhole Markup Language (KML)- GeoJSON: GeoJSON- GeoJSONSeq: GeoJSON Sequence- ESRIJSON: ESRIJSON- TopoJSON: TopoJSON- OGR_GMT: GMT ASCII Vectors (.gmt)- GPKG: GeoPackage- SQLite: SQLite / Spatialite- ODBC: Open Database Connectivity (ODBC)- WAsP: WAsP .map format- PGeo: ESRI Personal GeoDatabase- MSSQLSpatial: Microsoft SQL Server Spatial Database- PostgreSQL: PostgreSQL/PostGIS- OpenFileGDB: ESRI FileGeodatabase (using OpenFileGDB)- DXF: AutoCAD DXF- CAD: AutoCAD Driver- FlatGeobuf: FlatGeobuf- GeoRSS: GeoRSS- VFK: Czech Cadastral Exchange Data Format- PGDUMP: PostgreSQL SQL dump- OSM: OpenStreetMap XML and PBF- GPSBabel: GPSBabel- OGR_PDS: Planetary Data Systems TABLE- WFS: OGC WFS (Web Feature Service)- OAPIF: OGC API - Features- EDIGEO: French EDIGEO exchange format- Idrisi: Idrisi Vector (.vct)- XLS: MS Excel format- ODS: Open Document/ LibreOffice / OpenOffice Spreadsheet- XLSX: MS Office Open XML spreadsheet- Elasticsearch: Elastic Search- Carto: Carto- AmigoCloud: AmigoCloud- SXF: Storage and eXchange Format- Selafin: Selafin- JML: OpenJUMP JML- PLSCENES: Planet Labs Scenes API- CSW: OGC CSW (Catalog Service for the Web)- VDV: VDV-451/VDV-452/INTREST Data Format- MVT: Mapbox Vector Tiles- NGW: NextGIS Web- MapML: MapML- GTFS: General Transit Feed Specification- PMTiles: ProtoMap Tiles- JSONFG: OGC Features and Geometries JSON- MiraMonVector: MiraMon Vectors (.pol, .arc, .pnt)- ADBC: Arrow Database Connectivity- AVCBin: Arc/Info Binary Coverage- AVCE00: Arc/Info E00 (ASCII) Coverage- AIVector: Artificial Intelligence powered vector driver- GenBin: Generic Binary (.hdr Labelled)- ENVI: ENVI .hdr Labelled- EHdr: ESRI .hdr Labelled- ISCE: ISCE raster- Zarr: Zarr- RCM: Radarsat Constellation Mission XML Product- HTTP: HTTP Fetching Wrapper
nAvailable Vector Drivers: 74 种- MEM- FITS- PCIDSK- netCDF- PDS4- VICAR- JP2OpenJPEG- PDF- MBTiles- BAG- EEDA- OGCAPI- GDALG- ESRI Shapefile- MapInfo File- LVBAG- S57- DGN- OGR_VRT- CSV- GML- GPX- LIBKML- KML- GeoJSON- GeoJSONSeq- ESRIJSON- TopoJSON- OGR_GMT- GPKG- SQLite- ODBC- WAsP- PGeo- MSSQLSpatial- PostgreSQL- OpenFileGDB- DXF- CAD- FlatGeobuf- GeoRSS- VFK- PGDUMP- OSM- GPSBabel- OGR_PDS- WFS- OAPIF- EDIGEO- Idrisi- XLS- ODS- XLSX- Elasticsearch- Carto- AmigoCloud- SXF- Selafin- JML- PLSCENES- CSW- VDV- MVT- NGW- MapML- GTFS- PMTiles- JSONFG- MiraMonVector- ADBC- AVCBin- AVCE00- AIVector- HTTP
6. Python 的模块导入机制
Python 的导入语法有几种形式:
- import 语法
import math
import osgeo.gdal
这种写法会把整个模块导入,调用时需要写完整路径:
osgeo.gdal.Open("xxx.tif")
- from … import … 语法
from osgeo import gdal
这种写法相当于从 osgeo 包中取出 gdal 模块,放到当前命名空间里。
调用时就可以直接用:
gdal.Open("xxx.tif")
- GDAL 官方推荐 from osgeo import gdal
- 兼容性:
早期 GDAL 直接提供 import gdal,但后来统一放在 osgeo 包里(避免命名冲突)。
如果用 import gdal,某些环境下会找不到模块。
推荐写法是:
from osgeo import gdal, ogr, osr
- 更清晰的命名空间:
osgeo 包含多个子模块:gdal(栅格)、ogr(矢量)、osr(坐标系)、gdal_array 等。
用 from osgeo import gdal 可以明确表明 这是 osgeo 里的 gdal 模块。
“人的一生会经历很多痛苦,但回头想想,都是传奇”。