本文涉及异常问题比较普遍:https://cn.bing.com/search?q=found+non-noded+intersection+between&qs=n&form=QBRE&sp=-1&pq=found+non-noded+intersection+between&sc=0-36&sk=&cvid=B72C36C5CD9B45E392758021640A8E06

经测试,是由于使用方法不当造成的。

目录

Geometry计算方法

轨迹点与围栏关系计算逻辑

轨迹在围栏内部

轨迹在围栏外部

轨迹里程计算效率测试

Geometry轨迹围栏交集计算效率

Geometry两个之间距离计算效率

异常关注

调用方式

正常情况

异常情况

异常分析

避免异常

Github项目


Geometry计算方法

轨迹点与围栏关系计算逻辑

将轨迹分成两部分进行运算,即在围栏的内部和外部,笼统地都可以用geometry求交集。

轨迹在围栏内部

几何关系:包含&相交。

计算步骤:

  1. 判断是否包含
  2. 判断是否相交
  3. 前两步都为真,则计算轨迹里程等于围栏内运动里程,围栏外里程为0。

轨迹在围栏外部

几何关系:非包含&不相交。

计算步骤:

  1. 判断是否包含
  2. 判断是否相交
  3. 前两步都为真,则计算轨迹里程等于围栏外运动里程,围栏内里程为0。

轨迹里程计算效率测试

Geometry轨迹围栏交集计算效率

此种计算方式需要做两个维度的计算

  1. 轨迹本身的里程
  2. 交叉里程(围栏内里程)

轨迹点的计算时间复杂度: T(n)=O(f(n-1));

轨迹与围栏交集里程时间复杂度: T(n)=O(f(n));

轨迹点个数

耗时(ms)

平均耗时(ms)

100

485,24,28,33,43,26,70,34,52,39,

83

300

545,38,34,30,33,27,25,42,32,33,

83

500

570,40,34,43,32,29,49,42,28,27,

89

1000

580,41,33,31,30,37,30,28,27,28,

86

2000

641,38,41,52,34,51,42,40,29,28,

99

3000

633,46,53,38,29,31,32,58,25,23,

96

5000

619,53,57,33,39,76,32,38,25,30,

100

8000

660,46,45,64,33,35,35,49,40,32,

103

10000

695,62,60,60,33,47,43,50,31,28,

110

Geometry两个之间距离计算效率

此种方式只需要计算轨迹的里程,计算过程中区分围栏内里程和围栏外里程。

轨迹点的计算时间复杂度: T(n)=O(f(n-1));

轨迹点个数

耗时(ms)

平均耗时(ms)

100

363,24,33,14,16,17,14,14,11,10,

51

300

449,55,41,33,26,20,20,13,30,17,

70

500

451,52,31,38,36,34,27,28,25,32,

75

1000

687,72,65,62,53,75,48,47,62,464,

163

2000

636,100,95,105,81,97,101,244,81,111,

165

3000

695,128,136,116,190,145,154,95,170,156,

198

5000

802,301,326,222,270,210,251,497,206,268,

335

8000

1075,464,437,497,487,489,527,494,490,362,

532

10000

1107,1148,587,683,534,632,639,580,644,741,

729

注:这里耗时体现在每次都对点是否在围栏里面进行判断。

异常关注

调用方式

错误的方式:

正确使用方式:

注:下面产生异常的方式主要是方法调用产生的异常,导致geometry与geometry之间判断相交产生冲突。

正常情况

正常有无交集

LINESTRING (116.25219844906536 39.906786278366184, 116.25244821464976 39.90685660540906,.......)

POLYGON ((116.25535777758334 39.915633025102814, 116.2574767832826 39.92280683703119, 116.26090814827204 39.931584334357126, 116.26145755480688 39.94115959034832, 116.26261596265554 39.94975783123877, 116.25535777758334 39.915633025102814))

lineStringContainsLineString=true

polygonContainsPolygon=true

