第02章 - 快速入门与环境配置
第02章 - 快速入门与环境配置
2.1 环境要求
2.1.1 Java版本
OGU4J要求 Java 17 或更高版本。推荐使用以下JDK发行版:
- Oracle JDK 17+
- OpenJDK 17+
- Amazon Corretto 17+
- Azul Zulu 17+
检查Java版本:
java -version
期望输出:
openjdk version "17.0.x" ...
2.1.2 构建工具
OGU4J使用Maven作为构建工具。请确保已安装Maven 3.6+:
mvn -version
期望输出:
Apache Maven 3.6.x+
2.1.3 GDAL环境(可选)
如果需要使用GDAL引擎或处理FileGDB格式,需要安装GDAL:
Windows安装:
- 下载GDAL安装包(推荐OSGeo4W)
- 设置环境变量:
GDAL_HOME=C:\OSGeo4W\bin PATH=%PATH%;%GDAL_HOME% - 验证安装:
gdalinfo --version
Linux安装:
# Ubuntu/Debian
sudo apt-get install gdal-bin libgdal-dev python3-gdal
# CentOS/RHEL
sudo yum install gdal gdal-devel
# 验证安装
gdalinfo --version
macOS安装:
brew install gdal
# 验证安装
gdalinfo --version
2.2 Maven项目配置
2.2.1 添加仓库
OGU4J依赖GeoTools,需要添加OSGeo仓库:
<repositories>
<repository>
<id>osgeo</id>
<name>OSGeo Release Repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
2.2.2 添加依赖
在pom.xml中添加OGU4J依赖:
<dependency>
<groupId>com.znlgis.ogu4j</groupId>
<artifactId>ogu4j</artifactId>
<version>1.0.0</version>
</dependency>
2.2.3 完整的pom.xml示例
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>ogu4j-demo</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>osgeo</id>
<name>OSGeo Release Repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.znlgis.ogu4j</groupId>
<artifactId>ogu4j</artifactId>
<version>1.0.0</version>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.3 IDE配置
2.3.1 IntelliJ IDEA配置
-
导入项目
- File → Open → 选择pom.xml
- 作为Maven项目打开
-
配置JDK
- File → Project Structure → Project
- 设置SDK为Java 17
-
启用Lombok
- File → Settings → Plugins
- 搜索并安装"Lombok"插件
- 启用注解处理:Settings → Build → Compiler → Annotation Processors
-
配置编码
- File → Settings → Editor → File Encodings
- 设置为UTF-8
2.3.2 Eclipse配置
-
导入项目
- File → Import → Maven → Existing Maven Projects
-
配置JDK
- Window → Preferences → Java → Installed JREs
- 添加JDK 17
-
安装Lombok
- 下载lombok.jar
- 运行
java -jar lombok.jar进行安装
2.4 第一个程序
2.4.1 Hello OGU4J
创建第一个OGU4J程序,体验基本的图层操作:
package com.example;
import com.znlgis.ogu4j.engine.model.layer.OguLayer;
import com.znlgis.ogu4j.engine.model.layer.OguFeature;
import com.znlgis.ogu4j.engine.model.layer.OguField;
import com.znlgis.ogu4j.engine.enums.GeometryType;
import com.znlgis.ogu4j.engine.enums.FieldDataType;
import java.util.ArrayList;
import java.util.List;
public class HelloOgu4j {
public static void main(String[] args) {
// 1. 创建图层
OguLayer layer = new OguLayer();
layer.setName("示例图层");
layer.setWkid(4490); // CGCS2000地理坐标系
layer.setGeometryType(GeometryType.POLYGON);
// 2. 定义字段
List<OguField> fields = new ArrayList<>();
OguField nameField = new OguField();
nameField.setName("NAME");
nameField.setAlias("名称");
nameField.setDataType(FieldDataType.STRING);
nameField.setLength(50);
fields.add(nameField);
OguField areaField = new OguField();
areaField.setName("AREA");
areaField.setAlias("面积");
areaField.setDataType(FieldDataType.DOUBLE);
fields.add(areaField);
layer.setFields(fields);
// 3. 添加要素
List<OguFeature> features = new ArrayList<>();
OguFeature feature = new OguFeature();
feature.setFid("1");
feature.setWkt("POLYGON((116.4 39.9, 116.4 40.0, 116.5 40.0, 116.5 39.9, 116.4 39.9))");
feature.setValue("NAME", "北京");
feature.setValue("AREA", 16410.54);
features.add(feature);
layer.setFeatures(features);
// 4. 验证图层
layer.validate();
// 5. 输出信息
System.out.println("图层名称: " + layer.getName());
System.out.println("坐标系: WKID " + layer.getWkid());
System.out.println("几何类型: " + layer.getGeometryType());
System.out.println("要素数量: " + layer.getFeatureCount());
// 6. 转换为JSON
String json = layer.toJSON();
System.out.println("\nJSON输出:");
System.out.println(json);
}
}
运行输出:
图层名称: 示例图层
坐标系: WKID 4490
几何类型: POLYGON
要素数量: 1
JSON输出:
{"name":"示例图层","wkid":4490,"geometryType":"POLYGON",...}
2.4.2 读取Shapefile
package com.example;
import com.znlgis.ogu4j.datasource.OguLayerUtil;
import com.znlgis.ogu4j.engine.model.layer.OguLayer;
import com.znlgis.ogu4j.engine.model.layer.OguFeature;
import com.znlgis.ogu4j.engine.enums.DataFormatType;
import com.znlgis.ogu4j.engine.enums.GisEngineType;
public class ReadShapefile {
public static void main(String[] args) {
String shpPath = "D:/data/cities.shp";
try {
// 读取Shapefile
OguLayer layer = OguLayerUtil.readLayer(
DataFormatType.SHP,
shpPath,
null, // 图层名(Shapefile可为null)
null, // 属性过滤(CQL表达式)
null, // 空间过滤(WKT)
GisEngineType.GEOTOOLS
);
// 输出图层信息
System.out.println("=== 图层信息 ===");
System.out.println("名称: " + layer.getName());
System.out.println("坐标系: " + layer.getWkid());
System.out.println("几何类型: " + layer.getGeometryType());
System.out.println("字段数量: " + layer.getFields().size());
System.out.println("要素数量: " + layer.getFeatureCount());
// 输出字段信息
System.out.println("\n=== 字段信息 ===");
layer.getFields().forEach(field -> {
System.out.printf("%s (%s) - %s%n",
field.getName(),
field.getDataType(),
field.getAlias());
});
// 输出前5个要素
System.out.println("\n=== 要素信息(前5个) ===");
int count = 0;
for (OguFeature feature : layer.getFeatures()) {
if (count++ >= 5) break;
System.out.printf("FID: %s, 几何类型: %s%n",
feature.getFid(),
feature.getWkt().substring(0,
Math.min(30, feature.getWkt().length())) + "...");
}
} catch (Exception e) {
System.err.println("读取Shapefile失败: " + e.getMessage());
e.printStackTrace();
}
}
}
2.4.3 格式转换
package com.example;
import com.znlgis.ogu4j.datasource.OguLayerUtil;
import com.znlgis.ogu4j.engine.model.layer.OguLayer;
import com.znlgis.ogu4j.engine.enums.DataFormatType;
import com.znlgis.ogu4j.engine.enums.GisEngineType;
public class FormatConversion {
public static void main(String[] args) {
String inputShp = "D:/data/cities.shp";
String outputGeoJson = "D:/data/cities.geojson";
try {
// 1. 读取Shapefile
System.out.println("正在读取Shapefile...");
OguLayer layer = OguLayerUtil.readLayer(
DataFormatType.SHP,
inputShp,
null, null, null,
GisEngineType.GEOTOOLS
);
System.out.println("读取完成,要素数量: " + layer.getFeatureCount());
// 2. 保存为GeoJSON
System.out.println("正在保存为GeoJSON...");
OguLayerUtil.writeLayer(
DataFormatType.GEOJSON,
layer,
outputGeoJson,
null, null,
GisEngineType.GEOTOOLS
);
System.out.println("保存完成: " + outputGeoJson);
} catch (Exception e) {
System.err.println("格式转换失败: " + e.getMessage());
e.printStackTrace();
}
}
}
2.4.4 几何操作
package com.example;
import com.znlgis.ogu4j.geometry.GeometryUtil;
import org.locationtech.jts.geom.Geometry;
public class GeometryOperations {
public static void main(String[] args) {
// 定义两个多边形
String wktA = "POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))";
String wktB = "POLYGON((5 5, 5 15, 15 15, 15 5, 5 5))";
// 转换为Geometry对象
Geometry geomA = GeometryUtil.wkt2Geometry(wktA);
Geometry geomB = GeometryUtil.wkt2Geometry(wktB);
// 空间关系判断
System.out.println("=== 空间关系 ===");
System.out.println("相交(intersects): " + GeometryUtil.intersects(geomA, geomB));
System.out.println("包含(contains): " + GeometryUtil.contains(geomA, geomB));
System.out.println("重叠(overlaps): " + GeometryUtil.overlaps(geomA, geomB));
// 空间分析
System.out.println("\n=== 空间分析 ===");
Geometry intersection = GeometryUtil.intersection(geomA, geomB);
System.out.println("交集: " + GeometryUtil.geometry2Wkt(intersection));
Geometry union = GeometryUtil.union(geomA, geomB);
System.out.println("并集: " + GeometryUtil.geometry2Wkt(union));
Geometry buffer = GeometryUtil.buffer(geomA, 2.0);
System.out.println("缓冲区(2.0): " + GeometryUtil.geometry2Wkt(buffer));
// 几何属性
System.out.println("\n=== 几何属性 ===");
System.out.println("面积A: " + GeometryUtil.area(geomA));
System.out.println("面积B: " + GeometryUtil.area(geomB));
System.out.println("交集面积: " + GeometryUtil.area(intersection));
}
}
运行输出:
=== 空间关系 ===
相交(intersects): true
包含(contains): false
重叠(overlaps): true
=== 空间分析 ===
交集: POLYGON ((5 5, 5 10, 10 10, 10 5, 5 5))
并集: POLYGON ((0 0, 0 10, 5 10, 5 15, 15 15, 15 5, 10 5, 10 0, 0 0))
缓冲区(2.0): POLYGON (...)
=== 几何属性 ===
面积A: 100.0
面积B: 100.0
交集面积: 25.0
2.5 常见问题
2.5.1 依赖下载慢
问题:Maven下载GeoTools依赖很慢
解决方案:配置阿里云Maven镜像
<!-- 在settings.xml中添加 -->
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
2.5.2 Lombok编译错误
问题:IDE报Lombok相关错误
解决方案:
- 确保安装了Lombok插件
- 启用注解处理器(Annotation Processing)
- 重新导入Maven项目
2.5.3 GDAL加载失败
问题:使用GDAL引擎时报错"gdal library not found"
解决方案:
- 确认GDAL已正确安装
- 检查环境变量配置
- 确保Java能找到GDAL本地库
- 在Windows上,可能需要将GDAL的bin目录添加到PATH
2.5.4 中文乱码
问题:读取Shapefile时中文属性乱码
解决方案:
- 确保DBF文件编码正确
- OGU4J会自动检测编码
- 如仍有问题,检查cpg文件
2.5.5 坐标系识别失败
问题:读取数据时WKID为null
解决方案:
- 检查prj文件是否存在
- 确认prj文件内容正确
- 使用CrsUtil手动设置坐标系
2.6 下一步
环境配置完成后,建议按以下顺序学习:
- 第03章 - 核心架构解析 - 理解OGU4J的内部结构
- 第04章 - 统一图层模型详解 - 掌握核心数据模型
- 第06章 - 数据格式转换实战 - 实践数据转换

浙公网安备 33010602011771号