第01章 - GDAL概述与基础知识

第01章:GDAL概述与基础知识

1.1 GDAL 简介

1.1.1 什么是 GDAL

GDAL(Geospatial Data Abstraction Library,地理空间数据抽象库)是一个用于读取和写入栅格和矢量地理空间数据格式的开源库。GDAL 由 OSGeo(Open Source Geospatial Foundation,开源地理空间基金会)维护,是地理信息系统(GIS)和遥感领域最重要的基础设施之一。

GDAL 的核心设计理念是提供一个统一的抽象层,使开发者能够以一致的方式访问各种不同的地理空间数据格式,而无需关心底层格式的具体实现细节。

┌─────────────────────────────────────────────────────────────┐
│                      应用程序层                              │
│    (QGIS, ArcGIS, MapServer, PostGIS, 自定义应用...)        │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                       GDAL 抽象层                            │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  GDAL Core  │  │    OGR      │  │    OSR      │         │
│  │ (栅格处理)   │  │ (矢量处理)  │  │ (空间参考)  │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                       驱动层                                 │
│  GeoTIFF│Shapefile│PostGIS│GeoJSON│KML│NetCDF│HDF│...      │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                      数据源层                                │
│     本地文件  │  数据库  │  网络服务  │  云存储             │
└─────────────────────────────────────────────────────────────┘

1.1.2 GDAL 的历史发展

GDAL 的发展历程反映了地理空间开源社区的成长:

年份 里程碑事件
1998 Frank Warmerdam 开始开发 GDAL
2000 GDAL 1.0 正式发布
2002 OGR 库合并到 GDAL 项目
2006 加入 OSGeo 基金会
2007 GDAL 1.4 发布,支持更多格式
2010 GDAL 1.7 发布,性能大幅提升
2014 Even Rouault 成为主要维护者
2019 GDAL 3.0 发布,重大架构更新
2020 GDAL 3.1 发布,支持 PROJ 6+
2021 GDAL 3.3 发布,云优化改进
2022 GDAL 3.5 发布,性能持续优化
2023 GDAL 3.7+ 发布,支持更多现代格式

1.1.3 GDAL 的主要特点

GDAL 之所以成为行业标准,是因为它具备以下关键特点:

1. 格式支持广泛

GDAL 支持超过 200 种 栅格和矢量数据格式:

栅格格式(部分列表):

格式类型 支持的格式
通用影像格式 GeoTIFF, JPEG, PNG, BMP, GIF
卫星遥感格式 HDF4, HDF5, NetCDF, GRIB
商业软件格式 ECW, MrSID, JPEG2000, IMG
开源格式 VRT, MEM, COG (Cloud Optimized GeoTIFF)
数据库存储 PostGIS Raster, GeoPackage

矢量格式(部分列表):

格式类型 支持的格式
标准交换格式 Shapefile, GeoJSON, KML/KMZ, GML
数据库格式 PostGIS, Spatialite, Oracle Spatial
商业软件格式 FileGDB, Personal GDB, MapInfo TAB
开源格式 GeoPackage, FlatGeobuf, TopoJSON
CAD格式 DXF, DWG(部分支持)

2. 跨平台支持

GDAL 可以在多种操作系统上运行:

平台 支持状态
Windows ✅ 完全支持(32位/64位)
Linux ✅ 完全支持(所有主流发行版)
macOS ✅ 完全支持(Intel/Apple Silicon)
Android ✅ 部分支持
iOS ✅ 部分支持

3. 多语言绑定

GDAL 提供多种编程语言的绑定:

语言 绑定方式 成熟度
C/C++ 原生 API ⭐⭐⭐⭐⭐
Python SWIG 绑定 ⭐⭐⭐⭐⭐
Java SWIG 绑定 ⭐⭐⭐⭐
C#/.NET SWIG 绑定 ⭐⭐⭐⭐
Perl SWIG 绑定 ⭐⭐⭐
R rgdal 包 ⭐⭐⭐⭐

4. 丰富的命令行工具

GDAL 提供了一套完整的命令行工具:

# 栅格工具
gdalinfo      # 显示栅格数据信息
gdal_translate # 栅格格式转换
gdalwarp      # 栅格投影转换和重采样
gdal_merge.py # 栅格镶嵌
gdaladdo      # 创建金字塔

# 矢量工具
ogrinfo       # 显示矢量数据信息
ogr2ogr       # 矢量格式转换
ogrlineref    # 线性参考
ogrtindex     # 创建瓦片索引

# 通用工具
gdalsrsinfo   # 显示空间参考信息
gdal_contour  # 等值线生成
gdal_grid     # 网格插值

1.2 GDAL 核心组件

GDAL 库实际上由三个主要组件组成,它们各自负责不同的功能领域:

1.2.1 GDAL Core - 栅格数据处理