================>开始....

线的长度:0.7536681662645706

线轨迹的实际里程(米):63327.0

面的面积(平方米):493080.36165995616

两个空间对象最近的距离:0.003595942642908063

两个几何对象的交集:LINESTRING EMPTY

围栏内里程(米):0.0

围栏外里程(米):63327.0

================>耗时641ms,points=1000

================>开始....

线的长度:0.7536681662645706

线轨迹的实际里程(米):63327.0

面的面积(平方米):493080.36165995616

两个空间对象最近的距离:0.003595942642908063

两个几何对象的交集:LINESTRING EMPTY

围栏内里程(米):0.0

围栏外里程(米):63327.0

================>耗时102ms,points=1000

================>开始....

线的长度:0.7536681662645706

线轨迹的实际里程(米):63327.0

面的面积(平方米):493080.36165995616

两个空间对象最近的距离:0.003595942642908063

两个几何对象的交集:LINESTRING EMPTY

围栏内里程(米):0.0

围栏外里程(米):63327.0

================>耗时111ms,points=1000

正常有交集

lineStringContainsLineString=true

polygonContainsPolygon=true

================>开始....

线的长度:0.7621779140342029

线轨迹的实际里程(米):62687.0

面的面积(平方米):808894.4476752883

两个空间对象最近的距离:0.0

两个几何对象的交集:MULTILINESTRING ((116.25688221662699 39.914395421882276, 116.25758584647397 39.91484391938795, 116.25822427104575 39.91560473167323, 116.25860369811619 39.91625944161212, 116.2587542555323 39.917155419248814, 116.25934281853155 39.91740573376146, 116.26017238150571 39.91837305892461, 116.26047989801104 39.918917913968706), (116.26066125935785 39.91908979976905, 116.26139721203687 39.91909890945397, 116.261493614772 39.91969117292497, 116.26209510309556 39.919864426634085, 116.26267162465133 39.920768643283466, 116.26283447817538 39.92087285535724, 116.26320152504029 39.92117941999886, 116.26371154759461 39.92198072026618))

围栏内里程(米):860.0

围栏外里程(米):61827.0

================>耗时529ms,points=1000

================>开始....

线的长度:0.7621779140342029

线轨迹的实际里程(米):62687.0

面的面积(平方米):808894.4476752883

两个空间对象最近的距离:0.0

两个几何对象的交集:MULTILINESTRING ((116.25688221662699 39.914395421882276, 116.25758584647397 39.91484391938795, 116.25822427104575 39.91560473167323, 116.25860369811619 39.91625944161212, 116.2587542555323 39.917155419248814, 116.25934281853155 39.91740573376146, 116.26017238150571 39.91837305892461, 116.26047989801104 39.918917913968706), (116.26066125935785 39.91908979976905, 116.26139721203687 39.91909890945397, 116.261493614772 39.91969117292497, 116.26209510309556 39.919864426634085, 116.26267162465133 39.920768643283466, 116.26283447817538 39.92087285535724, 116.26320152504029 39.92117941999886, 116.26371154759461 39.92198072026618))

围栏内里程(米):860.0

围栏外里程(米):61827.0

================>耗时97ms,points=1000

================>开始....

线的长度:0.7621779140342029

线轨迹的实际里程(米):62687.0

面的面积(平方米):808894.4476752883

两个空间对象最近的距离:0.0

两个几何对象的交集:MULTILINESTRING ((116.25688221662699 39.914395421882276, 116.25758584647397 39.91484391938795, 116.25822427104575 39.91560473167323, 116.25860369811619 39.91625944161212, 116.2587542555323 39.917155419248814, 116.25934281853155 39.91740573376146, 116.26017238150571 39.91837305892461, 116.26047989801104 39.918917913968706), (116.26066125935785 39.91908979976905, 116.26139721203687 39.91909890945397, 116.261493614772 39.91969117292497, 116.26209510309556 39.919864426634085, 116.26267162465133 39.920768643283466, 116.26283447817538 39.92087285535724, 116.26320152504029 39.92117941999886, 116.26371154759461 39.92198072026618))

