java geotool构建地理点线面
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
上期回顾
在上期文章中,我们深入探讨了 Java 中如何处理地理空间数据,特别是通过 GeoTools 进行坐标转换和投影变换的相关技术。我们展示了如何使用 GeoTools 处理地理信息系统 (GIS) 中的坐标数据,并通过实际案例演示了这些技术的应用。本期文章将基于这些知识,进一步研究如何使用 GeoTools 构建地理点、线、面等几何对象。
前言
地理信息系统 (GIS) 是现代空间分析的核心,能够帮助我们在地图上可视化、分析和处理空间数据。在 GIS 中,地理点、线和面的构建是基础操作之一。GeoTools 是一个强大的 Java 库,广泛应用于 GIS 开发中,能够帮助开发者轻松构建和操作这些地理对象。本文将详细介绍如何使用 GeoTools 创建点、线和面等几何对象,并通过代码示例展示这些技术的应用。
摘要
本文将介绍如何使用 GeoTools 库在 Java 中构建地理点、线和面。我们将探讨 GeoTools 的核心类和方法,展示如何通过简单的代码创建这些地理对象。此外,本文还将分析这些方法的优缺点,并通过测试用例验证其正确性。最后,我们将讨论 GeoTools 在实际应用中的使用场景,并对整个过程进行总结。
正文
知识点源码分析
在 GeoTools 中,创建地理点、线和面等几何对象主要依赖于 GeometryFactory 类。这个类提供了构建基本几何对象的接口,如 Point、LineString 和 Polygon。
GeometryFactory 类简介
-
GeometryFactory: 这是 GeoTools 中的核心类,用于创建几何对象。你可以使用它创建点 (Point)、线 (LineString)、多边形 (Polygon) 等对象。 -
Coordinate: 这个类表示地理坐标,通常用于指定点的位置。 -
Point: 表示一个地理点对象,由一个Coordinate坐标构成。 -
LineString: 表示一条由多个Coordinate坐标组成的线。 -
Polygon: 表示一个由LinearRing构成的多边形。
以下是如何使用这些类创建地理对象的代码示例:
案例Demo
创建地理点 (Point)
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point;public class GeoToolsExample {public static void main(String[] args) {GeometryFactory geometryFactory = new GeometryFactory();// 创建一个地理点Coordinate coord = new Coordinate(116.3913, 39.9075); // 北京的经纬度Point point = geometryFactory.createPoint(coord);System.out.println("Point: " + point);}
}
创建地理线 (LineString)
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.LineString;public class GeoToolsExample {public static void main(String[] args) {GeometryFactory geometryFactory = new GeometryFactory();// 创建一个地理线Coordinate[] coords = new Coordinate[] {new Coordinate(116.3913, 39.9075),new Coordinate(116.3976, 39.9087)};LineString line = geometryFactory.createLineString(coords);System.out.println("LineString: " + line);}
}
创建地理面 (Polygon)
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.LinearRing;
import org.locationtech.jts.geom.Polygon;public class GeoToolsExample {public static void main(String[] args) {GeometryFactory geometryFactory = new GeometryFactory();// 创建一个多边形Coordinate[] coords = new Coordinate[] {new Coordinate(116.3913, 39.9075),new Coordinate(116.3976, 39.9087),new Coordinate(116.3997, 39.9035),new Coordinate(116.3913, 39.9075) // 需要闭合的多边形};LinearRing ring = geometryFactory.createLinearRing(coords);Polygon polygon = geometryFactory.createPolygon(ring, null);System.out.println("Polygon: " + polygon);}
}
相关内容拓展及延伸
在复杂的 GIS 项目中,你可能需要处理更复杂的几何对象,如多点、多线或多边形集合 (MultiPoint, MultiLineString, MultiPolygon)。这些对象可以通过类似的方式创建,只需使用 GeometryFactory 提供的相应方法。
例如:
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.MultiPoint;
import org.locationtech.jts.geom.Coordinate;public class GeoToolsExample {public static void main(String[] args) {GeometryFactory geometryFactory = new GeometryFactory();// 创建一个多点集合Coordinate[] coords = new Coordinate[] {new Coordinate(116.3913, 39.9075),new Coordinate(116.3976, 39.9087)};MultiPoint multiPoint = geometryFactory.createMultiPoint(coords);System.out.println("MultiPoint: " + multiPoint);}
}
优缺点对比
使用 GeoTools 的优势
- 丰富的功能: GeoTools 提供了全面的地理信息处理功能,适用于各种 GIS 应用场景。
- 兼容性强: 支持多种地理数据格式,易于集成到现有项目中。
- 社区支持: 拥有活跃的开源社区,文档和支持资源丰富。
使用 GeoTools 的劣势
- 学习曲线: 由于功能强大,GeoTools 的学习曲线较为陡峭,初学者需要一定时间来掌握。
- 性能开销: 对于大规模数据处理,GeoTools 的性能可能成为瓶颈,需要结合其他工具或方法进行优化。
测试用例
以下是一些测试用例,用于验证我们创建的地理对象是否正确:
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point;
import org.junit.Assert;
import org.junit.Test;public class GeoToolsTest {@Testpublic void testCreatePoint() {GeometryFactory geometryFactory = new GeometryFactory();Point point = geometryFactory.createPoint(new Coordinate(116.3913, 39.9075));Assert.assertEquals(116.3913, point.getX(), 0.0001);Assert.assertEquals(39.9075, point.getY(), 0.0001);}@Testpublic void testCreateLineString() {GeometryFactory geometryFactory = new GeometryFactory();Coordinate[] coords = new Coordinate[] {new Coordinate(116.3913, 39.9075),new Coordinate(116.3976, 39.9087)};LineString line = geometryFactory.createLineString(coords);Assert.assertEquals(2, line.getNumPoints());}@Testpublic void testCreatePolygon() {GeometryFactory geometryFactory = new GeometryFactory();Coordinate[] coords = new Coordinate[] {new Coordinate(116.3913, 39.9075),new Coordinate(116.3976, 39.9087),new Coordinate(116.3997, 39.9035),new Coordinate(116.3913, 39.9075) // 需要闭合的多边形};Polygon polygon = geometryFactory.createPolygon(coords);Assert.assertTrue(polygon.isValid());}
}
代码解析
在上述测试用例中,我们使用了 JUnit 进行单元测试。通过测试点、线、面对象的属性,我们可以验证 GeoTools 创建的地理对象是否符合预期。
使用场景
GeoTools 适用于各种 GIS 应用场景,例如:
- 地图渲染: 在 Web 或桌面应用中,使用 GeoTools 构建地理对象并进行地图可视化。
- 空间分析: 通过 GeoTools 处理地理数据,进行距离计算、区域划分等空间分析。
- 地理数据管理: 在地理信息系统中,使用 GeoTools 处理和管理各种地理数据格式。
全文总结
在本文中,我们详细探讨了如何使用 GeoTools 在 Java 中构建地理点、线和面。我们分析了 GeoTools 的核心类 GeometryFactory,并通过代码示例展示了如何创建各种几何对象。此外,我们还讨论了 GeoTools 的优缺点,并提供了测试用例来验证代码的正确性。希望本文能帮助你更好地理解和应用 GeoTools 进行地理数据处理。
下期
内容预告
在下一期文章中,我们将继续探讨 GeoTools 的高级应用,特别是如何处理复杂的地理数据集,并将这些数据集可视化在地图上。敬请期待!
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
相关文章:
java geotool构建地理点线面
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…...
C# 中 Grpc服务端调用客户端方法
在 gRPC 中,服务端通常不直接调用客户端的方法,因为 gRPC 的设计模型是服务端提供服务,客户端调用服务。通常情况下,服务端和客户端之间是解耦的,服务端只提供服务端点,客户端通过这些端点发起请求。 不过…...
Arthas相关命令
官方网站:命令列表 | arthas 也可以用idea的插件arthas-idea的插件根据你想定位的代码生成命令 jvm 相关 dashboard - 当前系统的实时数据面板getstatic - 查看类的静态属性heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能jvm - 查看当前 JVM 的信息l…...
2024年江苏省职业院校技能大赛 移动应用与开发中职赛项规程
2024年江苏省职业院校技能大赛 移动应用与开发中职赛项规程 (一)学生组竞赛内容:模块A:移动应用界面设计模块B:移动应用前端开发模块C:移动应用测试与交付 (二)教师组竞赛内容:模块A:…...
2024 Google 开发者大会,沉浸式体验AI社会公益
文章目录 一、现场打卡二、AI 社会公益三、Gemma 模型四、Gemini 模型五、Google Cloud六、现场体验七、带着问题逛展八、学习资源和活动九、结束 Happy Hour 一、现场打卡 大家好,我是小雨。 2024 Google 开发者大会,沉浸式体验AI社会公益 今天我们参加…...
OpenCV(开源计算机视觉库)
OpenCV(开源计算机视觉库)是一个专注于实时计算机视觉的全面库,包含了丰富的工具和功能。以下是 OpenCV 中一些关键知识点的详细列表: 核心功能 基本结构:Mat、Scalar、Point、Size、Rect 等。 图像 I/O:读…...
Java二十三种设计模式-责任链模式(17/23)
责任链模式:实现请求处理的灵活流转 引言 在这篇博客中,我们深入探讨了责任链模式的精髓,从其定义和用途到实现方法,再到使用场景、优缺点、与其他模式的比较,以及最佳实践和替代方案,旨在指导开发者如何…...
Electron31-ViteAdmin桌面端后台|vite5.x+electron31+element-plus管理系统Exe
原创自研Vue3Electron31ElementPlus桌面端轻量级后台管理Exe系统。 基于最新前端技术栈Vite5.x、Vue3、Electron31、ElementPlus、Vue-I18n、Echarts实战开发桌面端高颜值后台管理模板。内置4种布局模板,支持i18n国际化、动态权限路由,实现了表格、表单、…...
鸿蒙HarmonyOS实战:创建NDK工程、毕昇编译器
NDK适用场景 适合使用NDK的场景:应用涉及如下场景时,适合采用NDK开发 性能敏感的场景,如游戏、物理模拟等计算密集型场景。 需要复用已有C或C库的场景。 需要针对CPU特性进行专项定制库的场景,如Neon加速。 不建议使用NDK的场…...
网络安全-防火墙初步认识。
文章目录 1. 防火墙是什么?2. 防火墙的工作原理是什么?3. 防火墙的分类有哪些?4. 实战4.1 防火墙管理和实验介绍4.2 防火墙命令行初体验实验目标:实验步骤: 4.3 防火墙Web初体验实验目标:实验步骤ÿ…...
golang channel什么情况main会deadlock?主协程是什么?
在 Go 语言中,main 函数是程序的入口点,它运行在主协程(也称为主 goroutine)中。主协程是程序启动后自动创建的第一个 goroutine。当 main 函数执行完毕后,整个 Go 程序就会退出,无论其他 goroutine 是否仍…...
Redis之快速入门
目录 简介 什么是Redis 特点 优势 数据库对比 应用场景 安装与配置 下载 上传解压 安装gcc 编译 查看安装目录 后端启动 测试 系统服务配置 Redis数据类型 通过命令操作Redis String(字符串) Hash(哈希) List…...
mac 安装Arthas
mac安装有两种方式 1.第一步安装Arthas 第一种: curl -L https://arthas.aliyun.com/install.sh | sh 第二种jar包形式 curl -O https://arthas.aliyun.com/arthas-boot.jar个人比较推荐第一种因为运行测试成功了 第一种安装后可能会出现一些命令不符合 需…...
创客匠人老蒋:流量是个伪命题,做好这件事是打造IP最好避坑方式
怎么样做好一个创始人的IP?流量低是否可以与创客合作陪跑服务? 在老蒋创客圈第63期对话标杆直播连麦中,老蒋与受邀嘉宾【惢众身心成长家园平台】创办人王辉老师进行了一场深度且具有启发性的交流。 老蒋指出,打造IP不仅要“做自己…...
销售预测数据挖掘实战V2.0
1、概述 沃尔玛全年都会举办几次促销减价活动。这些减价活动都是在重要节假日之前进行的,其中最大的四个节假日是超级碗、劳动节、感恩节和圣诞节。包括这些节假日在内的几周在评估中的权重是非节假日周的五倍。在缺乏完整/理想历史数据的情况下,对这些…...
【K8s】Java项目部署时为什么要用k8s?
目录 重要意义一、高可用性与弹性伸缩二、简化部署与管理三、资源隔离与安全四、容器编排与服务发现 部署步骤准备工作创建 Docker 镜像将镜像推送到镜像仓库创建 Kubernetes 资源对象部署到 Kubernetes 集群 常见问题 在 Java 项目部署中使用 Kubernetes(k8s&#…...
【Python】AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘
【Python】成功解决AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘ 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博…...
SQL注入(cookie、base64、dnslog外带、搜索型注入)
目录 COOKIE注入 BASE64注入 DNSLOG注入—注入判断 什么是泛解析? UNC路径 网上邻居 LOAD_FILE函数 搜索型注入—注入判断 本文所使用的sql注入靶场为sqli-labs-master,靶场资源文件已上传,如有需要请前往主页或以下链接下载 信安必备…...
GPT-4:揭秘人工智能新纪元
GPT-4,是OpenAI推出的最新一代语言模型,它的出现不仅在AI技术领域引起了广泛关注,更是在全球范围内掀起了一场关于人工智能未 来的热烈讨论。本文将详细探讨GPT-4的技术突破、应用前景,以及它对社会和科技发展的深远影响。 GPT-4…...
Taro 框架 React Native 开发
1、生命周期 参考:React Native组件(一)组件的生命周期_reactnative constructor介绍-CSDN博客 1.1构造函数(constructor) 1、第一个语句必须是super(props)。 2、contructor将在任意一个RN组件被加载之前优先调用,并且只会调…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
