Windows 系统为 JDK 17 安装 GDAL

57 阅读4分钟

Windows 系统为 JDK 17 安装 GDAL

本文专为 Java 开发者设计,详细讲解如何在 Windows 系统中为 JDK 17 配置 GDAL 地理空间数据处理库

1. 什么是 GDAL?

GDAL(Geospatial Data Abstraction Library)是一个用于处理栅格和矢量地理空间数据的开源库。在 Java 开发中,GDAL 常用于:

  • 处理遥感影像
  • 读取/写入 Shapefile、GeoJSON 等地理数据格式
  • 地图投影转换
  • 空间数据分析

2. 环境准备

2.1 确认系统环境

  • 操作系统:Windows 10 或 Windows 11(64位)
  • Java 版本:JDK 17(64位)
  • 开发工具:建议使用 IntelliJ IDEA 或 Eclipse

2.2 检查 Java 环境

# 打开命令提示符(CMD)或 PowerShell,输入:
java -version
# 应该显示类似信息:
# java version "17.0.x"

3. 安装步骤

3.1 下载 GDAL 二进制文件

  1. 访问官方网站

    • 打开 GISInternals 下载页面
    • 这是最稳定的 Windows GDAL 预编译版本来源
  2. 选择合适的版本

    • 找到 "Stable releases" 部分
    • 选择与 JDK 17 兼容的版本(推荐 3.6.0 或更高版本)
    • 下载 MSVC 2019 版本(适用于大多数系统)
  3. 下载文件

    gdal-3.6.0-1931-x64-core.msi  (核心库)
    gdal-3.6.0-1931-x64-python.msi(Python绑定,可选)
    

