第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安装:

  1. 下载GDAL安装包(推荐OSGeo4W)
  2. 设置环境变量:
    GDAL_HOME=C:\OSGeo4W\bin
    PATH=%PATH%;%GDAL_HOME%
    
  3. 验证安装:
    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配置

  1. 导入项目

    • File → Open → 选择pom.xml
    • 作为Maven项目打开
  2. 配置JDK

    • File → Project Structure → Project
    • 设置SDK为Java 17
  3. 启用Lombok

    • File → Settings → Plugins
    • 搜索并安装"Lombok"插件
    • 启用注解处理:Settings → Build → Compiler → Annotation Processors
  4. 配置编码

    • File → Settings → Editor → File Encodings
    • 设置为UTF-8

2.3.2 Eclipse配置

  1. 导入项目

    • File → Import → Maven → Existing Maven Projects
  2. 配置JDK

    • Window → Preferences → Java → Installed JREs
    • 添加JDK 17
  3. 安装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相关错误

解决方案

  1. 确保安装了Lombok插件
  2. 启用注解处理器(Annotation Processing)
  3. 重新导入Maven项目

2.5.3 GDAL加载失败

问题:使用GDAL引擎时报错"gdal library not found"

解决方案

  1. 确认GDAL已正确安装
  2. 检查环境变量配置
  3. 确保Java能找到GDAL本地库
  4. 在Windows上,可能需要将GDAL的bin目录添加到PATH

2.5.4 中文乱码

问题:读取Shapefile时中文属性乱码

解决方案

  1. 确保DBF文件编码正确
  2. OGU4J会自动检测编码
  3. 如仍有问题,检查cpg文件

2.5.5 坐标系识别失败

问题:读取数据时WKID为null

解决方案

  1. 检查prj文件是否存在
  2. 确认prj文件内容正确
  3. 使用CrsUtil手动设置坐标系

2.6 下一步

环境配置完成后,建议按以下顺序学习:

  1. 第03章 - 核心架构解析 - 理解OGU4J的内部结构
  2. 第04章 - 统一图层模型详解 - 掌握核心数据模型
  3. 第06章 - 数据格式转换实战 - 实践数据转换

← 上一章:框架概述与设计理念 | 下一章:核心架构解析 →

posted @ 2025-12-02 10:30  我才是银古  阅读(10)  评论(0)    收藏  举报