围栏内里程(米):860.0

围栏外里程(米):61827.0

================>耗时85ms,points=1000

异常情况

由于模拟数据生成的随机性(不排除用户设置的围栏有交叉情况),会发生如下异常:

LINESTRING (116.25233147795146 39.90671657422486, 116.25329975573385 ..........................................

, 116.75523501649404 40.38680842299548, 116.75542104290876 40.38752711749191, 116.75557794481281 40.3880272337106, 116.7563739582496 40.38839729795829)

POLYGON ((116.25705727212875 39.907554807329966, 116.26239238833828 39.9171876545588, 116.2723211320915 39.92447819980439, 116.27886972069327 39.924660627590114, 116.27984327323371 39.93156232014855, 116.25705727212875 39.907554807329966))

lineStringContainsLineString=true

polygonContainsPolygon=false

================>开始....

com.vividsolutions.jts.geom.TopologyException: found non-noded intersection between LINESTRING ( 116.2723211320915 39.92447819980439, 116.27886972069327 39.924660627590114 ) and LINESTRING ( 116.27984327323371 39.93156232014855, 116.25705727212875 39.907554807329966 ) [ (116.27314128058926, 39.924501047151125, NaN) ]

at com.vividsolutions.jts.noding.FastNodingValidator.checkValid(FastNodingValidator.java:130)

at com.vividsolutions.jts.geomgraph.EdgeNodingValidator.checkValid(EdgeNodingValidator.java:94)

at com.vividsolutions.jts.geomgraph.EdgeNodingValidator.checkValid(EdgeNodingValidator.java:59)

at com.vividsolutions.jts.operation.overlay.OverlayOp.computeOverlay(OverlayOp.java:170)

at com.vividsolutions.jts.operation.overlay.OverlayOp.getResultGeometry(OverlayOp.java:127)

at com.vividsolutions.jts.operation.overlay.OverlayOp.overlayOp(OverlayOp.java:66)

at com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp.getResultGeometry(SnapIfNeededOverlayOp.java:96)

at com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp.overlayOp(SnapIfNeededOverlayOp.java:58)

at com.vividsolutions.jts.geom.Geometry.intersection(Geometry.java:1342)

at com.forestar.geometry.utils.GeometryUtil.intersectionGeo(GeometryUtil.java:122)

at test.GeometryTest.run(GeometryTest.java:108)

================>开始....

at test.GeometryTest.runLoop(GeometryTest.java:144)

at test.GeometryTest.main(GeometryTest.java:155)

com.vividsolutions.jts.geom.TopologyException: found non-noded intersection between LINESTRING ( 116.2723211320915 39.92447819980439, 116.27886972069327 39.924660627590114 ) and LINESTRING ( 116.27984327323371 39.93156232014855, 116.25705727212875 39.907554807329966 ) [ (116.27314128058926, 39.924501047151125, NaN) ]

at com.vividsolutions.jts.noding.FastNodingValidator.checkValid(FastNodingValidator.java:130)

at com.vividsolutions.jts.geomgraph.EdgeNodingValidator.checkValid(EdgeNodingValidator.java:94)

at com.vividsolutions.jts.geomgraph.EdgeNodingValidator.checkValid(EdgeNodingValidator.java:59)

at com.vividsolutions.jts.operation.overlay.OverlayOp.computeOverlay(OverlayOp.java:170)

at com.vividsolutions.jts.operation.overlay.OverlayOp.getResultGeometry(OverlayOp.java:127)

at com.vividsolutions.jts.operation.overlay.OverlayOp.overlayOp(OverlayOp.java:66)

at com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp.getResultGeometry(SnapIfNeededOverlayOp.java:96)