GDAL Core 是处理栅格数据的核心组件,主要功能包括:

┌─────────────────────────────────────────────────────────┐
│                    GDAL Core 架构                        │
├─────────────────────────────────────────────────────────┤
│  ┌─────────────────┐  ┌─────────────────┐              │
│  │   GDALDataset   │  │   GDALDriver    │              │
│  │   (数据集)       │  │   (驱动)         │              │
│  └────────┬────────┘  └─────────────────┘              │
│           │                                             │
│           ▼                                             │
│  ┌─────────────────┐                                   │
│  │   GDALRasterBand│                                   │
│  │   (栅格波段)     │                                   │
│  └────────┬────────┘                                   │
│           │                                             │
│           ▼                                             │
│  ┌─────────────────────────────────────────────────┐   │
│  │              像素数据 (Pixel Data)               │   │
│  │  Byte | Int16 | Int32 | Float32 | Float64 | ... │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────┘

主要类和概念:

类名 描述
GDALDataset 表示一个栅格数据集,包含一个或多个波段
GDALRasterBand 表示数据集中的一个波段
GDALDriver 负责读写特定格式的驱动程序
GDALDriverManager 驱动管理器,管理所有注册的驱动

核心功能:

  • 读取和写入栅格数据
  • 访问和修改地理变换参数
  • 处理栅格波段数据
  • 创建和管理金字塔(概览)
  • 读写元数据

1.2.2 OGR - 矢量数据处理

OGR(最初代表 OpenGIS Simple Features Reference Implementation)是处理矢量数据的组件:

┌─────────────────────────────────────────────────────────┐
│                     OGR 架构                             │
├─────────────────────────────────────────────────────────┤
│  ┌─────────────────┐  ┌─────────────────┐              │
│  │  GDALDataset    │  │   OGRDriver     │              │
│  │  (数据源)        │  │   (驱动)         │              │
│  └────────┬────────┘  └─────────────────┘              │
│           │                                             │
│           ▼                                             │
│  ┌─────────────────┐                                   │
│  │   OGRLayer      │                                   │
│  │   (图层)         │                                   │
│  └────────┬────────┘                                   │
│           │                                             │
│           ▼                                             │
│  ┌─────────────────┐  ┌─────────────────┐              │
│  │   OGRFeature    │  │ OGRFeatureDefn  │              │
│  │   (要素)         │  │ (要素定义)       │              │
│  └────────┬────────┘  └─────────────────┘              │
│           │                                             │
│           ▼                                             │
│  ┌─────────────────┐  ┌─────────────────┐              │
│  │  OGRGeometry    │  │  OGRFieldDefn   │              │
│  │  (几何对象)      │  │  (字段定义)      │              │
│  └─────────────────┘  └─────────────────┘              │
└─────────────────────────────────────────────────────────┘

主要类和概念:

类名 描述
GDALDataset 在 OGR 中也表示矢量数据源
OGRLayer 表示数据源中的一个图层
OGRFeature 表示图层中的一个要素
OGRGeometry 表示要素的几何形状
OGRFieldDefn 定义属性字段的结构
OGRFeatureDefn 定义要素的结构(包含字段和几何类型)

支持的几何类型:

几何类型 OGR 类名 描述
OGRPoint 单个坐标点
线 OGRLineString 由点序列组成的线
多边形 OGRPolygon 由外环和可选内环组成
多点 OGRMultiPoint 点的集合
多线 OGRMultiLineString 线的集合
多多边形 OGRMultiPolygon 多边形的集合
几何集合 OGRGeometryCollection 任意几何类型的集合

1.2.3 OSR - 空间参考系统

OSR(OGR Spatial Reference)负责处理坐标系统和投影:

┌─────────────────────────────────────────────────────────┐
│                     OSR 架构                             │
├─────────────────────────────────────────────────────────┤
│  ┌───────────────────────────────────────────────────┐ │
│  │           OGRSpatialReference                      │ │
│  │           (空间参考对象)                            │ │
│  └───────────────────────────────────────────────────┘ │
│                          │                              │
│          ┌───────────────┼───────────────┐             │
│          ▼               ▼               ▼             │
│  ┌───────────────┐ ┌───────────────┐ ┌───────────────┐│
│  │   地理坐标系   │ │   投影坐标系   │ │   局部坐标系  ││
│  │ (Geographic)  │ │ (Projected)   │ │   (Local)     ││
│  └───────────────┘ └───────────────┘ └───────────────┘│
│                                                         │
│  ┌───────────────────────────────────────────────────┐ │
│  │       OGRCoordinateTransformation                  │ │
│  │           (坐标转换对象)                            │ │
│  └───────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘

主要功能:

功能 描述
坐标系定义 支持 WKT、PROJ、EPSG 等多种定义方式
坐标转换 不同坐标系之间的转换
投影计算 正向和逆向投影计算
参数获取 获取椭球体、基准面、投影参数等

常用坐标系标识:

EPSG 代码 名称 描述
4326 WGS 84 全球通用地理坐标系
3857 Web Mercator Web 地图投影
4490 CGCS2000 中国大地坐标系
32650 UTM Zone 50N UTM 投影(北半球50带)
4547 CGCS2000 / 3-degree Gauss-Kruger zone 39 高斯-克吕格投影

1.3 GDAL 与相关项目

1.3.1 GDAL 生态系统

GDAL 是一个庞大生态系统的核心,与许多其他项目紧密集成:

                    ┌─────────────────┐
                    │    QGIS         │
                    │   ArcGIS        │
                    │   MapServer     │
                    │   GeoServer     │
                    └────────┬────────┘
                             │
                    ┌────────▼────────┐
                    │                 │
       ┌────────────┤     GDAL       ├────────────┐
       │            │                 │            │
       │            └────────┬────────┘            │
       │                     │                     │
       ▼                     ▼                     ▼
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│    PROJ     │     │  GEOS       │     │  SQLite     │
│ (投影计算)   │     │ (几何计算)   │     │ (数据库)    │
└─────────────┘     └─────────────┘     └─────────────┘

1.3.2 PROJ 库

PROJ 是一个坐标转换库,GDAL 依赖它进行投影计算:

版本 特点
PROJ 4.x 经典版本,使用 proj4 字符串
PROJ 5.x 过渡版本
PROJ 6.x+ 现代版本,支持 WKT2,精度更高

PROJ 与 GDAL 版本对应:

GDAL 版本 推荐 PROJ 版本
GDAL 2.x PROJ 4.x - 5.x
GDAL 3.0 PROJ 6.x
GDAL 3.3+ PROJ 7.x+
GDAL 3.6+ PROJ 9.x

1.3.3 GEOS 库

GEOS(Geometry Engine Open Source)提供几何操作功能:

功能类型 具体功能
空间关系 Contains, Within, Intersects, Touches, Crosses
空间操作 Buffer, Union, Intersection, Difference, SymDifference
几何验证 IsValid, IsSimple
几何构建 Convex Hull, Centroid, Envelope

1.3.4 依赖关系图

┌─────────────────────────────────────────────────────────────┐
│                        GDAL                                  │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  必需依赖:                                                   │
│  ├── PROJ (坐标投影)                                         │
│  ├── libtiff (GeoTIFF 支持)                                  │
│  ├── libgeotiff (GeoTIFF 地理信息)                           │
│  └── zlib (压缩支持)                                         │
│                                                              │
│  可选依赖:                                                   │
│  ├── GEOS (高级几何操作)                                     │
│  ├── SQLite/Spatialite (GeoPackage 支持)                    │
│  ├── PostgreSQL/PostGIS (PostGIS 支持)                      │
│  ├── libpng (PNG 格式)                                       │
│  ├── libjpeg (JPEG 格式)                                     │
│  ├── libcurl (网络访问)                                      │
│  ├── libxml2 (XML 解析)                                      │
│  ├── HDF5 (HDF5 格式)                                        │
│  ├── NetCDF (NetCDF 格式)                                    │
│  └── OpenJPEG (JPEG2000 格式)                                │
│                                                              │
└─────────────────────────────────────────────────────────────┘

1.4 GDAL 应用场景

1.4.1 典型应用领域

GDAL 在以下领域得到广泛应用:

领域 应用场景
遥感处理 卫星影像预处理、辐射校正、几何校正
GIS 开发 空间数据读写、格式转换、数据管理
地图制图 底图处理、栅格渲染、符号化
数据工程 ETL 流程、数据仓库、批量处理
科学研究 气候数据分析、地质建模、生态研究
国土测绘 地籍数据管理、坐标转换、数据归档
城市规划 三维建模、空间分析、规划展示

1.4.2 实际案例

案例1:卫星影像批量处理

# 使用 Python GDAL 批量处理 Sentinel-2 影像
from osgeo import gdal
import os

def process_sentinel2_images(input_dir, output_dir):
    """批量处理 Sentinel-2 影像"""
    for filename in os.listdir(input_dir):
        if filename.endswith('.tif'):
            input_path = os.path.join(input_dir, filename)
            output_path = os.path.join(output_dir, f"processed_{filename}")
            
            # 打开源数据
            src_ds = gdal.Open(input_path)
            
            # 进行投影转换
            gdal.Warp(output_path, src_ds,
                     dstSRS='EPSG:4326',
                     resampleAlg='bilinear')
            
            src_ds = None

案例2:矢量数据格式转换

# 将 Shapefile 转换为 GeoJSON
from osgeo import ogr