3.2 安装 GDAL

  1. 运行安装程序

    • 双击 gdal-3.6.0-1931-x64-core.msi
    • 选择安装路径(建议:C:\Program Files\GDAL
    • 勾选 "Add GDAL to the system PATH"
  2. 验证安装

    # 打开新的命令提示符
    gdalinfo --version
    # 应该显示:GDAL 3.6.0, released ...
    

3.3 配置系统环境变量

  1. 添加 GDAL 路径

    • 右键点击"此电脑" → "属性" → "高级系统设置"
    • 点击"环境变量"
    • 在"系统变量"中找到 Path,点击编辑
    • 添加:C:\Program Files\GDAL
  2. 创建 GDAL 数据目录变量(可选但推荐):

    • 新建系统变量:
      • 变量名:GDAL_DATA
      • 变量值:C:\Program Files\GDAL\gdal-data

3.4 配置 Java 项目

方法一:使用 Maven(推荐)
  1. 在 pom.xml 中添加依赖
<dependencies>
    <!-- GDAL Java绑定 -->
    <dependency>
        <groupId>org.gdal</groupId>
        <artifactId>gdal</artifactId>
        <version>3.6.0</version>
    </dependency>
</dependencies>
  1. 配置 Maven 仓库(如果需要):
<repositories>
    <repository>
        <id>osgeo</id>
        <name>OSGeo Release Repository</name>
        <url>https://repo.osgeo.org/repository/release/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
方法二:手动添加 JAR 文件
  1. 下载 GDAL Java 绑定

    • 从相同网站下载:gdal-3.6.0-1931-x64-java.zip
    • 解压得到 gdal.jar
  2. 在项目中添加 JAR

    • IntelliJ IDEA:File → Project Structure → Libraries → "+"
    • Eclipse:右键项目 → Build Path → Configure Build Path → Add External JARs

3.5 配置 Java 运行时参数

在你的 Java 应用程序启动时,需要添加以下 VM 参数:

// 在启动脚本或 IDE 运行配置中添加:
-Djava.library.path="C:\Program Files\GDAL"

对于 IntelliJ IDEA

  1. Run → Edit Configurations
  2. 选择你的 Application
  3. 在 VM options 中添加:
    -Djava.library.path="C:\Program Files\GDAL"
    

4. 测试安装

创建测试文件 GdalTest.java

import org.gdal.gdal.Dataset;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;

public class GdalTest {
    public static void main(String[] args) {
        // 注册所有驱动
        gdal.AllRegister();
        
        // 设置GDAL数据路径(如果未设置环境变量)
        // gdal.SetConfigOption("GDAL_DATA", "C:\\Program Files\\GDAL\\gdal-data");
        
        System.out.println("GDAL版本: " + gdal.VersionInfo("RELEASE_NAME"));
        System.out.println("支持的格式数量: " + gdal.GetDriverCount());
        
        // 测试读取一个文件(需要将示例文件放在项目根目录)
        try {
            Dataset dataset = gdal.Open("test.tif", gdalconstConstants.GA_ReadOnly);
            if (dataset != null) {
                System.out.println("文件读取成功!");
                System.out.println("宽度: " + dataset.getRasterXSize());
                System.out.println("高度: " + dataset.getRasterYSize());
                System.out.println("波段数: " + dataset.getRasterCount());
                dataset.delete();
            } else {
                System.out.println("无法读取文件,但GDAL初始化成功!");
            }
        } catch (Exception e) {
            System.out.println("GDAL工作正常,但测试文件不存在");
        }
        
        // 列出所有支持的格式
        System.out.println("\n支持的格式列表:");
        for (int i = 0; i < gdal.GetDriverCount(); i++) {
            Driver driver = gdal.GetDriver(i);
            System.out.println(driver.getShortName() + ": " + driver.getLongName());
        }
        
        gdal.GDALDestroyDriverManager();
    }
}

5. 常见问题解决

问题1:java.lang.UnsatisfiedLinkError

Exception in thread "main" java.lang.UnsatisfiedLinkError: no gdalalljni in java.library.path

解决方案

  1. 确认 java.library.path 正确指向 GDAL 安装目录
  2. 确认系统 PATH 包含 GDAL 目录
  3. 重启 IDE 和终端

问题2:找不到依赖

Could not find artifact org.gdal:gdal:jar:3.6.0

解决方案

  1. 检查 Maven 仓库配置
  2. 或手动下载 JAR 文件:search.maven.org/artifact/or…

问题3:32位/64位不匹配

Can't load AMD 64-bit .dll on a IA 32-bit platform

解决方案

  1. 确认 JDK 是 64 位版本
  2. 确认 GDAL 是 64 位版本
  3. 重新下载匹配的版本

问题4:缺少依赖 DLL

The program can't start because ... dll is missing from your computer

解决方案

  1. 安装 Visual C++ Redistributable
  2. 重启计算机

6. 简单使用示例

import org.gdal.gdal.Dataset;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import org.gdal.gdal.Transformer;
import org.gdal.gdalconst.gdalconstConstants;
import org.gdal.osr.SpatialReference;

public class GdalExample {
    public static void main(String[] args) {
        // 初始化
        gdal.AllRegister();
        
        // 1. 读取栅格数据
        Dataset srcDs = gdal.Open("input.tif", gdalconstConstants.GA_ReadOnly);
        
        // 2. 获取基本信息
        System.out.println("文件格式: " + srcDs.GetDriver().getShortName());
        System.out.println("大小: " + srcDs.getRasterXSize() + "x" + srcDs.getRasterYSize());
        
        // 3. 读取投影信息
        String projection = srcDs.GetProjection();
        if (projection != null && !projection.isEmpty()) {
            SpatialReference srs = new SpatialReference(projection);
            System.out.println("投影: " + srs.GetAttrValue("PROJCS"));
        }
        
        // 4. 坐标转换示例
        double[] geoTransform = new double[6];
        srcDs.GetGeoTransform(geoTransform);
        
        // 像素坐标转地理坐标
        double x = 100, y = 100;
        double geoX = geoTransform[0] + x * geoTransform[1] + y * geoTransform[2];
        double geoY = geoTransform[3] + x * geoTransform[4] + y * geoTransform[5];
        
        System.out.printf("像素(100,100) -> 地理(%.2f, %.2f)\n", geoX, geoY);
        
        // 5. 释放资源
        srcDs.delete();
        gdal.GDALDestroyDriverManager();
    }
}

7. 进阶配置

7.1 使用 PROJ 数据

如果需要进行复杂的坐标转换:

  1. download.osgeo.org/proj/ 下载 PROJ 数据
  2. 解压到 C:\Program Files\GDAL\proj-data
  3. 设置环境变量:PROJ_LIB=C:\Program Files\GDAL\proj-data

7.2 配置日志

// 启用GDAL日志
gdal.SetConfigOption("CPL_DEBUG", "ON");
gdal.SetConfigOption("CPL_LOG_ERRORS", "ON");