wx小程序turf.js判断点是否位于该多边形内部

1、当前打卡位置在地理围栏内判断。使用turf.js(地理空间分析库,处理各种地图算法)。

2、wx小程序在使用npm构建后,引用时一直会提示“ 'xxx.js' is not defined, require args

3、最终使用 "npm install @turf/boolean-point-in-polygon",到新建项目中,也可以直接使用下面代码。以下代码是方法“booleanPointInPolygon”,所以关联的方法,都是从npm下载下来的js中提炼出来的,直接用即可。文件名称命名为“boolean-point-in-polygon.js”

// index.tsconst  booleanPointInPolygon = function(point, polygon, options = {}) {if (!point) {throw new Error("point is required");}if (!polygon) {throw new Error("polygon is required");}const pt = getCoord(point);const geom = getGeom(polygon);const type = geom.type;const bbox = polygon.bbox;let polys = geom.coordinates;if (bbox && inBBox(pt, bbox) === false) {return false;}if (type === "Polygon") {polys = [polys];}let result = false;for (var i = 0; i < polys.length; ++i) {const polyResult = pointInPolygon(pt, polys[i]);if (polyResult === 0)return options.ignoreBoundary ? false : true;else if (polyResult)result = true;}return result;
}function feature(geom, properties, options = {}) {const feat = { type: "Feature" };if (options.id === 0 || options.id) {feat.id = options.id;}if (options.bbox) {feat.bbox = options.bbox;}feat.properties = properties || {};feat.geometry = geom;return feat;
}const point = function(coordinates, properties, options = {}) {if (!coordinates) {throw new Error("coordinates is required");}if (!Array.isArray(coordinates)) {throw new Error("coordinates must be an Array");}if (coordinates.length < 2) {throw new Error("coordinates must be at least 2 numbers long");}const geom = {type: "Point",coordinates};return feature(geom, properties, options);
}
const polygon = function (coordinates, properties, options = {}) {for (const ring of coordinates) {if (ring.length < 4) {console.log("Each LinearRing of a Polygon must have 4 or more Positions.")throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");}if (ring[ring.length - 1].length !== ring[0].length) {console.log("First and last Position are not equivalent.")throw new Error("First and last Position are not equivalent.");}for (let j = 0; j < ring[ring.length - 1].length; j++) {if (ring[ring.length - 1][j] !== ring[0][j]) {console.log("First and last Position are not equivalent.")throw new Error("First and last Position are not equivalent.");}}}const geom = {type: "Polygon",coordinates};return feature(geom, properties, options);
}function inBBox(pt, bbox) {return bbox[0] <= pt[0] && bbox[1] <= pt[1] && bbox[2] >= pt[0] && bbox[3] >= pt[1];
}
function getGeom(geojson) {if (geojson.type === "Feature") {return geojson.geometry;}return geojson;
}
function getCoord(coord) {if (!coord) {throw new Error("coord is required");}if (!Array.isArray(coord)) {if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {return [...coord.geometry.coordinates];}if (coord.type === "Point") {return [...coord.coordinates];}}if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {return [...coord];}throw new Error("coord must be GeoJSON Point or an Array of numbers");
}function pointInPolygon(p, polygon) {var i = 0;var ii = 0;var k = 0;var f = 0;var u1 = 0;var v1 = 0;var u2 = 0;var v2 = 0;var currentP = null;var nextP = null;var x = p[0];var y = p[1];var numContours = polygon.length;for (i; i < numContours; i++) {ii = 0;var contourLen = polygon[i].length - 1;var contour = polygon[i];currentP = contour[0];if (currentP[0] !== contour[contourLen][0] &&currentP[1] !== contour[contourLen][1]) {throw new Error('First and last coordinates in a ring must be the same')}u1 = currentP[0] - x;v1 = currentP[1] - y;for (ii; ii < contourLen; ii++) {nextP = contour[ii + 1];v2 = nextP[1] - y;if ((v1 < 0 && v2 < 0) || (v1 > 0 && v2 > 0)) {currentP = nextP;v1 = v2;u1 = currentP[0] - x;continue}u2 = nextP[0] - p[0];if (v2 > 0 && v1 <= 0) {f = (u1 * v2) - (u2 * v1);if (f > 0) { k = k + 1; }else if (f === 0) { return 0 }} else if (v1 > 0 && v2 <= 0) {f = (u1 * v2) - (u2 * v1);if (f < 0) { k = k + 1; }else if (f === 0) { return 0 }} else if (v2 === 0 && v1 < 0) {f = (u1 * v2) - (u2 * v1);if (f === 0) { return 0 }} else if (v1 === 0 && v2 < 0) {f = u1 * v2 - u2 * v1;if (f === 0) { return 0 }} else if (v1 === 0 && v2 === 0) {if (u2 <= 0 && u1 >= 0) {return 0} else if (u1 <= 0 && u2 >= 0) {return 0}}currentP = nextP;v1 = v2;u1 = u2;}}if (k % 2 === 0) { return false }return true}module.exports =  {booleanPointInPolygon,point,polygon
};

4、调用

 const polygon = turf.polygon( polygonCoords);const point = turf.point(pointCoords);// 使用Turf.js的booleanPointInPolygon方法判断点是否在多边形内const insidePolygon = turf.booleanPointInPolygon(point, polygon);console.log('是否在围栏内:' + insidePolygon);

5、参考官方文档

判断点是否在多边形内 | Turf.js中文网

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

反射、枚举以及lambda表达式

反射、枚举以及lambda表达式 反射定义用途反射基本信息反射相关的类Class类(反射机制的起源)Class类中的相关方法 反射示例获得Class对象的三种方式反射的使用 反射优点和缺点重点总结 枚举的使用背景及定义使用枚举优点缺点枚举和反射总结单例模式 Lambda表达式背景Lambda表达…

Java学习Day60:回家!(ElasticStatic)

1.what is ElasticStatic The Elastic Stack, 包括 Elasticsearch、 Kibana、 Beats 和 Logstash&#xff08;也称为 ELK Stack&#xff09;。能够安全可靠地获取任何来源、任何格式的数据&#xff0c;然后实时地对数据进行搜索、分析和可视化。 Elaticsearch&#xff0c;简称…

java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程

文章目录 PC Register堆虚拟机栈方法区(Metaspace元空间双亲委派机制类加载器 类装载的执行过程 PC Register 程序计数器&#xff08;Program Counter Register&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;中的一个组件&#xff0c;它在 JVM 的内存模型中扮演着非常…

Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Docker 概述 1.1 Docker 主要组成部分 1.2 Docker 安装 2.0 Docker 常见命令 2.1 常见的命令介绍 2.2 常见的命令演示 3.0 数据卷 3.1 数据卷常见的命令 3.2 常见…

恶意PDF文档分析记录

0x1 PDF是什么 PDF&#xff08;便携式文件格式&#xff0c;Portable Document Format&#xff09;是由Adobe Systems在1993年用於文件交换所发展出的文件格式。 因为PDF的文件格式性质广泛用于商业办公&#xff0c;引起众多攻击者对其开展技术研究&#xff0c;在一些APT&#…

SpringBoot集成itext导出PDF

添加依赖 <!-- PDF导出 --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf</groupId>&l…

不想后悔,混动车这样买

文 | AUTO芯球 作者 | 雷慢 不买一辆混动车&#xff0c; 你永远不知道自己有多抠&#xff01; 我有个跑滴滴的小伙伴&#xff0c; 他说近10年来最后悔的事&#xff0c; 就是没买个纯电续航长点的混动车&#xff0c; 怎么回事呢&#xff0c; 这个小伙伴今年买了辆纯电续航…

第一个C语言程序,带领我们进入C语言的大门!

第一个C语言程序&#xff0c;带领我们进入C语言的大门&#xff01; 我们有两种方式从计算机获得信息&#xff1a;一是看屏幕上的文字、图片、视频等&#xff0c;二是听从喇叭发出来的声音。让喇叭发出声音目前还比较麻烦&#xff0c;我们先来看看如何在屏幕上显示一些文字吧。p…

大模型到底是什么?小白也能看懂的科普贴,让你从大模型入门到大模型精通

&#xff08;图源网络&#xff09; 从去年到今年&#xff0c;大模型、chatGPT等概念和技术越来越火&#xff0c;但是像笔者一样的技术小白一直对大模型是一种似懂非懂的状态。鉴于最近在做基于大模型和Agent的上层AI应用&#xff0c;如若不了解底层概念&#xff0c;始终还是会…

qt QStandardPaths 详解

1、概述 QStandardPaths是Qt框架中的一个类&#xff0c;它提供了一种跨平台的方式来访问标准的位置&#xff0c;如应用程序的数据目录、配置目录、缓存目录、临时文件目录等。这些位置通常是用户特定的&#xff0c;并且遵循操作系统的标准和惯例。通过使用QStandardPaths&…

对node工程进行压力测试与性能分析

在系统上线前&#xff0c;为了看下系统能承受多大的并发和并发下的负载情况&#xff0c;进行了一轮压测。在压测过程中&#xff0c;发现服务器的cpu飚的的非常高&#xff0c;而tps&#xff0c;接口耗时、服务可用等都是正常的&#xff0c;卧槽&#xff0c;这就奇了怪了&#xf…

昆明华厦眼科医院在大观小学开展近视科普教育讲座

为响应全社会对青少年近视防控的号召&#xff0c;昆明华厦眼科医院组织了一场近视科普教育讲座&#xff0c;活动走进大观小学&#xff0c;旨在通过专业的眼科知识普及&#xff0c;提升小学生们对眼健康的认知&#xff0c;培养他们爱眼护眼的意识。讲座结束后还特地为教师群体进…

MPLS基本原理

Multiprotocol Label Switching 多标签交换 前言 MPLS位于TCP/IP协议栈中的链路层和网络层之间,用于向IP层提供连接服务,同时又从链路层达到服务.MPLS以标签交换代替IP转发. MPLS并不是一种业务或者应用,它实际上是一种隧道技术.这种技术不仅支持多种高层协议与业务,而且在一…

《MarsCode:编程领域的智能新势力》

《MarsCode&#xff1a;编程领域的智能新势力》 一、MarsCode 的诞生与发展&#xff08;一&#xff09;逐步崛起的历程&#xff08;二&#xff09;与各方的合作与影响 二、MarsCode 的独特魅力&#xff08;一&#xff09;强大的功能特点&#xff08;二&#xff09;多语言支持与…

PyInstaller未包含预编译引导程序

1 现象 在使用 PyInstaller 打包 Python 应用时&#xff0c;遇到了一个错误&#xff0c;错误信息如下&#xff1a; Fatal error: PyInstaller does not include a pre-compiled bootloader for your platform. For more details and instructions how to build the bootloade…

华为HCIP-openEuler考试内容大纲:备考必看!

华为HCIP-openEuler认证考试作为ICT领域的一项重要技术认证&#xff0c;已经成为越来越多IT从业者追求的目标。无论你是想提升自己的技术能力&#xff0c;还是为了未来的职业发展&#xff0c;HCIP-openEuler都是一个极具价值的认证。那么&#xff0c;如何高效备考&#xff0c;顺…

编程之路,从0开始:知识补充篇

Hello大家好&#xff0c;很高兴我们又见面了&#xff01; 给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 这一篇我们来补充一下在之前篇目没讲到的知识&#xff0c;并结合一些码友的私信提问和我在编程中遇到的问题&#xff0c;做一些易错点或易混点的讲解。 …

免费PC游戏加速器--慕讯公益加速器

百度网盘链接&#xff1a; 慕讯公益加速器 提取码: y54m 官网&#xff1a; 慕讯公益加速器 优点&#xff1a; 1.不像其他加速器假免费&#xff0c;但支持的话可以向软件捐款 2.加速游戏很全&#xff08;Nikke等游戏都可以选择它&#xff09;&#xff0c;可以自由选择节点 …

git 常用命令大全

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、git是什么&#xff1f;二、工作中常用git命令集合三、部分git命令注意事项四、git reset 的五种模式五、总结 前言 git命令 其实不管是服务端还是前端&am…

【JAVA毕业设计】基于Vue和SpringBoot的校园资料分享平台

博主说明&#xff1a;本文项目编号 T 059 &#xff0c;文末自助获取源码 \color{red}{T059&#xff0c;文末自助获取源码} T059&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…