当前位置: 首页 > news >正文

基于GeoTools的GIS专题图自适应边界及高宽等比例生成实践

目录

前言

一、原来的生成方案问题

1、无法自动读取数据的Bounds

2、专题图高宽比例不协调

二、专题图生成优化

1、直接读取矢量数据的Bounds

2、专题图成果抗锯齿

3、专题成果高宽比例自动调节

三、总结


前言

        在当今数字化浪潮中,地理信息系统(GIS)的应用场景日益丰富,从城市规划到环境监测,从交通运输到资源管理,GIS 技术为各领域提供了强大的空间数据分析与可视化支持。而专题图作为 GIS 表达的重要形式,其生成质量直接影响着信息传达的准确性和直观性。以下图为例,要求绘制与湖南省相邻的其它市级行政区划的专题图:

        传统的 GIS 专题图制作往往面临着诸多挑战。一方面,地图边界固定,当面对不同尺度或范围的数据时,要么出现数据超出边界的情况,要么导致画面留白过多,严重影响视觉效果与信息呈现完整性。另一方面,高宽比例的把控难度较大,不同数据集或应用场景下,要确保地图在各种尺寸的屏幕和页面布局中保持协调的比例展示,避免图形拉伸或压缩变形,这需要耗费大量的时间和精力进行手动调整,极大地降低了工作效率,也难以满足批量生产与动态更新的需求。

        GeoTools 作为一款功能强大的开源 GIS 工具库,为解决上述问题提供了丰富的 API 和灵活的开发框架。利用 GeoTools,开发者能够深入底层数据处理与图形渲染流程,实现对专题图生成过程的精细化管控。通过自定义投影变换、数据裁剪算法以及图形布局策略,可以轻松应对各种复杂场景,让专题图自动适应不同边界,并始终保持高宽等比例的精准呈现。

        本文将深入探讨基于 GeoTools 实现 GIS 专题图自适应边界及高宽等比例生成的实践方法。从 GeoTools 的环境搭建与核心模块介绍入手,详细讲解如何利用其数据访问、样式定义和渲染引擎等功能,结合实际案例代码演示,逐步剖析实现自动适应边界和等比例生成的关键技术要点与优化技巧。同时,还会分享在实际项目应用中的经验教训,以及如何根据业务需求进行扩展定制,旨在为广大 GIS 开发者提供一份实用、高效的解决方案参考资料,助力提升 GIS 专题图制作的自动化水平与质量,使其能够更好地服务于各行业的空间信息分析与决策支持工作。

一、原来的生成方案问题

        在之前的博客中曾经介绍过,如何使用Geotools来生成shapefile的缩略图,原文地址:基于Java和GeoTools的Shapefile矢量数据缩略图生成实践,虽然实现了基本的功能。可以使用Geotools来渲染SLD样式,并且生成本地的缩略图。但是也还是存在一些点没有优化,比如以下两点。第一是没有实现自动的从待生成的Shapefile数据中获取数据的Bounds边界,而是使用Qgis软件来进行手动设置的模式。第二个是对于生成的专题图结果,专题图的高度和宽度比例跟shapefile的原始尺寸没有很好的兼容,从实际效果上来看,就是比较不协调,很生硬。下面将对这两点来进行深入说明。

1、无法自动读取数据的Bounds

        为了让第一次看到博客的朋友也有一个简单的认识,这里我将原来生成图片的关键方法贴出来公共大家参考:

public static void createUSA() {long start = System.currentTimeMillis();Shp2Image shp2img = new Shp2Image();shp2img.setMap(new MapContent());String shpPath = "F:/xxx/maps/countries.shp";String sldPath = "F:/xxx/maps/countries1.1.0-2.sld";String imgPath = "D:/countries0228-美国.png";Map<String, Object> paras = new HashMap<String, Object>();double[] bbox_usa = new double[] { -145.40999, 9.93976, -65.062300,81.12722 };paras.put("bbox", bbox_usa);paras.put("width", 1020);paras.put("height", 800);shp2img.addShapeLayer(shpPath, sldPath);shp2img.getMapContent(paras, imgPath);System.out.println("生成完成,共耗时" + (System.currentTimeMillis() - start) + "ms");
}

        在以上的代码中就包含了两个关键的信息。第一个就是bbox_usa,这表示漂亮国的Bbox值,也就是Bounds边界信息。 关于Bounds,可以使用Qgis或者Arcgis等软件进行获取,以Qgis为例,当我们打开一份shapefile矢量数据之后,右键属性可以看到数据的Bounds值,如下图所示:

        这里的范围值就是我们需要的目标值,将上述值复制到代码中的bbox_usa数组中即可。如果是处理单张缩略图生成,使用qgis等辅助软件来帮助提取固然没有问题,如果需要批量作业,这么大量的人工干预无疑降低了工作效率。