at com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp.overlayOp(SnapIfNeededOverlayOp.java:58)

at com.vividsolutions.jts.geom.Geometry.intersection(Geometry.java:1342)

at com.forestar.geometry.utils.GeometryUtil.intersectionGeo(GeometryUtil.java:122)

at test.GeometryTest.run(GeometryTest.java:108)

at test.GeometryTest.runLoop(GeometryTest.java:144)

at test.GeometryTest.main(GeometryTest.java:155)

================>开始....

com.vividsolutions.jts.geom.TopologyException: found non-noded intersection between LINESTRING ( 116.2723211320915 39.92447819980439, 116.27886972069327 39.924660627590114 ) and LINESTRING ( 116.27984327323371 39.93156232014855, 116.25705727212875 39.907554807329966 ) [ (116.27314128058926, 39.924501047151125, NaN) ]

at com.vividsolutions.jts.noding.FastNodingValidator.checkValid(FastNodingValidator.java:130)

at com.vividsolutions.jts.geomgraph.EdgeNodingValidator.checkValid(EdgeNodingValidator.java:94)

at com.vividsolutions.jts.geomgraph.EdgeNodingValidator.checkValid(EdgeNodingValidator.java:59)

at com.vividsolutions.jts.operation.overlay.OverlayOp.computeOverlay(OverlayOp.java:170)

at com.vividsolutions.jts.operation.overlay.OverlayOp.getResultGeometry(OverlayOp.java:127)

at com.vividsolutions.jts.operation.overlay.OverlayOp.overlayOp(OverlayOp.java:66)

at com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp.getResultGeometry(SnapIfNeededOverlayOp.java:96)

at com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp.overlayOp(SnapIfNeededOverlayOp.java:58)

at com.vividsolutions.jts.geom.Geometry.intersection(Geometry.java:1342)

at com.forestar.geometry.utils.GeometryUtil.intersectionGeo(GeometryUtil.java:122)

at test.GeometryTest.run(GeometryTest.java:108)

at test.GeometryTest.runLoop(GeometryTest.java:144)

at test.GeometryTest.main(GeometryTest.java:155)

异常分析

在上面的测试中,异常情况下多边形不能被其本身所包含。

正常情况:

lineStringContainsLineString=true

polygonContainsPolygon=true

异常情况:

lineStringContainsLineString=true

polygonContainsPolygon=false

可以在求交集之前做一次自身的包含计算,以避免异常的产生。

异常产生的提示是:发现LINESTRING之间的非节点交叉点

可以看到类似8字形的多边形,其交叉点并没有实际的点存在,这种图像就会产生异常。

避免异常

最简单的方式就是合理的使用Geometry的方法,也就不存在异常问题了。

计算步骤:

  1. 判定多边形(围栏)是否对本身包含
  2. 如果为假,则直接通过判断轨迹点是否在围栏内部进行分段计算。

注:分段计算是将轨迹区别运算,分别统计围栏内外的轨迹,效率不高,Geometry求交集方式的效率最高。

Github项目

https://github.com/SunflowersOfJava/geo-gis-utils

