需求:上傳 ZIP 壓縮的 Shapefile 資料集,後端解壓、讀取 SHP、轉換為 GeoJSON 返回前端,配合 ArcGIS API for JavaScript 顯示。本文記錄 Java 環境配置 GDAL(含 32/64 位匹配、DLL 載入、JAR 引用)與核心轉換代碼。
UnsatisfiedLinkError。.dll 複製到 $JAVA_HOME/jre/bin/(或系統 PATH 目錄)。gdal.jar 加入專案 Classpath(Maven 可用 system scope 或本地安裝)。package com.lzugis.gdal;
import org.gdal.ogr.*;
import org.gdal.gdal.*;
public class GdalShpTest {
public static void main(String[] args) {
// 1. 註冊所有驅動
ogr.RegisterAll();
// 2. 支援中文路徑
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
// 3. 支援屬性表中文字段
gdal.SetConfigOption("SHAPE_ENCODING", "");
String shpPath = "D:\\data\\china\\capital.shp";
// 4. 開啟資料源 (0=只讀)
DataSource ds = ogr.Open(shpPath, 0);
if (ds == null) {
System.err.println("開啟 SHP 失敗!");
return;
}
System.out.println("開啟 SHP 成功!");
// 5. 取得 GeoJSON 驅動
Driver geoJsonDriver = ogr.GetDriverByName("GeoJSON");
if (geoJsonDriver == null) {
System.err.println("GeoJSON 驅動不可用!");
return;
}
// 6. 複製/轉換資料源
geoJsonDriver.CopyDataSource(ds, "D:\\data\\china\\capital.geojson");
System.out.println("轉換 GeoJSON 成功!");
}
}
開啟 SHP 成功! GeoJSON 驅動成功! 轉換成功!
生成的 capital.geojson 可直接用於 Leaflet、OpenLayers、ArcGIS JS API 等前端地圖庫。
no gdaljni in java.library.path:DLL 未放正確目錄或位數不匹配。GDAL_FILENAME_IS_UTF8=YES。SHAPE_ENCODING="" 讓 GDAL 自動偵測(或指定 CP936/UTF-8)。ds.GetLayerCount() 逐圖層轉換。<dependency> <groupId>org.gdal</groupId> <artifactId>gdal</artifactId> <version>3.4.1</version> </dependency>
注意:官方 Maven 發布的 gdal.jar 通常包含原生庫,可能仍需手動配置 java.library.path。