JAVA使用JTS 判断坐标点是否在坐标多边形内部

article/2025/8/15 3:02:25

JAVA使用JTS 判断坐标点是否在坐标多边形内部

  • 思路
  • Geometry之间的关系
  • API及参考博客
  • 代码
    • 依赖
    • 工具类
    • 测试类

思路

判断坐标点是否在坐标多边形内部,首先不能直接计算坐标点,是需要字符串坐标点转化为地理空间数据Geometry,然后使用JTS包中提供得API判断Geometry几何图形的关系
在这里插入图片描述

Geometry之间的关系

  • 相等(Equals):几何形状拓扑上相等。
  • 脱节(Disjoint):几何形状没有共有的点。
  • 相交(Intersects):几何形状至少有一个共有点(区别于脱节)
  • 接触(Touches):几何形状有至少一个公共的边界点,但是没有内部点。
  • 交叉(Crosses):几何形状共享一些但不是所有的内部点。
  • 内含(Within):几何形状A的线都在几何形状B内部。
  • 包含(Contains):几何形状B的线都在几何形状A内部(区别于内含)
  • 重叠(Overlaps):几何形状共享一部分但不是所有的公共点,而且相交处有他们自己相同的区域。

API及参考博客

官方API org.locationtech.jts.geom包中,Geometry类
JTS Geometry关系判断和分析

百度地图拾取坐标系
java 使用jts-jar计算任意多边形的内点、质点(不是中心也不是重心,内点经测试都在图形内部)

代码

依赖

		<dependency><groupId>org.locationtech.jts</groupId><artifactId>jts-core</artifactId><version>1.18.1</version></dependency>

工具类

