L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

gdal-api

gdal-api

Use when programming against GDAL/OGR in C, C++, Python, Java, or .NET for raster/vector I/O, coordinate transformation, or custom geospatial algorithms. GDAL API: low-level programming interface for reading/writing 70+ geospatial formats.

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: gdal-api description: "Use when programming against GDAL/OGR in C, C++, Python, Java, or .NET for raster/vector I/O, coordinate transformation, or custom geospatial algorithms. GDAL API: low-level programming interface for reading/writing 70+ geospatial formats."

tags:

  • gdal
  • api
  • python
  • cpp
  • dotnet
  • java
  • raster
  • vector
  • gis
  • geospatial

项目地址: https://github.com/OSGeo/gdal

API 总览文档: https://gdal.org/en/stable/api/index.html

C/C++ API 参考: https://gdal.org/en/stable/api/index.html#c-api

Python API 参考: https://gdal.org/en/stable/api/python/index.html

Java API 参考: https://gdal.org/en/stable/api/java/index.html

C# API 参考: https://gdal.org/en/stable/api/csharp/index.html

许可证: MIT

概述

GDAL 是地理空间数据处理的事实标准库,由 OSGeo 基金会维护。它提供:

  • 200+ 栅格驱动:GeoTIFF、NetCDF、HDF5、COG、JPEG2000 等
  • 100+ 矢量驱动:Shapefile、GeoJSON、GeoPackage、PostGIS、FlatGeobuf 等
  • 坐标参考系统:基于 PROJ 的坐标变换与投影转换
  • 栅格分析:重采样、镶嵌、裁剪、波段运算、DEM 分析等
  • 矢量操作:空间过滤、属性查询、要素创建与编辑等

GDAL 核心以 C++ 实现,同时通过 SWIG 提供 Python、Java、C# 三种语言绑定,各语言 API 与 C++ 保持一致的类与方法命名。


环境准备

C++ 环境

# Linux (Debian/Ubuntu)
apt-get install libgdal-dev

# macOS (Homebrew)
brew install gdal

# CMake 项目中链接 GDAL
# CMakeLists.txt
find_package(GDAL REQUIRED)
target_link_libraries(myapp PRIVATE GDAL::GDAL)

Python 环境

# pip 安装(需系统已安装 GDAL 库)
pip install GDAL

# Conda 安装(推荐,自动处理 C 库依赖)
conda install -c conda-forge gdal

# 验证
python -c "from osgeo import gdal; print(gdal.VersionInfo())"

Java 环境

<!-- Maven 依赖(Java 绑定版本随 GDAL 次版本发布,Maven Central 当前最新 3.13.0) -->
<dependency>
    <groupId>org.gdal</groupId>
    <artifactId>gdal</artifactId>
    <version>3.13.0</version><!-- 最新版查看 https://central.sonatype.com/artifact/org.gdal/gdal -->
</dependency>
// Gradle
implementation 'org.gdal:gdal:3.13.0'

注意: Java 绑定需要在系统 PATH(Windows)或 LD_LIBRARY_PATH(Linux)中找到 gdalalljni 本地库。

C# 环境

# .NET Core / .NET 5+ 项目
dotnet add package MaxRev.Gdal.Core
dotnet add package MaxRev.Gdal.LinuxRuntime.Minimal   # Linux
dotnet add package MaxRev.Gdal.WindowsRuntime.Minimal  # Windows

注意: 官方 SWIG 绑定命名空间为 OSGeo.GDAL、OSGeo.OGR、OSGeo.OSR。NuGet 包 MaxRev.Gdal.Core 是社区维护的跨平台封装。


核心类一览

GDAL API 在四种语言中保持一致的类结构,下表列出核心类及其作用:

栅格 API 核心类

类C++ 头文件 / 模块用途
GDALDrivergdal_priv.h / osgeo.gdal栅格驱动——注册格式、创建数据集
GDALDatasetgdal_priv.h / osgeo.gdal★ 栅格数据集——打开、读写、获取元数据
GDALRasterBandgdal_priv.h / osgeo.gdal栅格波段——读写像素、获取统计信息
GDALColorTablegdal_priv.h / osgeo.gdal颜色表——索引颜色映射
GDALRasterAttributeTablegdal_priv.h / osgeo.gdal栅格属性表

矢量 API 核心类(OGR)

类C++ 头文件 / 模块用途
OGRSFDriver / GDALDriverogrsf_frmts.h / osgeo.ogr矢量驱动
GDALDataset / OGRDataSourceogrsf_frmts.h / osgeo.ogr★ 矢量数据源——管理图层集合
OGRLayerogrsf_frmts.h / osgeo.ogr★ 矢量图层——读写要素、空间过滤
OGRFeatureogr_feature.h / osgeo.ogr矢量要素——属性 + 几何
OGRFeatureDefnogr_feature.h / osgeo.ogr要素定义——字段结构
OGRFieldDefnogr_feature.h / osgeo.ogr字段定义——名称、类型
OGRGeometryogr_geometry.h / osgeo.ogr几何基类(Point、LineString、Polygon 等)

