跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

基于 Java 和 GeoTools 根据矢量 BBox 自动生成格网文件

基于 Java 和 GeoTools 根据矢量 BBox 自动生成格网文件。流程包括读取 Shp 文件提取坐标范围,创建要素类型定义几何与属性字段,通过循环生成经线和纬线要素集合,最后写入新的 Shapefile 文件。该方法适用于城市规划、资源管理等需要空间分析的场景,解决了手动转换效率低的问题。代码示例展示了如何计算 Bounds、构建 FeatureType、生成 LineString 以及持久化存储,并通过 QGIS 验证了结果的正确性。

氛围发布于 2026/3/21更新于 2026/7/2042 浏览
基于 Java 和 GeoTools 根据矢量 BBox 自动生成格网文件

一、基础数据介绍及生成方法简介

本节将对设计的基础数据和格网生成算法进行简单介绍,让大家在最开始的时候对实现过程有一个基本的思路。

1、矢量数据处理

这里我们需要对湖南省及其相邻地市的范围数据进行后端的格网生成。首先需要准备的是一份面状的基础数据。大家可以在 Qgis 中打开这份数据,如下图所示: 文章配图 为了能更清晰的展示各地市的基本信息,我们使用分类样式对当前的矢量数据进行分类标绘,这是可以清晰的看到各地市的空间分布情况。 文章配图

2、格网生成算法

本文中说明的根据矢量文件自动生成格网的算法流程表示如下: 文章配图 流程步骤说明如下:

  1. 使用 GeoTools 读取矢量数据。
  2. 提取矢量数据的边界框(BBox)。
  3. 创建要素集合。
  4. 生成经纬线格网(根据 BBox 计算格网大小与分辨率)。
  5. 写入到 Shp 矢量文件中。
  6. 文件写入。 以上就是格网生成的具体实现步骤。熟悉了生成的算法步骤之后,下面就一起来一步一步的进行实现上面的经纬网生成实现。

二、代码实现

本节将按照前面的流程步骤说明,进一步的完成经纬格网的数据自动生成。本段的内容包含具体的实例代码,可以作为重点参考部分。

1、根据 Shp 计算 Bounds

读取矢量数据并提取 BBox 的关键代码如下:

// 1. 读取源 SHP 文件
File sourceFile = new File("F:/vector_data/2021 年 7 月中国乡镇行政区划 shp-(乡镇信息有点旧)/2021 湖南省乡镇行政区划/湖南省/湖南省/湖南省_市界.shp");
ShapefileDataStore dataStore = new ShapefileDataStore(sourceFile.toURI().toURL());
ReferencedEnvelope bounds = dataStore.getFeatureSource().getBounds();
double minLon  bounds.getMinX();
   bounds.getMaxX();
   bounds.getMinY();
   bounds.getMaxY();
System.out.println(minLon);
System.out.println(maxLon);
System.out.println(minLat);
System.out.println(maxLat);
=
double
maxLon
=
double
minLat
=
double
maxLat
=

2、生成经纬网要素集合

在获取了矢量数据的 BBox 后,我们就可以根据 BBox 的最大最小值来生成对应的经纬线。因此这里就成了文章的核心,如何根据 bbox 来生成经纬线数据。由于最后我们需要生成一个完整标准的 shp 文件,因此我们首先就需要创建一个要素信息,创建要素类型的代码如下:

/** 创建要素类型 */
private static SimpleFeatureType createFeatureType() throws SchemaException {
    SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
    builder.setName("Graticule");
    builder.setCRS(WGS84);
    builder.add("geometry", LineString.class); // 几何字段
    builder.add("type", String.class); // 类型(经线/纬线)
    builder.add("degree", Double.class); // 度数
    return builder.buildFeatureType();
}

上面的代码就好像是在关系型数据库中,我们已经创建了一个表结构。里面包含了三个字段,第一个字段是空间属性数据,使用 geometry 来进行存储,除此之外还有两个属性字段,即类型(纬线还是经线),最后是一个标准的度数数据,这里采用的是默认的 WGS84 的地理坐标。有了表结构之后,接下来就是往表中写入数据。根据 bbox 来自动生成格网的关键代码如下:

/** 创建线要素 */
private static SimpleFeature createFeature(SimpleFeatureType type, LineString line, String typeStr, double degree) {
    SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(type);
    featureBuilder.set("geometry", line);
    featureBuilder.set("type", typeStr);
    featureBuilder.set("degree", degree);
    return featureBuilder.buildFeature(null);
}

/** 创建线段 */
private static LineString createLine(double x1, double y1, double x2, double y2) {
    org.locationtech.jts.geom.Coordinate[] coordinates = {
        new org.locationtech.jts.geom.Coordinate(x1, y1),
        new org.locationtech.jts.geom.Coordinate(x2, y2)
    };
    return JTSFactoryFinder.getGeometryFactory().createLineString(coordinates);
}

接下来是生成格网的核心算法,这里采用循环的方式,自动按照矢量的边界范围进行生成。示例代码如下:

/**
 * 生成经纬网要素集合
 * @param minLon 最小经度
 * @param maxLon 最大经度
 * @param minLat 最小纬度
 * @param maxLat 最大纬度
 * @param interval 间隔(度)
 */