package com.fang.industry.service.common.utils;import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point;
import org.locationtech.jts.geom.Polygon;/*** 坐标点与坐标面关系判断工具类(待完善)* @author: guochao.bj@fang.com* @createDate: 2021/7/22 13:52*/
public class CoordinateUtil {/*** 将字符串多坐标点转换为坐标数组* @param latLonString "116.616634,40.272665|116.644733,40.280371|116.636181,40.264352|116.616634,40.272665"* @return org.locationtech.jts.geom.Coordinate[]* @author guochao.bj@fang.com* @date 2021/7/22*/public static Coordinate[] getCoordinateArray(String latLonString){String[] split = latLonString.split("\\|");Coordinate[] coordinateArray = new Coordinate[split.length];for (int i = 0; i < split.length; i++) {String[] LatLng = split[i].split(",");Coordinate coordinate = new Coordinate(Double.valueOf(LatLng[0]),Double.valueOf(LatLng[1]));coordinateArray[i]=coordinate;}return coordinateArray;}/*** 判断坐标点是否在多坐标点组成的多边形面内* @param coordinateArray* @param coordinate* @return boolean* @author guochao.bj@fang.com* @date 2021/7/22* within 判断是否在内部,边缘点返回false* intersects 判断是否相交,弥补 within边缘点缺陷,*/public static boolean withinAndIntersects(Coordinate[] coordinateArray,Coordinate coordinate){boolean result=false;//小于3个点无法组成多边形if (coordinateArray.length<3){return result;}//必须首尾坐标点相同组成闭合多边形if (!(coordinateArray[0].equals2D(coordinateArray[coordinateArray.length-1]))){return result;}GeometryFactory geometryFactory = new GeometryFactory();Point point = geometryFactory.createPoint(coordinate);Polygon polygon = geometryFactory.createPolygon(coordinateArray);if (point.within(polygon)||point.intersects(polygon)){result=true;}return result;}}

测试类

package com.fang.industry.service.common.utils;import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;/*** 坐标点与坐标面关系判断工具类测试类* @author guochao.bj@fang.com* @date 2021/7/22*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class CoordinateUtilTest {@Testpublic void getLatLonMap() {String a="116.616634,40.272665|116.604626,40.269517|116.604256,40.267022|116.582632,40.262007|116.578637,40.268173|116.575027,40.260284|116.542714,40.249840|116.540721,40.256634|116.530844,40.256761|116.529081,40.242442|116.518795,40.238155|116.508835,40.250610|116.502856,40.235876|116.494887,40.245896|116.482931,40.241651|116.478228,40.238911|116.491567,40.236873|116.484921,40.232892|116.493219,40.229194|116.489303,40.220479|116.476949,40.220260|116.474955,40.212485|116.472963,40.218813|116.470493,40.210451|116.461000,40.220081|116.449029,40.208498|116.449031,40.223531|116.445337,40.208680|116.434692,40.208993|116.434572,40.223483|116.445940,40.228981|116.420624,40.228557|116.417148,40.247080|116.411083,40.252140|116.398038,40.251971|116.397089,40.255021|116.396555,40.251012|116.399081,40.248318|116.409655,40.249588|116.409755,40.240340|116.385070,40.244620|116.375054,40.228341|116.369045,40.231866|116.363033,40.222390|116.342860,40.220934|116.352739,40.218952|116.345081,40.208936|116.351004,40.195352|116.367613,40.202974|116.367403,40.194606|116.349284,40.192942|116.367036,40.191520|116.364301,40.186238|116.375250,40.182781|116.348998,40.178180|116.326446,40.184397|116.326949,40.192618|116.323442,40.184390|116.311506,40.182870|116.323412,40.181363|116.317176,40.176629|116.290573,40.178533|116.299724,40.182851|116.286875,40.188295|116.278584,40.184827|116.286874,40.181287|116.282869,40.176338|116.264858,40.176086|116.244121,40.172817|116.242360,40.170818|116.244949,40.170733|116.245121,40.172560|116.264858,40.171562|116.266859,40.174147|116.284871,40.173312|116.286874,40.176130|116.287456,40.170252|116.281876,40.168828|116.306904,40.167816|116.310911,40.160271|116.327394,40.167345|116.340220,40.148166|116.352828,40.165121|116.385173,40.159104|116.385056,40.138803|116.344984,40.138503|116.320930,40.148526|116.320930,40.146416|116.339168,40.136718|116.320544,40.138497|116.316921,40.145479|116.305051,40.138854|116.337197,40.130912|116.285742,40.122827|116.305269,40.123227|116.302890,40.112222|116.284512,40.112474|116.260759,40.140718|116.272626,40.110588|116.289289,40.102829|116.274851,40.088198|116.303423,40.079384|116.326932,40.056681|116.328710,40.056890|116.327174,40.057130|116.327078,40.059032|116.323880,40.061837|116.323385,40.065341|116.318237,40.070194|116.317619,40.074166|116.338833,40.068783|116.333954,40.062901|116.346978,40.055998|116.363284,40.055225|116.348982,40.054824|116.343099,40.046917|116.352989,40.041418|116.356998,40.046995|116.355455,40.036939|116.361815,40.036950|116.352987,40.026920|116.343159,40.034917|116.349302,40.022928|116.373668,40.021610|116.366494,40.016956|116.375026,40.009423|116.381853,40.013794|116.380956,40.000975|116.395953,40.000987|116.381818,39.994975|116.397597,39.993538|116.407049,39.980352|116.408511,39.993530|116.417048,39.992806|116.424689,40.007340|116.447562,40.007514|116.447007,39.996109|116.454321,40.004945|116.456383,40.013544|116.472687,40.014904|116.465568,40.016921|116.466949,40.028928|116.478918,40.026113|116.488824,40.032861|116.482906,40.039300|116.496921,40.036769|116.500841,40.057098|116.529320,40.038742|116.524747,40.028710|116.536443,40.038987|116.574614,40.033374|116.599304,40.034627|116.578060,40.036092|116.577048,40.040207|116.581131,40.040113|116.580815,40.044431|116.582654,40.044588|116.584604,40.047695|116.582567,40.046676|116.582409,40.044834|116.580451,40.044796|116.579594,40.041654|116.575690,40.040644|116.572617,40.035463|116.543427,40.042705|116.544324,40.055064|116.565610,40.062660|116.556199,40.066678|116.561887,40.095427|116.568631,40.090357|116.574935,40.096335|116.574623,40.109041|116.584611,40.103016|116.586964,40.090636|116.578983,40.086643|116.588603,40.062747|116.593596,40.078632|116.583334,40.082639|116.597536,40.085697|116.594605,40.103453|116.606878,40.104905|116.608606,40.091323|116.610327,40.104914|116.615041,40.103063|116.618615,40.096789|116.614243,40.112635|116.620879,40.114899|116.627026,40.084642|116.626087,40.109182|116.628629,40.099757|116.635691,40.108653|116.630304,40.114976|116.640652,40.109256|116.642657,40.115341|116.661224,40.116694|116.643480,40.117486|116.640654,40.124435|116.630309,40.118324|116.638483,40.128658|116.628633,40.135386|116.624626,40.129956|116.613972,40.143993|116.554477,40.152497|116.568192,40.156664|116.554333,40.158689|116.562243,40.175087|116.587411,40.172644|116.586822,40.174848|116.578626,40.177665|116.562278,40.178300|116.563190,40.194677|116.556669,40.197323|116.556376,40.194690|116.561460,40.186679|116.558662,40.178163|116.548348,40.178364|116.544701,40.185943|116.532374,40.182745|116.531849,40.208750|116.552680,40.204841|116.558436,40.210688|116.544289,40.212303|116.547134,40.222714|116.532337,40.224345|116.532503,40.234996|116.554680,40.239426|116.556673,40.228613|116.558120,40.239244|116.570956,40.240360|116.558117,40.242140|116.560367,40.252992|116.592625,40.261461|116.604830,40.266448|116.605079,40.268201|116.612630,40.268144|116.616634,40.270424|116.616650,40.272642|116.618402,40.272659|116.616634,40.272665";Coordinate[] coordinateArray = CoordinateUtil.getCoordinateArray(a);System.out.println(coordinateArray);}@Testpublic void withinAndIntersects() {String a="116.56674900,39.98920100|116.281117,40.004536|116.300664,39.8567|116.555352,39.854484|116.56674900,39.98920100";String b="116.616634,40.272665|116.644733,40.280371|116.636181,40.264352|116.616634,40.272665";String c="116.616634,40.272665|116.644733,40.280371|116.636181,40.264352";String d="116.616634,40.272665|116.644733,40.280371";Coordinate[] latLonMap = CoordinateUtil.getCoordinateArray(a);//116.636037,40.270353Coordinate coordinate = new Coordinate(116.616634, 40.272665);Coordinate coordinate2 = new Coordinate(116.636037, 40.270353);Coordinate coordinate3 = new Coordinate(116.56674900, 39.98920100);Coordinate coordinate4 = new Coordinate(116.36024000, 39.93912300);boolean within = CoordinateUtil.withinAndIntersects(latLonMap, coordinate3);System.out.println(within);System.out.println(CoordinateUtil.withinAndIntersects(latLonMap, coordinate4));Assert.assertTrue(within);Assert.assertTrue(CoordinateUtil.withinAndIntersects(latLonMap, coordinate4));}
}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/8oryWfQv.shtml

相关文章

JTS学习笔记

JTS学习笔记 基础的类 Geometry geom对象Coordinate坐标类Point Point对象MultiPoint 基本对象MultiPoint等等GeometryFactory工厂对象PreparedGeometryFactoryPreparedGeometry 几何对象Geometry public abstract class Geometry implements Cloneable, Comparable, Seria…

JTS-Angle GIS几何角度计算使用说明(十八)

org.locationtech.jts.algorithm.Angle 角度计算使用说明 示例代码库 Angle 角度计算 1.Angle.angle(p0,p1) public static double angle(Coordinate p0, Coordinate p1) {double dx p1.x - p0.x;double dy p1.y - p0.y;return Math.atan2(dy, dx); }返回与x轴正方向的夹…

java jts_Java Topology Suite (JTS)与空间数据模型

JTS是Java的处理地理数据的API&#xff0c;它提供以下功能&#xff1a; 实现了OGC关于简单要素SQL查询规范定义的空间数据模型 一个完整的、一致的、基本的二维空间算法的实现&#xff0c;包括二元运算(例如touch和overlap)和空间分析方法(例如intersection和buffer) 一个显示的…

java jts点到面的距离_jts-空间索引

前言&#xff1a; 如果您对JTS这三个词还是没有一个概念&#xff0c;那么推荐您关注一下sinoly的博客。这个我能够找到为数不多的关于jts的中文资料。 http://www.blogjava.net/sinoly/archive/2007/02/09/99042.html 下面这段话就是摘抄自sinoly老兄的博客&#xff1a; ......…

JTS Geometry关系判断和分析

关系判断 Geometry之间的关系有如下几种&#xff1a; 相等(Equals)&#xff1a; 几何形状拓扑上相等。 脱节(Disjoint)&#xff1a; 几何形状没有共有的点。 相交(Intersects)&#xff1a; 几何形状至少有一个共有点&#xff08;区别于脱节&#xff09; 接触(Touches)&a…

JTS Geometry用例分析

微信搜索&#xff1a;“二十同学” 公众号&#xff0c;欢迎关注一条不一样的成长之路 拓扑关系 GeometryTest import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; import…

JTS 笔记

简介 JTS由加拿大的VividSolutions公司开发&#xff0c;是一个用Java语言描述的几何拓扑套件&#xff0c;遵循OpenGIS的Simple Feature Specification&#xff0c;封装了2D几何类型和非常多的空间分析操作&#xff0c;而且包含了不少常见的计算几何算法实现。     JTS被广泛…

jts 简介、中文文档、中英对照文档 下载

jts 文档 下载链接&#xff08;含jar包、源码、pom&#xff09; 组件名称中文-文档-下载链接中英对照-文档-下载链接jts-1.13.jarjts-1.13-API文档-中文版.zipjts-1.13-API文档-中英对照版.zip jts 简介 JTS拓扑套件 JTS拓扑套件是一个用于建模和操作二维线性几何的API。它…

GeoTools——JTS的相关介绍和操作

GeoTools——JTS的相关介绍&#xff08;一&#xff09; JTS拓扑套件是GeoTools用于提供Geometry数据结构的实现&#xff0c;Geometry主要是指几何形状。 想要使用geoTools——JTS相关的操作可以导入以下的依赖<properties><geotools.version>17.1</geotools.ver…

java topo: 开源jtopo框架

java web 非本人研究方向&#xff0c;只是作为拓展知识涉猎范围 原文链接&#xff1a;http://www.jtopo.com/index.html jTopo是什么? jTopo&#xff08;Javascript Topology library)是一款完全基于HTML5 Canvas的关系、拓扑图形化界面开发工具包。 jTopo关注于数据的图形展…

JTopo踩坑记 -- React项目中使用JTopo

JTopo踩坑记 – React项目中使用JTopo JTopo-in-node & JTopo 最近实习公司一个项目需要绘制电网的拓扑图&#xff0c;大致要求的效果如下&#xff1a; 首先想到的是Echarts和d3&#xff0c;因为这个项目其他图表都是使用的Echarts&#xff0c; 但是在Echarts的官方示例…

jtopo的项目实战(七)

话接上回&#xff0c;继续实现jtopo本身不具有的一些功能&#xff0c;有讲的不对的地方&#xff0c;欢迎大家在评论区留言提出&#xff0c;博主基本每天在线&#xff0c;看到都会及时回复的&#xff0c;我们一起进步&#xff0c;奥利给&#xff0c;还有&#xff0c;码字不易&am…

关于vue3.0项目引入jtopo出现的各种问题汇总

jtopo官网demo网址&#xff1a;http://www.jtopo.com/demo.html 最近的项目需要用到jtopo&#xff0c;关于jtopo的引入&#xff0c;之前自己也都尝试过&#xff0c;没想到这次引入会出现这么多问题&#xff0c;所以大概总结一下 1、借用同事以前的经验来引入 npm install jto…

JTopo 框架教程之一:初始JTopo 框架

JTopo 是什么&#xff1f; JTopo&#xff08;Javascript Topology library)是一款完全基于HTML5 Canvas的关系、拓扑图形化界面开发工具包。jTopo关注于数据的图形展示&#xff0c;它是面向开发人员的&#xff0c;需要进行二次开发。使用jTopo很简单&#xff0c;可以快速创建一…

jtopo的项目实战(一)

前言 初识jtopo是因为项目中需要一个能够动态绘制网络拓扑图的插件&#xff0c;不但能画出基本的网络拓扑结构&#xff0c;还要能够标识出网络设备的类型以及端口设置&#xff0c;甚至是网络连线的流量信息等&#xff0c;基于这个需求查找了很多资料&#xff0c;初步选中了几款…

jtopo的项目实战(二)

话接上回&#xff0c;继续实现jtopo本身不具有的一些功能&#xff0c;有讲的不对的地方&#xff0c;欢迎大家留言提出&#xff0c;我们一起进步&#xff0c;奥利给&#xff0c;还有&#xff0c;码字不易&#xff0c;如果觉得博主写的不错的欢迎打赏哈&#xff01; 2.美化节点之…

vue、jtopo绘制鱼骨图

效果如下图所示&#xff1a; 一、文件目录结构&#xff1a; 二、绘制png的鱼头、鱼尾图片 fish_head.png&#xff1a; fish_tail.png&#xff1a; 三、下载js文件 jquery、jtopo请到官网下载。 四、编写鱼骨图核心文件&#xff1a;MakFishBone.js let MakFishBo…

通过JTopo.js在网页绘制网络拓扑图

项目中遇到要在网页中绘制网络拓扑图的需求&#xff0c;要求节点具备点击、拖拽、缩放等交互功能&#xff0c;并且可以显示/隐藏详细信息&#xff0c;数据是设备实时上报来的。 综上&#xff0c;用画拓扑图的工具画一张固定的图片偷懒显然是不行的&#xff0c;最好是找到一个封…

JTopo添加动态连线

效果如下 先在 JTopo 的 link 原型上定义一个方法 window.requestAnimationFrame window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame JTopo.Link.prototype.drawanimepic functi…

JTopo + Vue 实现自定义拖拽流程图

JTopo Vue 实现自定义拖拽流程图 进入体验效果 进入github 市场上做流程图的插件比较多&#xff0c;这里介绍一种基于canvas编写的js插件&#xff0c;结合vue框架做出精美的流程图 首先搭建vue框架&#xff0c;这里就不做介绍&#xff0c;由于jtopo官方demo里用到了jquery&am…