Java Geometry计算轨迹与围栏交集效率测试及异常处理相关推荐

  1. 测试Java Stream流 parralle与 sequential的效率

    测试Java Stream流 parralle与 sequential的效率 实验环境 操作系统:win10 处理器:Intel i5-4200U 2核4线程 Java版本:1.8 实验方案 统计大小 ...

  2. Java Geometry空间几何数据的处理应用

    1 Java Geometry空间几何数据的处理应用 Java Geometry空间几何数据的处理应用 WKT,是一种文本标记语言,用于表示矢量几何对象.空间参照系统及空间参照系统之间的转换.它的二进 ...

  3. JAVA专题---计算思维

    JAVA专题-计算思维 一.一谈计算思维 本文节选自 360 百科 https://baike.so.com/doc/3092926-3260084.html 2006年3月,美国卡内基·梅隆大学计算 ...

  4. 定时分量和直流分量_直流电机效率测试的计算与纹波因数及波形因数的计算

    直流电机(direct current machine)是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机.它是能实现直流电能和机械能互相转换的电机.当它作电动 ...

  5. Java架构师成长之道之Java数据计算

    Java架构师成长之道之Java数据计算 Java架构师成长之道 3.1 Java数据计算概述 计算机最主要的任务就是完成生产生活中的各种数据的运算,在Java中提供了诸多的运算符来完成相关数据的运算 ...

  6. 三次多项式曲线php,多项式计算的效率测试,多项式计算效率_PHP教程

    多项式计算的效率测试,多项式计算效率 多项式计算调用库函数pow方法和秦九韶算法,我们来测算下他们的运行效率 计算函数f(x)=1+(Σxi/i)(i从1取到m); 用ctime时间函数来测试运行时间 ...

  7. java作业 计算平均分和总成绩

    java作业 计算平均分和总成绩 小数保留两位 计算器类 import java.util.Scanner;public class Computer {int score_java;int scor ...

  8. 在Java中计算一元线性回归

    文章目录 1.前言 2.内容 2.1 定义实体类 2.2 回归线实现类 2.3 线性回归测试类 3. 总结 1.前言 最近公司项目有需要用到在Java中计算一元线性回归的功能,网上找了很久,发现一篇不 ...

  9. Java求两个数组的交集、差集、并集

    目录 Java求两个数组的并集,代码如下: Java求两个数组的交集,代码如下: Java求两个数组的差集,代码如下: 交集.差集.并集测试代码如下: Java求两个数组的并集,代码如下: /*** ...

最新文章

  1. String、StringBuffer、StringBuilder源码解析
  2. Yii ActiveRecord 的via和viaTable示例
  3. android标题栏添加按钮_[办公小技巧]Excel 添加页码,自定义和指定单元格页码添加...
  4. 3分钟学会python_3分钟学会一个Python小技巧
  5. 设置公共请求参数_基于分布式锁的防止重复请求解决方案(值得收藏)
  6. Pytorch1.7.1与SimpleITK2.0.0在centos7上终端运行冲突的情况
  7. html——float与clear详解(深度好文)
  8. android之调用webservice实现图片上传
  9. Python Selenium set Chrome Preference Download Location.
  10. SPSS可以生成正交表吗?
  11. 2021-09-23各个国家简称以及收手机区号
  12. C++中setw()函数
  13. 用Python做证券指数的三种策略分析
  14. python圣诞节祝福_Pyhton表白代码——浪漫圣诞节
  15. 基于74hc573的数码管模块测试
  16. 突破蓝牙壁垒:aptX技术完美解决无线音频的延时问题
  17. 【ArcGIS微课1000例】0026:ArcGIS10如何自定义工具条?
  18. java月亮代码_Java编程实现月食简单代码分享
  19. 国丰帮您-采用LDP作为VPLS信令建立PW--VPLS示例
  20. 打开outlook显示服务器内存不足,outlook无法启动,总说计算机内存不足或磁盘已满,是怎么回事?...

热门文章

  1. 全球首款折叠屏PC:ThinkPad X1 Fold开辟新物种
  2. 运行MySQL报错:找不到命令mysql、ERROR 2003 (HY000)、ERROR 1045 (28000)
  3. 誉天教育丨跨行学数通HCIE之路
  4. 金三银四过去大半,你确定好跳槽了吗?
  5. 【找工作资料】英文简历、面试常用词汇
  6. 盈利模式不清晰 本身是个伪需求 共享充电宝不过是场资本游戏
  7. 前端HTML万字血书大总结,来看看你入门了吗?
  8. GBT 35273-2020 信息安全技术 个人信息安全规范
  9. html怎么写广告,基础教程:广告代码应该怎么写?
  10. 失去偏执的苹果会怎样?Android 会一统天下吗?