基于GeoTools和OSM路网求解两条道路相交点-以长沙市为例

article/2025/8/11 10:54:11

目录

前言

一、基础数据简介

1、QGIS数据展示

2、元数据介绍

二、GeoTools相交求解

1、加载路网数据

2、查找道路信息

3、计算相交点

4、集成调用及输出

三、总结


前言

        今天是端午节也是六一儿童节,当端午节碰到儿童节,双节的碰撞。在这祝各位朋友们端午安康,也祝各位大朋友小朋友们儿童节快乐,永葆童真。

        随着城市化进程的加速,城市交通网络日益复杂,对于道路信息的精准分析和处理需求也愈发迫切。在长沙市这样的大型城市中,错综复杂的路网系统为城市规划、交通管理、智能导航等多个领域带来了诸多挑战。准确求解两条道路的相交点,作为道路网络分析中的基础且关键环节,对于优化交通流量、规划公交线路、建设智能交通系统等具有重大意义。

        传统的道路相交点求解方法往往依赖于人工测量或特定商业软件的支持。然而,人工测量存在效率低下、易受环境因素影响以及成本高昂等问题;而商业软件虽功能强大,但通常价格昂贵且数据格式封闭,难以满足大规模、多样化以及实时性要求较高的城市道路分析需求。在此背景下,GeoTools 和 OSM 路网为我们提供了一种高效、开源且灵活的道路相交点求解方案。

        本研究旨在结合 GeoTools 和 OSM 路网数据,探索一套高效、准确且适用于长沙市复杂道路条件的道路相交点求解方法。通过对 OSM 路网数据的获取与预处理,利用 GeoTools 提供的几何分析功能,深入研究道路相交点的判定算法以及相交点坐标的精确计算方法,从而实现对长沙市道路相交点的自动化、批量化的求解。这不仅有助于提升城市交通管理的信息化水平,为交通规划和决策提供科学依据,也为其他城市在类似场景下的道路网络分析提供了一种可借鉴的思路和方法,推动城市地理信息科学领域的发展以及智能交通系统的建设进程。

一、基础数据简介

        本节将介绍长沙路网的基本信息,使用QGIS软件来进行基础路网的展示以及元数据的介绍。让大家对基础道路信息有一个基本的了解。

1、QGIS数据展示

        在QGIS中进行道路展示时,根据道路的级别进行分类标注,分类规则如下:

        点击应用以后可以看到以下制图效果:

         可以看到路网的信息比较完备,同时将道路按照不同的等级,如高速、省道、次干道、步行道、车行道等都进行了标注。由于周所周知的原因,OSM数据作为学习使用没有问题,如果要应用生产谨慎。

2、元数据介绍

        下面我们对基础路网数据的的元数据进行简单介绍。这里使用的基础路网数据是从全国的路网信息裁剪下来的。裁剪之后的基础信息如下:

序号参数名参数说明
1文件格式

ESRI Shapefile

2编码GBK
3数据类型

Line (MultiLineString)

4空间参考

EPSG:4326 - WGS 84 - 地理的

5数据范围111.8935741910824362,27.8608263279212238 : 114.2082998876577307,28.6640906134622071
6单位
7数据量

27,575

二、GeoTools相交求解

        GeoTools 作为一个开源的 Java GIS 工具库,具备强大的地理数据处理和分析能力,能够方便地实现地理数据的读取、转换、几何运算等功能,为道路相交点的求解提供了坚实的算法基础和技术支撑。OpenStreetMap(OSM)路网数据则具有数据丰富、更新及时、覆盖范围广且免费开源等优势,涵盖了长沙市及其周边地区的详细道路信息,包括道路的几何形状、属性信息等,是进行城市道路分析的宝贵数据资源。本节将重点介绍结合GeoTools来讲解如何进行求解的计算,分别从以下步骤展开,加载路网数据、查找道路信息、计算相交点。

1、加载路网数据

        首先需要加载所有的路网信息,如果需要使用道路的名称信息,就需要准确的进行属性编码的设置。如果不需要忽略编码的设置,使用Geotools的关键代码如下,这里是个实例,如果需要动态传入字符编码,可以从相关配置文件中读取,可以从博主之前的系列博客中查阅参考:

/*** 加载shp文件*/
private static SimpleFeatureSource loadShapefile(File file) throws Exception {ShapefileDataStore store = new ShapefileDataStore(file.toURI().toURL());store.setCharset(Charset.forName("GBK"));//设置中文字符编码return store.getFeatureSource();
}

2、查找道路信息

        加载路网信息后,接下来就需要指定道路的名称来从路网中查找指定的道路,这里需要使用到的GtoTools的过滤查询方法,准确的查找检索道路名称至关重要,核心方法如下:

/**
* 按道路名称过滤要素
*/
private static SimpleFeatureCollection filterRoadsByName(SimpleFeatureSource source, String roadName) throws Exception {FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();Filter filter = ff.equal(ff.property(ROAD_NAME_FIELD), ff.literal(roadName), true);return source.getFeatures(filter);
}

        需要注意的是,仅根据道路的名称返回的查询结果可能是多条,在OSM中,一条道路可能会被标记为多段,因此在返回结果中使用SimpleFeatureCollection,表示是一个集合对象。 

3、计算相交点

        根据道路名称查询到道路的数据结合后,接下来就是使用GeoTools来求解两条路的相交点。核心算法如下:

/**
* 计算两条道路集合的所有交点
*/
private static Set<Point> findIntersections(SimpleFeatureCollection road1, SimpleFeatureCollection road2) {Set<Point> intersections = new HashSet<>();try (SimpleFeatureIterator iter1 = road1.features()) {while (iter1.hasNext()) {SimpleFeature f1 = iter1.next();Geometry geom1 = (Geometry) f1.getDefaultGeometry();// 确保几何体有效if (geom1 == null || geom1.isEmpty()) continue;try (SimpleFeatureIterator iter2 = road2.features()) {while (iter2.hasNext()) {SimpleFeature f2 = iter2.next();Geometry geom2 = (Geometry) f2.getDefaultGeometry();if (geom2 == null || geom2.isEmpty()) continue;// 计算交点(使用OverlayNGRobust提高稳定性)Geometry result = OverlayNGRobust.overlay(geom1, geom2, OverlayNG.INTERSECTION);// 处理不同类型的返回结果processIntersectionGeometry(result, intersections);}}}}return intersections;
}/*** 处理相交几何对象(支持点/多点/线集合)*/private static void processIntersectionGeometry(Geometry geom, Set<Point> output) {if (geom == null || geom.isEmpty()) return;if (geom instanceof Point) {output.add((Point) geom);} else if (geom instanceof MultiPoint) {for (int i = 0; i < geom.getNumGeometries(); i++) {output.add((Point) geom.getGeometryN(i));}} else if (geom instanceof GeometryCollection) {for (int i = 0; i < geom.getNumGeometries(); i++) {processIntersectionGeometry(geom.getGeometryN(i), output);}}// 注意:线-线相交理论上应返回点,但保留此处理增强健壮性}

4、集成调用及输出

        最后将上面的方法进行一个完整的示例调用程序演示,这里使用Main方法进行输出,关键代码如下:

// 定义道路名称属性字段(根据实际shp修改)
private static final String ROAD_NAME_FIELD = "name";
public static void main(String[] args) throws Exception {// 1. 加载OSM道路shp文件File shpFile = new File("F:/vector_data/2024年OSM长沙路网/长沙路网OSM2024.shp");SimpleFeatureSource featureSource = loadShapefile(shpFile);// 2. 输入两条道路名称String roadName1 = "金星北路";String roadName2 = "岳麓大道";// 3. 获取两条道路的所有几何线SimpleFeatureCollection road1Features = filterRoadsByName(featureSource, roadName1);SimpleFeatureCollection road2Features = filterRoadsByName(featureSource, roadName2);// 4. 计算所有相交点Set<Point> intersections = findIntersections(road1Features, road2Features);// 5. 输出结果System.out.println("Found " + intersections.size() + " intersections:");for (Point p : intersections) {System.out.printf("POINT (%.6f %.6f)\n", p.getX(), p.getY());}}

        运行以下程序后可以看到以下输出:

六月 01, 2025 7:47:22 上午 org.geotools.image.ImageWorker <clinit>
信息: Warp/affine reduction enabled: true
Found 4 intersections:
POINT (112.928802 28.229116)
POINT (112.928655 28.228864)
POINT (112.928634 28.229118)
POINT (112.928817 28.228852)

        表示经过我们的计算,两条道路(金星北路和岳麓大道)的相交点坐标如上,这里留两个问题,为什么两条道路的相交点是四个?会不会有更多的情况?下次博文进行讲解。

三、总结

        以上就是本文的主要内容, 本研究旨在结合 GeoTools 和 OSM 路网数据,探索一套高效、准确且适用于长沙市复杂道路条件的道路相交点求解方法。通过对 OSM 路网数据的获取与预处理,利用 GeoTools 提供的几何分析功能,深入研究道路相交点的判定算法以及相交点坐标的精确计算方法,从而实现对长沙市道路相交点的自动化、批量化的求解。通过详细的代码讲解,让大家对如何使用Geotools来进行路网的道路的相交点求解有了全面的认识和掌握,当然还有很大的优化空间,比如考虑未相交的情况处理,还有如果是环线如何支持的更好,大范围计算如何空间优化等。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。


http://www.hkcw.cn/article/yPYXZVEsNc.shtml

相关文章

中国高分辨率高质量地面CO数据集(2013-2023)

时间分辨率&#xff1a;日空间分辨率&#xff1a;1km - 10km共享方式&#xff1a;开放获取数据大小&#xff1a;9.83 GB数据时间范围&#xff1a;2013-01-01 — 2023-12-31元数据更新时间&#xff1a;2024-08-19 数据集摘要 ChinaHighCO数据集是中国高分辨率高质量近地表空气污…

t018-高校宣讲会管理系统 【含源码!】

项目演示视频 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装高校宣讲会管理系统软件来发挥其高效地信息处…

NLP学习路线图(十四):词袋模型(Bag of Words)

在自然语言处理&#xff08;NLP&#xff09;的广阔天地中&#xff0c;词袋模型&#xff08;Bag of Words, BoW&#xff09; 宛如一块历经岁月沉淀的基石。它虽非当今最耀眼的明星&#xff0c;却为整个领域奠定了至关重要的基础&#xff0c;深刻影响了我们让计算机“理解”文本的…

Windows系统时间怎么设置

打开设置窗口&#xff1a;右键单击任务栏上的时间和日期显示区域&#xff0c;选择 “调整日期 / 时间”。 调整时区&#xff1a;在 “日期和时间” 设置窗口中&#xff0c;单击 “更改时区”&#xff0c;从下拉列表中选择正确的时区&#xff0c;若希望计算机自动调整为夏令时&a…

ssm 学习笔记day03

环境搭建 spring配置数据库 1.在pom.xml安装相应的依赖 2.在properties里面配置数据库的相关信息&#xff0c;需要强调的一点是&#xff0c;一定不要在properties里面添加任何空格&#xff0c;否则就会像我一样搞了两小时&#xff0c;数据一直报错&#xff0c;然后发现是空格的…

Python6.1打卡(day33)

DAY 33 MLP神经网络的训练 知识点回顾&#xff1a; 1.PyTorch和cuda的安装 2.查看显卡信息的命令行命令&#xff08;cmd中使用&#xff09; 3.cuda的检查 4.简单神经网络的流程 1.数据预处理&#xff08;归一化、转换成张量&#xff09; 2.模型的定义 …

python打卡day42

Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 在深度学习中&#xff0c;我们经常需要查看或修改模型中间层的输出或梯度&#xff0c;但标准的前向传播和反向传播过程通常是一个黑盒&#xff0c;很难直接访问中间层的信息。PyT…

[总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析

前端性能分析大全 前端性能优化 LightHouse性能评分 性能指标监控分析 浏览器加载资源的全过程性能指标分析 性能指标 在实现性能监控前&#xff0c;先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系&#xff0c;旨在帮助开发者量…

Linux 驱动之设备树

Linux 驱动之设备树 参考视频地址 【北京迅为】嵌入式学习之Linux驱动&#xff08;第七期_设备树_全新升级&#xff09;_基于RK3568_哔哩哔哩_bilibili 本章总领 1.设备树基本知识 什么是设备树&#xff1f; ​ Linux之父Linus Torvalds在2011年3月17日的ARM Linux邮件列表…

Unity Mono与IL2CPP比较

Unity提供了两种主要的脚本后端(Scripting Backend)选项&#xff1a;Mono和IL2CPP。它们在性能、平台支持和功能特性上有显著差异。 Edit>Project Settings>Player>Other Settings Mono后端 特点&#xff1a; 基于开源的Mono项目(.NET运行时实现) 使用即时编译(JIT…

配置Ollama环境变量,实现远程访问

在安装 Ollama 时配置环境变量 OLLAMA_HOST0.0.0.0:11434的主要目的是允许 Ollama 服务被局域网或远程设备访问&#xff0c;而不仅仅是本地主机&#xff08;localhost&#xff09;。 以下是详细原因&#xff1a; 1. Ollama默认行为的限制 默认情况下&#xff0c;Ollama 的 API…

仓颉鸿蒙开发:制作底部标签栏

今天制作标签栏&#xff0c;标签栏里面的有4个区域&#xff1a;首页、社区、消息、我的&#xff0c;以及对应的图标。点击的区域显示为高亮&#xff0c;未点击的区域显示为灰色 简单的将视图上面区域做一下 一、制作顶部公共视图部分 internal import ohos.base.* internal …

AWS之数据分析

目录 数据分析产品对比 1. Amazon Athena 3. AWS Lake Formation 4. AWS Glue 5. Amazon OpenSearch Service 6. Amazon Kinesis Data Analytics 7. Amazon Redshift 8.Amazon Redshift Spectrum 搜索服务对比 核心功能与定位对比 适用场景 关键差异总结 注意事项 …

Linux进程间通信----简易进程池实现

进程池的模拟实现 1.进程池的原理&#xff1a; 是什么 进程池是一种多进程编程模式&#xff0c;核心思想是先创建好一定数量的子进程用作当作资源&#xff0c;这些进程可以帮助完成任务并且重复利用&#xff0c;避免频繁的进程的创建和销毁的开销。 下面我们举例子来帮助理…

【Oracle】安装单实例

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 安装前的准备工作1.1 硬件和系统要求1.2 检查系统环境1.3 下载Oracle软件 2. 系统配置2.1 创建Oracle用户和组2.2 配置内核参数2.3 配置用户资源限制2.4 安装必要的软件包 3. 目录结构和环境变量3.1 创建Ora…

Pyecharts 库的概念与函数

基本概念 Pyecharts 是一个基于 ECharts 的 Python 数据可视化库&#xff0c;具有以下特点&#xff1a; 基于 ECharts&#xff1a;底层使用百度开源的 ECharts 图表库 多种图表类型&#xff1a;支持折线图、柱状图、饼图、散点图、地图等多种图表 交互式&#xff1a;生成的图…

【深入详解】C语言内存函数:memcpy、memmove的使用和模拟实现,memset、memcmp函数的使用

目录 一、memcpy、memmove使用和模拟实现 &#xff08;一&#xff09;memcpy的使用和模拟实现 1、代码演示&#xff1a; &#xff08;1&#xff09;memcpy拷贝整型 &#xff08;2&#xff09;memcpy拷贝浮点型 2、模拟实现 &#xff08;二&#xff09;memmove的使用和模…

设计模式——责任链设计模式(行为型)

摘要 责任链设计模式是一种行为型设计模式&#xff0c;旨在将请求的发送者与接收者解耦&#xff0c;通过多个处理器对象按链式结构依次处理请求&#xff0c;直到某个处理器处理为止。它包含抽象处理者、具体处理者和客户端等核心角色。该模式适用于多个对象可能处理请求的场景…

软件的兼容性如何思考与分析?

软件功能的兼容性是指软件在实现功能的时候&#xff0c;能够与其他软件、硬件、系统环境以及数据格式等相互协作、互不冲突&#xff0c;并且能够正确处理不同来源或不同版本的数据、接口和功能模块的能力。它确保软件在多种环境下能够正常运行&#xff0c;同时与其他系统和用户…

C++ —— STL容器——string类

1. 前言 本篇博客将会介绍 string 中的一些常用的函数&#xff0c;在使用 string 中的函数时&#xff0c;需要加上头文件 string。 2. string 中的常见成员函数 2.1 初始化函数 string 类中的常用的初始化函数有以下几种&#xff1a; 1. string() …