空间参考类(OSR)

类C++ 头文件 / 模块用途
OGRSpatialReferenceogr_spatialref.h / osgeo.osr★ 空间参考系统——定义 CRS
OGRCoordinateTransformationogr_spatialref.h / osgeo.osr★ 坐标变换——在不同 CRS 间转换坐标

各语言模块 / 命名空间对照

功能域C++PythonJavaC#
栅格#include "gdal_priv.h"from osgeo import gdalimport org.gdal.gdal.*using OSGeo.GDAL;
矢量#include "ogrsf_frmts.h"from osgeo import ogrimport org.gdal.ogr.*using OSGeo.OGR;
空间参考#include "ogr_spatialref.h"from osgeo import osrimport org.gdal.osr.*using OSGeo.OSR;

栅格数据读取与创建写入的完整 API 与代码示例见 reference/raster-api.md 矢量数据读取与创建写入的完整 API 与代码示例见 reference/vector-api.md

坐标参考系统与坐标变换

C++

#include "ogr_spatialref.h"

// 定义坐标系
OGRSpatialReference srcSRS, dstSRS;
srcSRS.SetWellKnownGeogCS("WGS84");        // EPSG:4326
dstSRS.importFromEPSG(3857);               // Web Mercator

// 创建坐标变换
OGRCoordinateTransformation *transform =
    OGRCreateCoordinateTransformation(&srcSRS, &dstSRS);

// 变换坐标
double x = 116.4, y = 39.9;
if (transform->Transform(1, &x, &y)) {
    // x, y 已变换为 EPSG:3857 坐标
}

OCTDestroyCoordinateTransformation(transform);

Python

from osgeo import osr

# 定义坐标系
src_srs = osr.SpatialReference()
src_srs.SetWellKnownGeogCS("WGS84")        # EPSG:4326

dst_srs = osr.SpatialReference()
dst_srs.ImportFromEPSG(3857)               # Web Mercator

# 创建坐标变换
transform = osr.CoordinateTransformation(src_srs, dst_srs)

# 变换坐标
x, y, z = transform.TransformPoint(116.4, 39.9)

Java

import org.gdal.osr.SpatialReference;
import org.gdal.osr.CoordinateTransformation;
import org.gdal.osr.osr;

// 定义坐标系
SpatialReference srcSRS = new SpatialReference();
srcSRS.SetWellKnownGeogCS("WGS84");        // EPSG:4326

SpatialReference dstSRS = new SpatialReference();
dstSRS.ImportFromEPSG(3857);               // Web Mercator

// 创建坐标变换
CoordinateTransformation transform =
    osr.CreateCoordinateTransformation(srcSRS, dstSRS);

// 变换坐标
double[] point = new double[]{116.4, 39.9, 0};
transform.TransformPoint(point);
// point[0], point[1] 已变换为 EPSG:3857 坐标

C#

using OSGeo.OSR;

// 定义坐标系
SpatialReference srcSRS = new SpatialReference("");
srcSRS.SetWellKnownGeogCS("WGS84");        // EPSG:4326

SpatialReference dstSRS = new SpatialReference("");
dstSRS.ImportFromEPSG(3857);               // Web Mercator

// 创建坐标变换
CoordinateTransformation transform =
    new CoordinateTransformation(srcSRS, dstSRS);

// 变换坐标
double[] point = new double[3] { 116.4, 39.9, 0 };
transform.TransformPoint(point);
// point[0], point[1] 已变换为 EPSG:3857 坐标

栅格格式转换与重投影的完整示例见 reference/raster-api.md 矢量格式转换、空间过滤、几何操作与 GeoPackage 读写的完整示例见 reference/vector-api.md 常用栅格数据格式与创建选项详见 reference/raster-api.md 常用矢量数据格式详见 reference/vector-api.md

典型应用场景