private static SimpleFeatureCollection generateGraticule(double minLon, double maxLon, double minLat, double maxLat, double interval) throws SchemaException {
    // 创建要素类型
    SimpleFeatureType TYPE = createFeatureType();
    // 存储所有要素的集合
    List<SimpleFeature> features = new ArrayList<>();
    // 生成经线(固定经度,纬度从 minLat 到 maxLat)
    for (double lon = minLon; lon <= maxLon; lon += interval) {
        LineString line = createLine(lon, minLat, lon, maxLat);
        features.add(createFeature(TYPE, line, "LON", lon));
    }
    // 生成纬线(固定纬度,经度从 minLon 到 maxLon)
    for (double lat = minLat; lat <= maxLat; lat += interval) {
        LineString line = createLine(minLon, lat, maxLon, lat);
        features.add(createFeature(TYPE, line, "LAT", lat));
    }
    return new ListFeatureCollection(TYPE, features);
}

3、写入 Shapefile

这里我们将 shp 文件准备完成之后,接下来就是最重要的一步,即往 shp 文件中写入要素信息,这样就实现了生成的格网 shapefile 的落盘处理。写出 shapefile 的实现比较简单,示例代码如下:

private static void writeToShapefile(SimpleFeatureCollection features, File file) throws IOException {
    // 方法 1:直接使用 ShapefileDataStoreFactory
    ShapefileDataStore dataStore = new ShapefileDataStore(file.toURI().toURL());
    dataStore.createSchema(features.getSchema());
    // 写入数据
    try (FeatureWriter<SimpleFeatureType, SimpleFeature> writer = dataStore.getFeatureWriterAppend(null)) {
        SimpleFeatureIterator iterator = features.features();
        while (iterator.hasNext()) {
            SimpleFeature feature = iterator.next();
            SimpleFeature newFeature = writer.next();
            newFeature.setAttributes(feature.getAttributes());
            writer.write();
        }
        iterator.close();
    }
    dataStore.dispose();
}

在需要调用的逻辑如下,需要定义一个本地保存的矢量文件。

// 3、写入 Shapefile
// 定义输出路径
File shapefile = new File("D:/shp_test/graticule250508.shp");
writeToShapefile(features, shapefile);
System.out.println("完成!!!");

三、结果输出与验证

本节将对经过前面的步骤生成的格网成果进行输出和验证。

1、格网文件输出格式

经过前面的步骤在目标磁盘可以看到已经成功的生成我们需要的 shp 文件,打开磁盘目录如下图所示: 文章配图 表名需要的文件已经成功的生成到我们的目标磁盘中。

2、GIS 工具验证

将生成 shp 文件使用 QGIS 这样的 GIS 软件中进行查看,可以看到以下的效果: 文章配图 为了验证当前生成的经纬网线数据是否是符合目标的文件 bbox 范围的,我们再叠加原始的数据图层来校验一下。 文章配图 可以看到生成的格网数据是完全按照我们的预期来生成,需求得到了满足。

四、总结

以上就是本文的主要内容,本实践旨在探索利用 Java 和 GeoTools 的强大功能,构建一个高效、准确的矢量文件转格网文件的系统。从矢量文件的读取与解析开始,深入研究如何根据矢量数据的空间分布和属性特征,自动划分格网并生成相应的格网文件。在实践过程中,我们将面临诸多挑战,如矢量数据的复杂性、格网划分的精度控制、数据转换的效率提升等,需要通过不断尝试和优化算法来解决。本文将详细阐述基于 Java 和 GeoTools 进行矢量文件转格网文件实践的过程、方法和技术细节,包括环境搭建、矢量数据处理、格网生成算法设计以及结果验证等方面。希望本实践研究能够为地理空间数据处理领域提供一种新的方法和思路,提高矢量文件转格网文件的效率和质量,为相关领域的研究和应用提供有力的支持和参考。当然在生成的结果中可以看到,还是存在一些不足,即我们生成的格网的末端不是很平滑,因此在未来我们可以优化以下末端的处理。同时对于经纬线的标注可以将值进行格式化一下,这样看起来会更加符合人类的习惯。

目录

  1. 一、基础数据介绍及生成方法简介
  2. 1、矢量数据处理
  3. 2、格网生成算法
  4. 二、代码实现
  5. 1、根据 Shp 计算 Bounds
  6. 2、生成经纬网要素集合
  7. 3、写入 Shapefile
  8. 三、结果输出与验证
  9. 1、格网文件输出格式
  10. 2、GIS 工具验证
  11. 四、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Double DQN 算法详解:原理、流程与 PyTorch 实现
  • 前端开发中常见的加密与编码方案解析
  • ChatGPT 结构化 Prompt 的高级应用
  • AI 在前端开发中的应用场景与实践
  • Llama Factory 实战:快速切换 Alpaca 与 Vicuna 对话模板
  • 前后端接口 404/405/500 状态码排查与解决指南
  • Leaflet 结合 SpringBoot 实现地图点击获取当地时间
  • HarmonyOS 5.0 星闪技术构建智能家居边缘计算网关
  • C++ 模板基础:函数与类模板
  • C++ 基础:链表、缓冲区与指针概念
  • SpringBoot + jQuery 实战:从零搭建留言板
  • 无人机视角山区泥石流和滑坡图像识别数据集
  • OpenClaw Mac 安装指南
  • Stable Diffusion WebUI 模型推荐与文件夹详解
  • OpenClaw:自托管无代码 AI Agent 框架技术剖析
  • ADI SHARC C/C++ 编译器指令优化
  • 前端技术趋势:React 18 并发模式与 Server Components
  • FastGPT 结合 MCP 协议构建工具增强型 AI Agent
  • C++11 详解:列表初始化与右值引用移动语义
  • HTML Popover API:原生浮层交互的零 JS 解决方案

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online