2、专题图高宽比例不协调

        关于专题图的高度和宽度比例不协调的原因其实跟边界范围差不多,但是又存在一定的差异即边界值使用qgis获取的值是非常固定的,但是生成的专题图的高度和宽度是我们通过硬编码的方式指定的,因此具体的比例与原始的数据无法实现对应,从而导致将数据渲染到图片后,整体效果是失真的,即比例非常不协调,比如在指定宽度和高度为:1068*749的设置下,湖南省的乡镇区划专题图效果如下:

        通过上图可以看到,通过预设的高度和宽度不能很好的进行专题图渲染。这也是第二个需要解决的问题。 

二、专题图生成优化

        那么如何优化专题图的生成,让专题图做的更加美观,符合我们的业务需要呢?主要的优化方向也是包含一下三点。第一个是为了提高效率,需要使用Geotools来自动读取矢量文件的边界,以此来达到自动计算范围的目的。第二个是为了在地图放大时也能保持一定的清晰度,因此在生成PNG图片时需要抗锯齿,以此满足图片的方法需求。第三是可以根据自动读取的边界范围自动进行高度和宽度的比例自适应调整。本节将主要介绍这三点优化内容。

1、直接读取矢量数据的Bounds

        在GeoTools中,要想实现自动读取Shapefile的地图边界数据,可以通过以下两种形式获取,第一个是通过Layer对象,第二个是从mapContent对象的视图对象中获取。首先来介绍如何从Layer图层对象获取,关键代码如下:

Layer layer = new FeatureLayer(featureSource, style);
this.map.addLayer(layer);
//这里这是范围
this.setEnvelope(layer.getBounds());

        第二种是可以通过mapContent对象来获取,关键代码如下:

renderer.setMapContent(map);
// 从MapContent中获取地图边界范围
ReferencedEnvelope bounds = map.getViewport().getBounds();

        以上者两种方法都是可以的,大家可以根据实际情况使用。 

2、专题图成果抗锯齿

        针对专题图生成后,如果有图片放大的需求,在放大的时候就会失真,这时候就需要进行抗锯齿的设置。这要求在进行专题图的图片渲染输出时,设置图片渲染的参数,以此来进行图片的抗锯齿效果,实现关键代码如下:

/**
* 设置抗锯齿以及其他相关渲染提示。
* @param g2d 绘制目标的 {@link Graphics2D} 上下文。
*/
private static void setAntiAliasing(Graphics2D g2d,int width,int height) {g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));g2d.setColor(Color.WHITE);g2d.fillRect(0, 0, width,height);// 启用抗锯齿g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
}

3、专题成果高宽比例自动调节

        要想实现专题成果图的尺寸比例自动调节,最关键的操作是需要知道本身数据的高宽比,通过固定的高宽比来求解实际生成图片的高宽,这样设置的效果应该是比较符合实际需要的专题图的。所以问题的关键就是自动计算高宽比,而矢量文件的高宽我们可以通过bounds来获取。因此高宽比可以通过bounds的高度和宽度的计算得到。

// 输出图像大小(例如:宽度x高度)
int width = 1920; // 可根据需求调整
// 计算地理宽高比
double aspectRatio = bounds.getWidth() / bounds.getHeight();
//根据比例计算新高度
int height = (int) Math.round(width / aspectRatio);

        上面代码中的1920只是一个示意,实际情况可以设置成一个范围值,固定了宽度后,可以根据宽高比自动计算另一个参数,在得到Height后,再进行画布的渲染和出图。关键代码如下:

// 创建一个缓冲区用于接收渲染的结果
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE);
Graphics2D gr = image.createGraphics();
// 设置渲染提示以提高质量和减少锯齿
setAntiAliasing(gr,width,height);

        最终可以得到一张比较符合我们业务需要的专题图,如下图所示,可以看到,专题图的边界范围是自动获取、图片放大后锯齿感比较小,经过计算高宽比之后的图片尺寸,看起来也比较协调:

三、总结

        以上就是本文的主要内容,本文将深入探讨基于 GeoTools 实现 GIS 专题图自适应边界及高宽等比例生成的实践方法。从 GeoTools 的环境搭建与核心模块介绍入手,详细讲解如何利用其数据访问、样式定义和渲染引擎等功能,结合实际案例代码演示,逐步剖析实现自动适应边界和等比例生成的关键技术要点与优化技巧。同时,还会分享在实际项目应用中的经验教训,以及如何根据业务需求进行扩展定制,旨在为广大 GIS 开发者提供一份实用、高效的解决方案参考资料,助力提升 GIS 专题图制作的自动化水平与质量,使其能够更好地服务于各行业的空间信息分析与决策支持工作。行文仓促,定有不当之处,恳请各位专家学者博友在评论区留下宝贵的意见,万分感激。

相关文章:

基于GeoTools的GIS专题图自适应边界及高宽等比例生成实践

目录 前言 一、原来的生成方案问题 1、无法自动读取数据的Bounds 2、专题图高宽比例不协调 二、专题图生成优化 1、直接读取矢量数据的Bounds 2、专题图成果抗锯齿 3、专题成果高宽比例自动调节 三、总结 前言 在当今数字化浪潮中&#xff0c;地理信息系统&#xff08;…...

各种DCC软件使用Datasmith导入UE教程

3Dmax: 先安装插件 https://www.unrealengine.com/zh-CN/datasmith/plugins 左上角导出即可 虚幻中勾选3个插件,重启引擎 左上角选择文件导入即可 Blender导入Datasmith进UE 需要两个插件, 文章最下方链接进去下载安装即可 一样的,直接导出,然后UE导入即可 C4D 直接保存成…...

尚硅谷爬虫note15

一、当当网 1. 保存数据 数据交给pipelines保存 items中的类名&#xff1a; DemoNddwItem class DemoNddwItem(scrapy.Item): 变量名 类名&#xff08;&#xff09; book DemoNddwItem(src src, name name, price price)导入&#xff1a; from 项目名.items import 类…...

云原生系列之本地k8s环境搭建

前置条件 Windows 11 家庭中文版&#xff0c;版本号 23H2 云原生环境搭建 操作系统启用wsl(windows subsystem for linux) 开启wsl功能&#xff0c;如下图 安装并开启github加速器 FastGithub 2.1 下载地址&#xff1a;点击下载 2.2 解压安装文件fastgithub_win-x64.zip 2…...

关于tomcat使用中浏览器打开index.jsp后中文显示不正常是乱码,但英文正常的问题

如果是jsp文件就在首行加 “<% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %>” 如果是html文件 在head标签加入&#xff1a; <meta charset"UTF-8"> 以jsp为例子&#xff0c;我们…...

mysql foreign_key_checks

‌foreign_key_checks‌是一个用于设置是否在DML/DDL操作中检查外键约束的系统变量。该变量默认启用&#xff0c;通常在正常操作期间启用以强制执行参照完整性。 功能描述 foreign_key_checks用于控制是否在DML&#xff08;数据操纵语言&#xff09;和DDL&#xff08;数据定义…...

开发环境搭建-06.后端环境搭建-前后端联调-Nginx反向代理和负载均衡概念

一.前后端联调 我们首先来思考一个问题 前端的请求地址是&#xff1a;http://localhost/api/employee/login 后端的接口地址是&#xff1a;http://localhost:8080/admin/employee/login 明明请求地址和接口地址不同&#xff0c;那么前端是如何请求到后端接口所响应回来的数…...

REST API前端请求和后端接收

1、get请求&#xff0c;带"?" http://localhost:8080/api/aop/getResult?param123 GetMapping("getResult")public ResponseEntity<String> getResult(RequestParam("param") String param){return new ResponseEntity<>("12…...

道可云人工智能每日资讯|《奇遇三星堆》VR沉浸探索展(淮安站)开展

道可云元宇宙每日简报&#xff08;2025年3月5日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 《奇遇三星堆》VR沉浸探索展&#xff08;淮安站&#xff09;开展 近日&#xff0c;《奇遇三星堆》VR沉浸探索展&#xff08;淮安站&#xff09;开展。该展将三星堆文…...