def shp_to_geojson(shp_path, geojson_path):
    """Shapefile 转 GeoJSON"""
    # 获取驱动
    driver = ogr.GetDriverByName('GeoJSON')
    
    # 打开源数据
    src_ds = ogr.Open(shp_path)
    src_layer = src_ds.GetLayer()
    
    # 创建目标数据
    dst_ds = driver.CreateDataSource(geojson_path)
    dst_ds.CopyLayer(src_layer, 'output')
    
    # 清理
    src_ds = None
    dst_ds = None

案例3:坐标系统转换

# 坐标点从 WGS84 转换到 CGCS2000
from osgeo import osr

def transform_coordinates(x, y, src_epsg=4326, dst_epsg=4490):
    """坐标转换"""
    # 创建源和目标空间参考
    src_srs = osr.SpatialReference()
    src_srs.ImportFromEPSG(src_epsg)
    
    dst_srs = osr.SpatialReference()
    dst_srs.ImportFromEPSG(dst_epsg)
    
    # 创建转换对象
    transform = osr.CoordinateTransformation(src_srs, dst_srs)
    
    # 执行转换
    result = transform.TransformPoint(x, y)
    
    return result[0], result[1]

1.4.3 使用 GDAL 的知名项目

项目 类型 如何使用 GDAL
QGIS 桌面 GIS 核心数据访问引擎
GeoServer 地图服务器 栅格数据发布
MapServer 地图服务器 数据格式支持
PostGIS 空间数据库 栅格功能(raster2pgsql)
Rasterio Python 库 底层数据访问
GeoPandas Python 库 矢量数据 I/O
GRASS GIS GIS 软件 数据导入导出
Google Earth Engine 云平台 数据处理引擎

1.5 GDAL 版本与特性

1.5.1 版本演进

大版本 发布时间 主要特性
1.x 2000-2014 基础功能建立,格式支持扩展
2.x 2015-2019 统一 API,性能优化,Python 3 支持
3.x 2019-至今 PROJ 6+ 支持,云优化,多维数组

1.5.2 GDAL 3.x 重要更新

GDAL 3.x 系列带来了许多重要更新:

特性 描述
PROJ 6+ 支持 更精确的坐标转换,支持时间相关的转换
统一 API 栅格和矢量 API 进一步统一
多维数组 更好的 NetCDF/HDF5 支持
云优化 改进的 /vsicurl/ 和 /vsis3/ 支持
COG 支持 原生 Cloud Optimized GeoTIFF 支持
Arrow 集成 支持 Apache Arrow 列式数据格式

1.5.3 选择合适的版本

根据你的需求选择合适的 GDAL 版本:

需求 推荐版本
生产环境稳定性 GDAL 3.4.x LTS
最新功能 GDAL 3.8.x+
旧系统兼容 GDAL 2.4.x
云原生应用 GDAL 3.5.x+

1.6 学习资源与社区

1.6.1 官方资源

资源 URL 描述
官方网站 https://gdal.org 文档、下载、API 参考
GitHub https://github.com/OSGeo/gdal 源码、Issue、PR
邮件列表 gdal-dev@lists.osgeo.org 开发讨论
IRC #gdal on libera.chat 实时交流

1.6.2 学习资料

官方文档:

书籍推荐:

  • 《Geoprocessing with Python》 by Chris Garrard
  • 《Python Geospatial Development》 by Erik Westra
  • 《GDAL/OGR Cookbook》(在线资源)

1.6.3 社区支持

平台 用途
GIS Stack Exchange 问答社区
Reddit r/gis 讨论社区
OSGeo 论坛 官方论坛
GitHub Discussions 技术讨论

1.7 本章小结

本章介绍了 GDAL 的基本概念和核心组件:

  1. GDAL 是什么:地理空间数据抽象库,支持 200+ 种数据格式
  2. 核心组件
    • GDAL Core:栅格数据处理
    • OGR:矢量数据处理
    • OSR:空间参考系统
  3. 主要特点:跨平台、多语言绑定、丰富的命令行工具
  4. 生态系统:与 PROJ、GEOS 等项目紧密集成
  5. 应用场景:遥感处理、GIS 开发、数据工程等

在下一章中,我们将详细介绍 GDAL 的安装与环境配置方法。

1.8 思考与练习

  1. GDAL、OGR、OSR 三个组件各自的主要功能是什么?
  2. 为什么 GDAL 能够成为地理空间数据处理的行业标准?
  3. GDAL 3.x 相比 2.x 版本有哪些重要的改进?
  4. 列举三个你熟悉的使用 GDAL 的项目或软件。
  5. 对于一个新项目,你会如何选择合适的 GDAL 版本?
posted @ 2025-12-29 11:40  我才是银古  阅读(31)  评论(0)    收藏  举报