给定一组经纬度如何判断某点是否在这组经纬度的范围之内(电子围栏实现代码)

方法一:

使用JTS Topology Suite 是 Java 的空间数据模型和空间分析操作的库,用于处理地理空间数据和进行空间分析。

1.1引入maven

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

 1.2:代码实现

@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "坐标对象", description = "")
@Data
public class CoordinateGeog  implements Comparator<CoordinateGeog> {@ApiModelProperty("经度")private BigDecimal lng;@ApiModelProperty("纬度")private BigDecimal lat;@Overridepublic int compare(CoordinateGeog point1, CoordinateGeog point2) {double angle1 = Math.atan2(point1.getLat().subtract(lat).doubleValue(),point1.getLng().subtract(lng).doubleValue());double angle2 = Math.atan2(point2.getLat().subtract(lat).doubleValue(),point2.getLng().subtract(lng).doubleValue());return Double.compare(angle1, angle2);}
}

public class SpatialGeographyUtil {/*** 给定一组经纬度坐标集合,判断某点坐标是否在这组坐标所围的范围之内*/public static Polygon constructionScope( List<CoordinateGeog> innerCoordinateGeogs,GeometryFactory geometryFactory){List<Coordinate> coordinates = new ArrayList<>();innerCoordinateGeogs.forEach(i -> {Coordinate coordinate = new Coordinate(i.getLng().doubleValue(), i.getLat().doubleValue());coordinates.add(coordinate);});// 对坐标点进行极角排序sortCoordinatesByPolarAngle(coordinates);// 确保首尾坐标点相同,以确保闭合List<Coordinate> newCoordinates = endToEnd(coordinates);Coordinate[] coordinatesArray = newCoordinates.toArray(new Coordinate[newCoordinates.size()]);LinearRing linearRing = geometryFactory.createLinearRing(coordinatesArray);return geometryFactory.createPolygon(linearRing, null);}//按照参考点计算每个点相对于参考点的极角,然后进行排序public static void sortCoordinatesByPolarAngle(List<Coordinate> coordinates) {Coordinate reference = findReferencePointCoordinate(coordinates);coordinates.sort(Comparator.comparingDouble(point ->Math.atan2(point.y - reference.y, point.x - reference.x)));}//找到具有最小纬度的点public static Coordinate findReferencePointCoordinate(List<Coordinate> coordinates) {Coordinate reference = coordinates.get(0);for (Coordinate point : coordinates) {if (point.y < reference.y || (point.y == reference.y && point.x < reference.x)) {reference = point;}}return reference;}private static List<Coordinate> endToEnd(List<Coordinate> coordinates) {if (!coordinates.isEmpty()) {Coordinate first = coordinates.get(0);Coordinate last = coordinates.get(coordinates.size() - 1);if (!first.equals2D(last)) {coordinates.add(new Coordinate(first));}}return coordinates;}
}

方法二:.Path2D 是 Java 中用于创建和操作基本几何形状(如线条和曲线)的类。它是 Java 2D API 中的一部分,提供了一种可用于绘制 2D 图形的机制。

public class SpatialGeographyUtil {public static Path2D.Double createClosedPathForPolygon(List<CoordinateGeog> innerCoordinateGeogs) {// 确保首尾坐标点相同,以确保闭合List<CoordinateGeog> coordinateGeogs = ensurePolygonClosure(innerCoordinateGeogs);// 对坐标点进行极角排序List<CoordinateGeog> newCoordinateGeogs = sortPointsByPolarAngle(coordinateGeogs);Path2D.Double path = new Path2D.Double();for (int i = 0; i < newCoordinateGeogs.size() - 1; i++) {CoordinateGeog coords = newCoordinateGeogs.get(i);if (i == 0) {path.moveTo(coords.getLng().doubleValue(), coords.getLat().doubleValue());} else {path.lineTo(coords.getLng().doubleValue(), coords.getLat().doubleValue());}}path.closePath();return path;}public static Boolean checkPointInPathContainment(Path2D path, double lng, double lat) {Point2D point2Dr= new Point2D.Double(lng,lat);return path.contains(point2Dr);}public static List<CoordinateGeog> sortPointsByPolarAngle(List<CoordinateGeog> points) {// 找到最左下角的点作为参考点CoordinateGeog reference = findReferencePoint(points);// 使用极角比较器进行排序Collections.sort(points, new CoordinateGeog(reference.getLng(), reference.getLat()));return points;}//确保多边形闭合public static List<CoordinateGeog> ensurePolygonClosure(List<CoordinateGeog> polygon) {CoordinateGeog firstCoords = polygon.get(0);CoordinateGeog lastCoords = polygon.get(polygon.size() - 1);if (!firstCoords.getLng().equals(lastCoords.getLng()) || !firstCoords.getLat().equals(lastCoords.getLat())) {polygon.add(firstCoords); // 如果首尾不相连,将第一个点添加到最后}return polygon;}//集合中找到一个作为参考点的特定点public static CoordinateGeog findReferencePoint(List<CoordinateGeog> points) {CoordinateGeog reference = points.get(0);for (CoordinateGeog point : points) {if (point.getLat().compareTo(reference.getLat()) < 0 ||(point.getLat().compareTo(reference.getLat()) == 0 && point.getLng().compareTo(reference.getLng()) < 0)) {reference = point;}}return reference;}}

总结:

两个方法都是用来处理多边形和点的关系,但是它们的功能和逻辑略有不同。constructionScope 主要负责创建多边形,而 isPointInPolygon 主要用于判断点是否在多边形内部。两者都使用了极角排序的方法来确保多边形的正确性,并在需要时确保多边形的闭合。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/191904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代数学笔记6: 群同态基本定理,循环群结构定理

群同态 ρ : G 1 ( , ⋅ ) → G 2 ( , ∘ ) g ↦ ρ ( g ) \rho:G_1(\ ,\cdot)\to G_2(\ ,\circ)\\ \qquad\ \ g\mapsto \rho(g) ρ:G1​( ,⋅)→G2​( ,∘) g↦ρ(g) ∀ g 1 , g 2 ∈ G \forall g_1,g_2\in G ∀g1​,g2​∈G, 有 ρ ( g 1 ⋅ g 2 ) ρ ( g 1 ) ∘ ρ ( g 2 …

解决报错:error: (-215:Assertion failed) inv_scale_x > 0 in function ‘cv::resize‘

需求背景 欲使用opencv的resize函数将图像沿着纵轴放大一倍&#xff0c;即原来的图像大小为(384, 512), 现在需要将图像放大为(768, 512)。 源码 import cv2 import numpy as np# 生成初始图像 img np.zeros((384, 512), dtypenp.uint8) img[172:212, 32:-32] 255 H, W …

卷积神经网络-3D医疗影像识别

文章目录 一、前言二、前期工作1. 介绍2. 加载和预处理数据 二、构建训练和验证集三、数据增强四、数据可视化五、构建3D卷积神经网络模型六、训练模型七、可视化模型性能八、对单次 CT 扫描进行预测 一、前言 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&a…

题目:DNA序列修正(蓝桥OJ 3904)

题目描述&#xff1a; 解题思路&#xff1a; 从左到右扫描第一条 DNA 序列和第二条 DNA 序列的每一个位置&#xff0c;检查它们是否互补。 如果某个位置不互补&#xff0c;我们需要寻找第二条 DNA 序列中后续位置的碱基&#xff0c;看是否可以通过交换使这两个位置都互补。如果…

〖大前端 - 基础入门三大核心之JS篇㊹〗- DOM事件委托

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

ssl下载根证书和中间证书

为了保证客户端和服务端通过HTTPS成功通信&#xff0c;您在安装SSL证书时&#xff0c;也需要安装根证书和中间证书。本文介绍如何获取根证书和中间证书。 使用说明 如果您的业务用户通过浏览器访问您的Web业务&#xff0c;则您无需关注根证书和中间证书&#xff0c;因为根证书…

ELK高级搜索,深度详解ElasticStack技术栈-下篇

前言&#xff1a;ELK高级搜索&#xff0c;深度详解ElasticStack技术栈-上篇 14. search搜索入门 14.1. 搜索语法入门 14.1.1 query string search 无条件搜索所有 GET /book/_search结果&#xff1a; {"took" : 969,"timed_out" : false,"_shar…

头歌JUnit单元测试相关实验进阶

JUnit是一个由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架&#xff08;regression testing framework&#xff09;&#xff0c;主要供 Java 开发人员编写单元测试。Junit在极限编程和重构中被极力推荐使用&#xff0c;因为它可以大大地提高开发的效率。 Junit的特性&…

Spring——全局异常处理(介绍@RestControllerAdvice和@ExceptionHandler)

目录 1.RestControllerAdviceExceptionHandler的作用2.实现原理3.各种特性 1.RestControllerAdviceExceptionHandler的作用 RestControllerAdvice注解 RestControllerAdvice是Spring框架提供的注解&#xff0c;用于全局异常处理。它将异常处理方法集中在一个类中&#xff0c;…

力扣66. 加一

文章目录 力扣66. 加一示例代码实现总结收获 力扣66. 加一 示例 代码实现 class Solution {public int[] plusOne(int[] digits) {int ndigits.length;for(int in-1;i>0;i--){if(digits[i]!9){digits[i];for(int ji1;j<n;j){digits[j]0;}return digits;}}int[] resnew i…

selenium环境安装

一、下载安装python 下载python安装python设置python环境变量安装selenium &#xff08;1&#xff09;下载python 您可以从Python官方网站&#xff08;https://www.python.org/downloads/&#xff09;下载Python。在页面上&#xff0c;您将看到不同版本的Python供您选择。根…

Qt中对Udp数据打包发送和接收(续)

这次用一个更加复杂的数据包举例。 心跳报文结构如下&#xff1a; struct HeartbeatPacket {quint16 protocolId;quint16 version;quint16 totalLength;quint16 reserve;QByteArray senderAddress;QByteArray receiverAddress;quint8 sequenceNumber;quint8 acknowledgementN…

MVCC-

文章目录 1. 什么是MVCC2. 快照读和当前读3. 复习4. MVCC实现原理之ReadView5. 总结 文章目录 1. 什么是MVCC2. 快照读和当前读3. 复习4. MVCC实现原理之ReadView5. 总结 1. 什么是MVCC 口述&#xff1a;MVCC其实他是解决这种读-写的情况的&#xff0c;当然读-写也可以用 锁来…

医保支付方式探索——利益共享机制的文章分析

Care-coordination: Gain-sharing Agreements in Bundled Payment Models 分析一下这篇文章&#xff0c;这篇文章于2021年发表在POMS上&#xff0c;但是引用量没有那么高。这篇文章涉及到医疗捆绑支付&#xff0c;应该可以学习一下。 文章研究一个在一个以最小成本为目标的质…

python+Appium自动化:python多线程多并发启动appium服务

Python启动Appium 服务 使用Dos命令或者bat批处理来手动启动appium服务&#xff0c;启动效率低下。如何将启动Appium服务也实现自动化呢&#xff1f; 这里需要使用subprocess模块&#xff0c;该模块可以创建新的进程&#xff0c;并且连接到进程的输入、输出、错误等管道信息&…

oj塞氪算法练习

向量点积计算 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int[] a new int[n];int[] b new int[n];for (int i 0; i < n; i) {a[i] scanner.nextInt();}…

汇编语言实现音乐播放器

目标程序 用汇编语言实现一个音乐播放器&#xff0c;并支持点歌 Overview 乐曲是按照一定的高低、长短和强弱关系组成的音调&#xff0c;在一首乐曲中&#xff0c;每个音符的音高和音长与频率和节拍有关&#xff0c;因此我们要分别为3首要演奏的乐曲定义一个频率表和一个节拍…

jenkins使用nexus插件

nexus介绍 Nexus 是一个强大的仓库管理工具&#xff0c;用于管理和分发 Maven、npm、Docker 等软件包。它提供了一个集中的存储库&#xff0c;用于存储和管理软件包&#xff0c;并提供了版本控制、访问控制、构建和部署等功能。 Nexus 可以帮助开发团队提高软件包管理的效率和…

解决element ui tree组件不产生横向滚动条

结果是这样的 需要在tree的外层&#xff0c;包一个父组件 <div class"tree"><el-tree :data"treeData" show-checkbox default-expand-all></el-tree></div> 在css里面这样写,样式穿透按自己使用的css编译器以及框架要求就好 &l…

使用waitress与nginx在腾讯云上进行flask项目部署

1.首先介绍一下waitress与nginx是啥&#xff0c; Waitress: 类别&#xff1a; Waitress 是一个用于 Python Web 应用程序的 WSGI&#xff08;Web Server Gateway Interface&#xff09;服务器。WSGI 是 Python Web 应用程序和 Web 服务器之间的标准接口&#xff0c;允许开发人员…