场景C++PythonJavaC#
读取栅格元数据GDALOpen + GetGeoTransformgdal.Open + GetGeoTransformgdal.Open + GetGeoTransformGdal.Open + GetGeoTransform
栅格格式转换CreateCopygdal.Translategdal.TranslateGdal.wrapper_GDALTranslate
栅格重投影GDALAutoCreateWarpedVRTgdal.Warpgdal.WarpGdal.Warp
读取矢量要素GDALOpenEx + GetNextFeatureogr.Open + 迭代ogr.Open + GetNextFeatureOgr.Open + GetNextFeature
矢量格式转换CopyLayer / CreateFeaturegdal.VectorTranslateogr.CopyLayerOgr.CopyLayer
坐标变换OGRCreateCoordinateTransformationosr.CoordinateTransformationosr.CreateCoordinateTransformationnew CoordinateTransformation
创建缓冲区OGRGeometry::Buffergeom.Buffergeom.Buffergeom.Buffer
空间查询SetSpatialFilterRectSetSpatialFilterRectSetSpatialFilterRectSetSpatialFilterRect
SQL 查询ExecuteSQLExecuteSQLExecuteSQLExecuteSQL
波段运算RasterIO 手动计算gdal_calc.py / NumPyRasterIO 手动计算RasterIO 手动计算

常见注意事项

通用注意事项

  1. 驱动注册:使用任何 GDAL 功能前,必须调用注册函数。C++ 和 Python 使用 GDALAllRegister(),Java 使用 gdal.AllRegister(),C# 使用 Gdal.AllRegister()。矢量操作还需 OGRRegisterAll() / ogr.RegisterAll()。
  2. 资源释放:C++ 使用 GDALClose() / OGRFeature::DestroyFeature();Python 赋值 None 触发释放;Java 调用 .delete();C# 调用 .Dispose()。未释放资源可能导致文件损坏。
  3. 坐标轴顺序:GDAL 3.0+ 默认遵循 EPSG 规范(纬度在前),可通过 OGRSpatialReference::SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER) 强制经度在前。
  4. 线程安全:GDAL 全局状态非线程安全,多线程环境需注意:每个线程使用独立的 GDALDataset;避免并发写入同一数据集。
  5. 大文件处理:对大型栅格使用分块读写(RasterIO 指定窗口),避免一次性读取整个影像到内存。
  6. 错误处理:使用 CPLGetLastErrorMsg()(C++)、gdal.GetLastErrorMsg()(Python)获取详细错误信息。

C++ 特有注意事项

  1. 内存管理:使用 CPLFree() 释放 GDAL 分配的 C 字符串(如 exportToWkt 返回的 WKT)。几何对象使用 OGRGeometryFactory::destroyGeometry() 销毁。
  2. 编译链接:确保使用 gdal-config --cflags --libs 或 CMake find_package(GDAL) 正确配置编译参数。

Python 特有注意事项

  1. 异常模式:默认 GDAL Python 不抛出异常。启用异常模式:gdal.UseExceptions()(推荐在脚本开头调用)。
  2. NumPy 集成:band.ReadAsArray() 直接返回 NumPy 数组,band.WriteArray(array) 直接写入,是 Python 最大的便利之一。

Java 特有注意事项

  1. 本地库加载:必须确保 gdalalljni(Linux: libgdalalljni.so,Windows: gdalalljni.dll)在 java.library.path 中。
  2. Vector 参数:Java 绑定中许多方法使用 java.util.Vector<String> 传递选项参数。

C# 特有注意事项

  1. 平台运行时:需要根据目标平台引入对应的 NuGet 运行时包(Linux / Windows / macOS),否则本地库加载失败。
  2. 字符串编码:C# 绑定中字符串参数默认使用 UTF-8 编码,处理中文路径时注意编码一致性。

AI 使用建议

推荐工作流

  1. 语言选择:Python 优先(NumPy 集成、语法简洁),性能敏感用 C++,.NET 项目用 C#,Java 项目用 Java
  2. 驱动注册:任何 GDAL 操作前先调用注册函数(C++: GDALAllRegister(), Python 默认已注册)
  3. 探索数据:先 gdalinfo/ogrinfo 命令行查数据结构,再编写 API 代码
  4. 异常处理:Python 脚本开头加 gdal.UseExceptions() 启用异常模式
  5. 分块读写:大栅格使用 RasterIO 指定窗口,避免全量加载到内存

关键注意事项

  • 资源释放:C++ 用 GDALClose(),Python 赋值 None,Java 用 .delete(),C# 用 .Dispose()
  • 坐标轴顺序:GDAL 3.0+ 默认纬度在前,可用 SetAxisMappingStrategy 切换
  • Python NumPy 集成:ReadAsArray() 直接返回 NumPy 数组,是 Python 最大优势
  • CS 平台依赖:C# 需安装对应平台运行时包(Linux/Windows)
  • JA 本地库:Java 需确保 gdalalljni 在 java.library.path 中

各语言适用场景

场景PythonC++JavaC#
数据处理脚本★ 首选
生产级服务★ 首选★★
GIS 桌面插件★
.NET 企业应用★
Android GIS★
嵌入式系统★

相关技能

参考资源

Skills enregistrées