服务器数据恢复—raid5阵列中硬盘掉线导致上层应用不可用的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某公司一台服务器&#xff0c;服务器上有一组由8块硬盘组建的raid5磁盘阵列。 磁盘阵列中2块硬盘的指示灯显示异常&#xff0c;其他硬盘指示灯显示正常。上层应用不可用。 服务器数据恢复过程&#xff1a; 1、将服务器中所有硬盘编号…...

【Pandas】pandas Series swaplevel

Pandas2.2 Series Computations descriptive stats 方法描述Series.argsort([axis, kind, order, stable])用于返回 Series 中元素排序后的索引位置的方法Series.argmin([axis, skipna])用于返回 Series 中最小值索引位置的方法Series.argmax([axis, skipna])用于返回 Series…...

esp32s3聊天机器人(二)

继续上文&#xff0c;硬件软件准备齐全&#xff0c;介绍一下主要用到的库 sherpa-onnx 开源的&#xff0c;语音转文本、文本转语音、说话人分类和 VAD&#xff0c;关键是支持C#开发 OllamaSharp 用于连接ollama&#xff0c;如其名C#开发 虽然离可玩还有一段距离&#xff0…...

pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码

PySide6的QtCharts类支持绘制各种型状的图表&#xff0c;如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等&#xff0c;下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果&#xff0c;实际使用时参照代码中示例数据的格式将实际数据替换即可…...

DVI分配器2进4出,2进8出,2进16出,120HZ

DVI&#xff08;Digital Visual Interface&#xff09;分配器GEFFEN/HDD系列是一种设备&#xff0c;它能够将一个DVI信号源的内容复制到多个显示设备上。根据您提供的信息&#xff0c;这里我们关注的是具有2个输入端口和多个&#xff08;4个、8个或16个&#xff09;输出端口的D…...

迷你世界脚本文字板接口:Graphics

文字板接口&#xff1a;Graphics 彼得兔 更新时间: 2024-08-27 11:12:18 具体函数名及描述如下: 序号 函数名 函数描述 1 makeGraphicsText(...) 创建文字板信息 2 makeflotageText(...) 创建漂浮文字信息 3 makeGraphicsProgress(...) 创建进度条信息…...

5分钟速览深度学习经典论文 —— attention is all you need

《Attention is All You Need》是一篇极其重要的论文&#xff0c;它提出的 Transformer 模型和自注意力机制不仅推动了 NLP 领域的发展&#xff0c;还对整个深度学习领域产生了深远影响。这篇论文的重要性体现在其开创性、技术突破和广泛应用上&#xff0c;是每一位深度学习研究…...

Cursor + IDEA 双开极速交互

相信很多开发者朋友应该和我一样吧&#xff0c;都是Cursor和IDEA双开的开发模式:在Cursor中快速编写和生成代码&#xff0c;然后在IDEA中进行调试和优化 在这个双开模式的开发过程中&#xff0c;我就遇到一个说大不大说小不小的问题&#xff1a; 得在两个编辑器之间来回切换查…...

HDFS的设计架构

HDFS 是 Hadoop 生态系统中的分布式文件系统&#xff0c;设计用于存储和处理超大规模数据集。它具有高可靠性、高扩展性和高吞吐量的特点&#xff0c;适合运行在廉价硬件上。 1. HDFS 的设计思想 HDFS 的设计目标是解决大规模数据存储和处理的问题&#xff0c;其核心设计思想…...

为wordpress自定义一个留言表单并可以在后台进行管理的实现方法

要为WordPress添加留言表单功能并实现后台管理&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 创建留言表单 首先&#xff0c;你需要创建一个留言表单。可以使用插件(如Contact Form 7)或手动编写代码。 使用Contact Form 7插件 安装并激活Contact Form 7插件。 创建…...

tauri-plugin-shell插件将_blank的a标签用浏览器打开了,,,解决办法

不要使用这个插件&#xff0c;这个插件默认会将网页中a标签为_blank的使用默认浏览器打开&#xff0c;但是这种做法在我的程序里不是很友好&#xff0c;我需要自定义这种行为&#xff0c;当我点击我自己的链接的时候&#xff0c;使用默认浏览器打开&#xff0c;当点击别的链接的…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...