微信小程序 地图 使用 射线法 判断目标点是否在多边形内部(可用于判断当前位置是否在某个区域内部)
目录
- 射线法
- 原理
- 简要逻辑代码
- 小程序代码
- 调试基础库
- 小程序配置
- 地图数据
- 地图多边形
- 点与多边形关系
射线法
原理
使用射线法来判断,目标点是否在多边形内部
这里简单说下,具体细节可以看这篇文章
平面几何:判断点是否在多边形内(射线法)
原理很简单,从点引出一条射线,计算射线和多边形的交点数量。
交点数如果是 奇数,说明点 在 多边形内;如果是 偶数,则点 不在 多边形内。
射线方向没有要求,通常选择水平或垂直方向的射线,能够有效减少计算量。这里选择 向右的射线
然后就是遍历多边形的所有边,判断边线段和射线是否有交点,有交点就给相交数加 1。
还需要处理一些特殊情况,就是 射线刚好穿过多边形的顶点的情况
① 点的两边都在射线同一侧
② 点的两边在射线不同侧
③ 与多边形的一条边共线
此时可以使用 叉积 判断 目标点是否在边的左侧/右侧
简要逻辑代码
const isPointInPolygon = (polygon, pt) => {let count = 0;for (let i = 0; i < polygon.length; i++) {let a = polygon[i];let b = polygon[(i + 1) % polygon.length];if (a.y > b.y) {[a, b] = [b, a];}if (a.y <= pt.y && b.y > pt.y) {const crossProduct = (pt.x - a.x) * (b.y - a.y) - (b.x - a.x) * (pt.y - a.y);if (crossProduct === 0) {return true;}if (crossProduct > 0) {count++;}}}return count % 2 === 1;
};
小程序代码
项目结构树
.
├── app.js
├── app.json
├── app.wxss
├── data
│ └── map_data.js
├── pages
│ ├── polygons
│ │ ├── polygons.js
│ │ ├── polygons.json
│ │ ├── polygons.wxml
│ │ └── polygons.wxss
│ └── range
│ ├── range.js
│ ├── range.json
│ ├── range.wxml
│ └── range.wxss
├── project.config.json
├── project.private.config.json
└── sitemap.json
调试基础库
3.8.0
小程序配置
app.json
{"pages": ["pages/polygons/polygons","pages/range/range"],"window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": "#ffffff","navigationBarTitleText": "点与多边形","navigationBarTextStyle": "black"},"style": "v2","sitemapLocation": "sitemap.json","lazyCodeLoading": "requiredComponents","useExtendedLib": {"weui": true},"resolveAlias": {"@data/*": "data/*"}
}
地图数据
data/map_data.js
/* data/map_data.js */
// 地图相关
module.exports = {// 地图部分参数// 学校中心点坐标longitude: 110.27672,latitude: 25.0937,// 是否展示 POI 点enablepoi: true,// 是否显示带有方向的当前定位点showLocation: true,// 缩放级别scale: 16,// 闭合多边形points: [{"latitude": 25.098567,"longitude": 110.280995},{"latitude": 25.097711,"longitude": 110.281167},{"latitude": 25.096842,"longitude": 110.281137},{"latitude": 25.095527,"longitude": 110.280778},{"latitude": 25.092988,"longitude": 110.279991},{"latitude": 25.090947,"longitude": 110.279089},{"latitude": 25.088824,"longitude": 110.277994},{"latitude": 25.088921,"longitude": 110.277342},{"latitude": 25.088633,"longitude": 110.277057},{"latitude": 25.089162,"longitude": 110.275070},{"latitude": 25.090355,"longitude": 110.272274},{"latitude": 25.094758,"longitude": 110.274553},{"latitude": 25.095421,"longitude": 110.275129},{"latitude": 25.096114,"longitude": 110.275212},{"latitude": 25.097485,"longitude": 110.277418},{"latitude": 25.098553,"longitude": 110.279565},{"latitude": 25.098779,"longitude": 110.280243}],
}
地图多边形
polygons.js
// pages/polygons/polygons.js
import map_data from '@data/map_data'Page({/*** 页面的初始数据*/data: {Marker2_Activated: "https://3gimg.qq.com/lightmap/xcx/demoCenter/images/Marker2_Activated@3x.png",Marker3_Activated: "https://3gimg.qq.com/lightmap/xcx/demoCenter/images/Marker3_Activated@3x.png",// 地图中心点坐标longitude: map_data.longitude,latitude: map_data.latitude,// 缩放级别scale: map_data.scale,// 标记点markers: [],// 多边形polygons: null,// 经纬度数组points: map_data.points ?? [],// 经纬度数据points_data: null,// 显示/隐藏 标记点isShow: true,// 显示/隐藏 对话框dialogShow: false,// 对话框按钮组buttons: [{text: '关闭'}, {text: '复制'}],},/*** 生命周期函数--监听页面加载*/onLoad() {let points = this.data.pointsif (points.length > 0) {points.forEach(item => {item.latitude = Number(item.latitude)item.longitude = Number(item.longitude)})let markers = points.map((item, index) => ({id: index,latitude: item.latitude,longitude: item.longitude,iconPath: this.data.Marker3_Activated,width: 25,height: 25}));this.setData({markers,points,})// 判断如果标记的点数大于2就给polygons赋值if (points.length > 2) {let polygons = [{points,fillColor: "#d5dff233", // 填充颜色:淡蓝色,7-8位为十六进制透明度00-FFstrokeColor: "#789cff", // 描边颜色:较深的淡蓝色strokeWidth: 2, // 描边宽度}]this.setData({polygons,})// let maxLo = 0// let minLo = 180// let maxLa = 0// let minLa = 90// points.forEach(item => {// maxLo = Math.max(maxLo, item.longitude)// minLo = Math.min(minLo, item.longitude)// maxLa = Math.max(maxLa, item.latitude)// minLa = Math.min(minLa, item.latitude)// })// console.log("地图中心点经度:", (maxLo + minLo) / 2);// console.log("地图中心点纬度:", (maxLa + minLa) / 2);}this.includePoints()}},/*** 缩放视野以包含所有给定的坐标点*/includePoints() {let points = this.data.pointsthis.mapCtx = wx.createMapContext('map')this.mapCtx.includePoints({padding: [10, 10, 10, 10],points,})},/*** 绑定地图点击事件*/bindMap(e) {let points = this.data.points // 不直接使用polygons[0].points是因为如果不够三个点会报错let markers = this.data.markers // 点击地图添加一个标记点let latitude = e.detail.latitude.toFixed(6)let longitude = e.detail.longitude.toFixed(6)points.push({latitude,longitude})let length = markers.lengthmarkers.push({id: length,latitude,longitude,iconPath: this.data.Marker3_Activated,width: 25,height: 25})this.setData({markers,points})// 判断如果标记的点数大于2就给polygons赋值if (points.length > 2) {let polygons = [{points,fillColor: "#d5dff233", // 填充颜色:淡蓝色,7-8位为十六进制透明度00-FFstrokeColor: "#789cff", // 描边颜色:较深的淡蓝色strokeWidth: 2, // 描边宽度}]this.setData({polygons,})}},/*** 清除 上一个标记点*/clearPrevious() {let polygons = this.data.polygonslet markers = this.data.markerslet points = this.data.pointsmarkers.pop()points.pop()if (markers.length < 3) {polygons = null} else {polygons[0].points = points}this.setData({polygons,markers,points})},/*** 清除 标记点和多边形*/clearGon() {this.setData({polygons: null,markers: [],points: []})},/*** 生成数据 按钮*/generate() {let points = this.data.pointsif (points.length > 2) {let points_data = "points: " + JSON.stringify(points)this.setData({dialogShow: true,points_data})} else {wx.showToast({title: '不能少于三个点',icon: 'error'})}},/*** 对话框 按钮*/dialogButton(e) {this.setData({dialogShow: false,})let choose = e.detail.item.textif (choose == "复制") {this.copy()}},/*** 复制 参数信息*/copy() {wx.setClipboardData({data: this.data.points_data,})},/*** 显示/隐藏标记点 按钮*/show() {let isShow = this.data.isShowlet markers = this.data.markersmarkers.forEach(item => {// 标注的透明度 范围 0 ~ 1,对应 0% ~ 100%item.alpha = isShow ? 0 : 1})this.setData({isShow: !isShow,markers})wx.showToast({title: !isShow ? '显示标记点' : '隐藏标记点',icon: 'none'})},/*** 跳转到 点与多边形 页面*/torange() {let points = JSON.stringify(this.data.points)wx.navigateTo({url: '../range/range?points=' + points,})},
})
polygons.json
{"usingComponents": {"mp-dialog": "weui-miniprogram/dialog/dialog"},"navigationBarTitleText": "地图多边形绘制"
}
polygons.wxml
<!--pages/polygons/polygons.wxml-->
<map id="map" latitude="{{latitude}}" longitude="{{longitude}}" scale="{{scale}}" markers='{{markers}}' polygons="{{polygons}}" bindtap="bindMap"><view class="control-btn" wx:if="{{points.length > 2}}"><image src="{{Marker2_Activated}}" class="img" bindtap="torange"></image><view class="text">点与多边形</view></view>
</map><view style="display: flex; margin: 10px 0;"><button type="default" bindtap="clearPrevious">清除上一个点</button><button type="warn" bindtap="clearGon">清除全部点面</button>
</view><view style="display: flex; margin: 10px 0;"><button type="{{!isShow ? 'default' : 'warn' }}" bindtap="show">{{!isShow ? '显示' : '隐藏' }} 标记点</button><button style="height: 45px;" type="primary" bindtap="generate">生成数据</button>
</view><mp-dialog title="经纬度数组" show="{{dialogShow}}" bindbuttontap="dialogButton" buttons="{{buttons}}"><view class="title"><scroll-view scroll-y="true" class="scroll"><text user-select="true">{{points_data}}</text></scroll-view></view>
</mp-dialog>
polygons.wxss
/* pages/polygons/polygons.wxss */
page {height: 100%;
}map {width: 100%;height: calc(100% - 125px);
}.title {text-align: left;margin-top: 10px;
}.scroll {height: 300px;width: 100%;margin-bottom: 15px;
}.weui-dialog__btn_primary {background-color: #07c160;color: #fff;
}.control-btn {position: absolute;width: 45px;z-index: 99;background: #FFF;text-align: center;border-radius: 4px;right: 10px;bottom: 40px;
}.img {height: 40px;width: 40px;
}.text {font-size: small;
}
点与多边形关系
range.js
// pages/range/range.js
import map_data from '@data/map_data'Page({/*** 页面的初始数据*/data: {// 地图中心点坐标longitude: map_data.longitude,latitude: map_data.latitude,// 缩放级别scale: map_data.scale,// 标记点markers: [],// 多边形polygons: null,// 经纬度数组points: [],// 是否在多边形内部isAtPolygons: false},/*** 生命周期函数--监听页面加载*/onLoad(options) {let points = JSON.parse(options.points)let polygons = [{points,fillColor: "#d5dff233", // 填充颜色:淡蓝色,7-8位为十六进制透明度00-FFstrokeColor: "#789cff", // 描边颜色:淡蓝色strokeWidth: 2, // 描边宽度}]this.setData({polygons,points,})this.includePoints()},/*** 缩放视野以包含所有给定的坐标点*/includePoints() {this.mapCtx = wx.createMapContext('map')this.mapCtx.includePoints({padding: [10, 10, 10, 10],points: this.data.points,})},/*** 绑定地图点击事件*/bindMap(e) {let latitude = e.detail.latitude.toFixed(6)let longitude = e.detail.longitude.toFixed(6)let markers= [{id: 1,latitude,longitude,width: 25, // 默认图标的宽度height: 34 // 默认图标的高度}]this.setData({markers: markers,})let testPoint = {latitude: latitude,longitude: longitude}let polygon = this.data.pointslet bool = this.isPointInPolygon(testPoint, polygon)this.setData({isAtPolygons: bool})},/*** 判断点是否在多边形内部* @param {{longitude: number, latitude: number}} point - 待检测点* @param {{longitude: number, latitude: number}[]} polygon - 多边形顶点数组*/isPointInPolygon(point, polygon) {// 预处理:全部转为数值const toNum = ({ longitude, latitude }) => ({longitude: +longitude,latitude: +latitude});point = toNum(point);polygon = polygon.map(v => toNum(v));// 检查顶点for (const v of polygon) {if (Math.abs(v.longitude - point.longitude) < 1e-9 && Math.abs(v.latitude - point.latitude) < 1e-9) {return true;}}// 检查边const n = polygon.length;for (let i = 0; i < n; i++) {const a = polygon[i];const b = polygon[(i + 1) % n];if (this.isPointOnSegment(point, a, b)) return true;}// 射线法核心逻辑let crossings = 0;for (let i = 0; i < n; i++) {const a = polygon[i];const b = polygon[(i + 1) % n];const [aLat, bLat] = [a.latitude, b.latitude];const pLat = point.latitude;// 边跨越射线时才处理if ((aLat >= pLat) === (bLat >= pLat)) continue;// 排除水平边if (aLat === bLat) continue;// 计算交点经度const t = (pLat - aLat) / (bLat - aLat);const intersectLon = a.longitude + t * (b.longitude - a.longitude);// 交点在射线右侧(经度更大)if (intersectLon > point.longitude + 1e-9) {crossings++;}}return crossings % 2 === 1;},/*** 判断点是否在多边形边上* @param {{longitude: number, latitude: number}} p - 待检测点* @param {{longitude: number, latitude: number}} a - 线段起点* @param {{longitude: number, latitude: number}} b - 线段终点*/isPointOnSegment(p, a, b) {// 强制转换为数值const toNum = obj => ({longitude: +obj.longitude,latitude: +obj.latitude});p = toNum(p);a = toNum(a);b = toNum(b);// 叉积判共线const cross = (p.longitude - a.longitude) * (b.latitude - a.latitude) - (p.latitude - a.latitude) * (b.longitude - a.longitude);if (Math.abs(cross) > 1e-9) return false;// 包围盒检查const minLon = Math.min(a.longitude, b.longitude);const maxLon = Math.max(a.longitude, b.longitude);const minLat = Math.min(a.latitude, b.latitude);const maxLat = Math.max(a.latitude, b.latitude);return p.longitude >= minLon - 1e-9 && p.longitude <= maxLon + 1e-9 && p.latitude >= minLat - 1e-9 && p.latitude <= maxLat + 1e-9;},
})
range.json
{"usingComponents": {},"navigationBarTitleText": "点与多边形关系"
}
range.wxml
<!--pages/range/range.wxml-->
<map id="map" latitude="{{latitude}}" longitude="{{longitude}}" scale="{{scale}}" markers='{{markers}}' polygons="{{polygons}}" bindtap="bindMap" /><view class="text">点<span style="color: {{isAtPolygons ? 'black' : 'red'}}; margin: 0 5px;">{{isAtPolygons ? '在' : '不在'}}</span>多边形内
</view>
range.wxss
/* pages/range/range.wxss */
page{height: 100%;
}map {width: 100%;height: calc(100% - 100px);
}.text {display: flex;justify-content: center;align-items: center;font-size: x-large;margin: 5px;
}
射线法逻辑的代码使用deepseek辅助生成
相关文章:
微信小程序 地图 使用 射线法 判断目标点是否在多边形内部(可用于判断当前位置是否在某个区域内部)
目录 射线法原理简要逻辑代码 小程序代码调试基础库小程序配置地图数据地图多边形点与多边形关系 射线法 原理 使用射线法来判断,目标点是否在多边形内部 这里简单说下,具体细节可以看这篇文章 平面几何:判断点是否在多边形内(…...
第三十七节:视频处理-视频读取与处理
引言:解码视觉世界的动态密码 在数字化浪潮席卷全球的今天,视频已成为信息传递的主要载体。从短视频平台的爆火到自动驾驶的视觉感知,视频处理技术正在重塑人类与数字世界的交互方式。本指南将深入探讨视频处理的核心技术,通过Python与OpenCV的实战演示,为您揭开动态影像…...
什么是 Flink Pattern
在 Apache Flink 中,Pattern 是 Flink CEP(Complex Event Processing)模块 的核心概念之一。它用于定义你希望从数据流中检测出的 事件序列模式(Event Sequence Pattern)。 🎯 一、什么是 Flink Pattern&am…...
ADB基本操作和命令
1.ADB的含义 adb 命令是 Android 官方提供,调试 Android 系统的工具。 adb 全称为 Android Debug Bridge(Android 调试桥),是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具&#x…...
NSString的三种实现方式
oc里的NSString有三种实现方式,为_ _NSCFConstantString、__NSCFString、NSTaggedPointerString 1._ _NSCFConstantString(字面量字符串) 从字面意思上可以看出,_ _NSCFContantString可以理解为常量字符串,这种类型的字符串在编译期就确定了…...
2025年PMP 学习二十 第13章 项目相关方管理
第13章 项目相关方管理 序号过程过程组过程组1识别相关方启动2规划相关方管理规划3管理相关方参与与执行4监控相关方参与与监控 相关方管理,针对于团队之外的相关方的,核心目标是让对方为了支持项目,以达到项目目标。 文章目录 第13章 项目相…...
学习黑客Kerberos深入浅出:安全王国的门票系统
Kerberos深入浅出:安全王国的门票系统 🎫 作者: 海尔辛 | 发布时间: 2025-05-18 🔑 理解Kerberos:为什么它如此重要? Kerberos是现代网络环境中最广泛使用的身份验证协议之一,尤其在Windows Active Dire…...
蓝桥杯19681 01背包
问题描述 有 N 件物品和一个体积为 M 的背包。第 i 个物品的体积为 vi,价值为 wi。每件物品只能使用一次。 请问可以通过什么样的方式选择物品,使得物品总体积不超过 M 的情况下总价值最大,输出这个最大价值即可。 输入格式 第一行输…...
使用 Auto-Keras 进行自动化机器学习
使用 Auto-Keras 进行自动化机器学习 了解自动化机器学习以及如何使用 auto-keras 完成它。如今,机器学习并不是一个非常罕见的术语,因为像 DataCamp、Coursera、Udacity 等组织一直在努力提高他们的效率和灵活性,以便将机器学习的教育带给普…...
算法刷题Day9 5.18:leetcode定长滑动窗口3道题,结束定长滑动窗口,用时1h
12. 1852.每个子数组的数字种类数 1852. 每个子数组的数字种类数 - 力扣(LeetCode) 思想 找到nums 所有 长度为 k 的子数组中 不同 元素的数量。 返回一个数组 ans,其中 ans[i] 是对于每个索引 0 < i < n - k,nums[i..(i …...
Protect Your Digital Privacy: Obfuscate, Don’t Hide
Protect Your Digital Privacy: Obfuscate, Don’t Hide In today’s digital world, hiding completely online is nearly impossible. But you can protect yourself by deliberately obfuscating your personal information — making it harder for others to track, pro…...
Spark 的运行模式(--master) 和 部署方式(--deploy-mode)
Spark 的 运行模式(--master) 和 部署方式(--deploy-mode),两者的核心区别在于 资源调度范围 和 Driver 进程的位置。 一、核心概念对比 维度--master(运行模式)--deploy-mode(部署…...
从零开始实现大语言模型(十五):并行计算与分布式机器学习
1. 前言 并行计算与分布式机器学习是一种使用多机多卡加速大规模深度神经网络训练过程,以减少训练时间的方法。在工业界的训练大语言模型实践中,通常会使用并行计算与分布式机器学习方法来减少训练大语言模型所需的钟表时间。 本文介绍PyTorch中的一种…...
生产模式下react项目报错minified react error #130的问题
这天,线上突然出现了一个bug,某个页面打开空白,看控制台报错minified react error #130,在本地看却是正常的,百思不得其解。 后来发现是由于线上项目它的包更新过了,而我本地的包没有更新,所以我…...
本地无损放大软件-realesrgan-gui
—————【下 载 地 址】——————— 【本章下载一】:https://drive.uc.cn/s/84516041df174 【本章下载二】:https://pan.xunlei.com/s/VOQDybD4ruF0-m8UJrCF-HtLA1?pwdxz9e# 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…...
Java面试深度解析:微服务与云原生技术应用场景详解
Java面试深度解析:微服务与云原生技术应用场景详解 面试场景 面试官:我们今天的面试会围绕微服务与云原生技术展开,结合一个在线教育平台的业务场景进行提问。希望你放松心态,正常发挥。 码农明哥:好的好的…...
短剧小程序系统开发源码上架,短剧项目市场分析
引言 随着短视频内容消费的爆发式增长,短剧小程序凭借其碎片化、强互动、低成本的特点,成为内容创业与资本布局的新风口。2024年以来,行业规模突破500亿元,预计2027年将超千亿17。本文将深度解析短剧小程序系统开发的技术优势、市…...
常见的请求头(Request Header)参数
1. Accept 作用:告知服务器客户端支持的响应数据格式(如 JSON、XML、HTML)。示例:Accept: application/json(优先接收 JSON 格式数据)。 2. Content-Type 作用:说明请求体的数据格式(…...
渗透测试核心技术:内网渗透与横向移动
内网渗透是红队行动的关键阶段,攻击者通过突破边界进入内网后,需快速定位域控、横向移动并维持权限。本节从内网环境搭建、信息收集、横向移动技巧到权限维持工具,系统讲解如何在内网中隐蔽行动并扩大战果。 1. 内网环境搭建与基础配置 目标: 模拟真实企业网络,构建包含…...
2025/5/18
继续研究一下大佬的RAG项目。开始我的碎碎念。 RAG可以分成两部分:一个是问答,一个是数据处理。 问答是人提问,然后查数据库,把查的东西用大模型组织成人话,回答人的提问。 数据处理是把当下知识库里的东西…...
使用国内源加速Qt在线安装
简介: 在线安装Qt时,会发现下载非常缓慢,可以用过使用国内镜像源来加速安装过程。 在线安装包的下载过程: 1,打开下载页面 https://www.qt.io/download-open-source 2,点击 Download the Qt online ins…...
【图像生成大模型】HunyuanVideo:大规模视频生成模型的系统性框架
HunyuanVideo:大规模视频生成模型的系统性框架 引言HunyuanVideo 项目概述核心技术1. 统一的图像和视频生成架构2. 多模态大语言模型(MLLM)文本编码器3. 3D VAE4. 提示重写(Prompt Rewrite) 项目运行方式与执行步骤1. …...
Java IO流(超详细!!!)
Java IO流 文章目录 Java IO流1.文件相关基础普及1.1 常用文件操作1.3 目录的操作和文件删除 2.IO流原理及流的分类2.1 字节流2.1.1 InputStream:字节输入流2.1.2 OutputStream 2.2 字符流2.2.1 Reader2.2.1 Writer 2.3 节点流和处理流2.3.1节点流2.3.2 处理流2.3.2…...
规则联动引擎GoRules初探
背景说明 嵌入式设备随着物联网在生活和生产中不断渗透而渐渐多起来,数据的采集、处理、分析在设备侧的自定义配置越来越重要。一个可通过图形化配置的数据处理过程,对于加速嵌入式设备的功能开发愈发重要。作为一个嵌入式软件从业者,笔者一…...
Android开发-翻页类视图
在Android应用中,翻页类视图(Paging Views) 是一种非常直观且用户友好的方式来展示内容。无论是用于展示图片轮播、引导页还是分页加载数据列表,翻页效果都能极大地提升用户体验。本文将介绍几种实现翻页效果的常见组件和方法&…...
高能数造闪耀 CIBF 2025,以创新技术引领新能源智造新征程
在全球新能源产业加速发展的关键节点,CIBF 2025 展会成为行业技术与成果交流的重要平台。高能数造(西安)技术有限公司深度参与此次盛会,凭借在新能源电池智能制造领域的深厚积累与创新突破,为行业发展注入强劲动力&…...
数据结构与算法——栈和队列
栈和队列 栈概念与结构栈的实现栈的初始化栈的销毁判断栈是否为空入栈出栈取栈顶元素栈中有效元素个数 队列概念与结构队列的实现队列结点结构队列结构初始化队列队列判空销毁队列入队列,队尾出队列,队头取队头数据取队尾数据队列有效数据个数 栈 概念与…...
新电脑软件配置三 pycharm
快捷键放大和缩小字体 按住ctrl鼠标滚轮向上 缩小同理...
浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)
JavaScript(ECMAScript)的发展经历了多个版本,每个版本都引入了新特性和改进。以下仅是对三个常用版本(ES5、ES6(ES2015) 和 ES2023)的基本对比及使用建议: 目前常见项目中还是用ES6…...
【Odoo】Pycharm导入运行Odoo15
【Odoo】Pycharm导入运行Odoo15 前置准备1. Odoo-15项目下载解压2. PsrtgreSQL数据库 项目导入运行1. 项目导入2. 设置项目内虚拟环境3. 下载项目中依赖4. 修改配置文件odoo.conf 运行Pycharm快捷运行 前置准备 1. Odoo-15项目下载解压 将下载好的项目解压到开发目录下 2. …...
【运营商查询】批量手机号码归属地和手机运营商高速查询分类,按省份城市,按运营商移动联通电信快速分类导出Excel表格,基于WPF的实现方案
WPF手机号码归属地批量查询与分类导出方案 应用场景 市场营销:企业根据手机号码归属地进行精准营销,按城市或省份分类制定针对性推广策略客户管理:快速对客户手机号码进行归属地分类,便于后续客户关系管理数…...
中级统计师-统计学基础知识-第四章 假设检验
一、假设检验的基本原理 1. 基本思想 反证法:假设原假设成立,通过样本矛盾性进行反驳小概率原理:设定显著性水平 α \alpha α(通常取 0.05),若观测结果的概率 p ≤ α p \leq \alpha p≤α,…...
等于和绝对等于的区别
1. (等于) 特点:比较时会自动进行类型转换(隐式转换),尝试将两边的值转为相同类型后再比较。规则: 如果类型相同,直接比较值。如果类型不同,按以下规则转换: …...
家庭关系处理个人总结
首先要说到前面的是,每个家庭的成员背景环境经济状况不同,原生家庭差异,导致面临具体问题是不同的。就类似软件“没有银弹”的概念,没有一种方法可以解决每个人问题。 举个例子,面对婆媳矛盾 网上父辈的人 会说 百行孝…...
【Python训练营打卡】day29 @浙大疏锦行
DAY 29 复习日 知识点回顾 1. 类的装饰器 2. 装饰器思想的进一步理解:外部修改、动态 3. 类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,…...
React 19版本refs也支持清理函数了。
文章目录 前言一、refs 支持清理函数二、案例演示1.useEffect写法2.React 19改进 的ref写法 总结 前言 React 19版本发布了ref支持清理函数了,这样就可以达到useEffect一样的效果了。为啥需要清理函数呢,这是因为节约内存。 清理事件监听(避…...
uniapp的适配方式
文章目录 前言✅ 一、核心适配方式对比📏 二、rpx 单位:uni-app 的核心适配机制🧱 三、默认设计稿适配(750宽)🔁 四、字体 & 屏幕密度适配🛠 五、特殊平台适配(底部安全区、刘海…...
Java面试场景:从音视频到AI应用的技术探讨
面试场景:音视频与AI应用技术的碰撞 在某互联网大厂的面试中,面试官王先生与求职者明哥展开了一场关于音视频技术与AI应用的对话。 第一轮提问:音视频场景 面试官:明哥,你能谈谈在音视频场景中,Spring B…...
es聚合-词条统计
es语句 ---普通结构----"tags":{"type": "keyword","index": true},GET /knowledge_test/_search {"size": 0,"aggs": {"tag_count": {"terms": {"field": "tags",&quo…...
【沉浸式求职学习day43】【Java面试题精选3】
沉浸式求职学习 1.Java中this和super的区别2.为什么返回类型不算方法重载3.方法重写时需要注意什么问题4.深克隆和浅克隆有什么区别5.如何实现深克隆6.什么是动态代理7.静态代理和动态代理的区别8.如何实现动态代理?9.JDK Proxy 和 CGLib 有什么区别?10.…...
OpenAI推出Codex — ChatGPT内置的软件工程Agents
OpenAI继续让ChatGPT对开发者更加实用。 几天前,他们增加了连接GitHub仓库的支持,可以"Deep Research"并根据你自己的代码提问。 今天,该公司在ChatGPT中推出了Codex的研究预览版,这是迄今为止最强大的AI编码Agent。 它可以编写代码、修复错误、运行测试,并在…...
Win 11开始菜单图标变成白色怎么办?
在使用windows 11的过程中,有时候开始菜单的某些程序图标变成白色的文件形式,但是程序可以正常打开,这个如何解决呢? 这通常是由于快捷方式出了问题,下面跟着操作步骤来解决吧。 1、右键有问题的软件,打开…...
中级统计师-统计学基础知识-第三章 参数估计
统计学基础知识 第三章 参数估计 第一节 统计量与抽样分布 1.1 总体参数与统计量 总体参数:描述总体特征的未知量(如均值 μ \mu μ、方差 σ 2 \sigma^2 σ2、比例 π \pi π)。统计量:由样本数据计算的量(如样本…...
学习黑客HTTP 请求头
HTTP 请求头(Request Headers)是 HTTP 请求中非常重要的一部分,它们以键值对的形式向服务器传递关于请求的附加信息、客户端的能力或上下文。 理解请求头对于 Web 开发、API 交互、网络调试和安全都至关重要。下面我将常见的 HTTP 请求头字段…...
日志参数含义
一 学习率相关 base_lr:基础学习率,初始设定的学习率 -lr:当前实际使用的学习率,通常是 base_lr 经过学习率调整策略后的值,比如lrbase_lr*(1start_factor) 时间统计 time:每次迭代总时间,单位…...
[Linux]安装吧!我的软件包管理器!
一、常见安装方式 在 Linux 中,有 3 种常见的软件安装方式: (1)yam、apt (2).rpm 安装包安装 (3)源码安装 二、什么是软件包 在 Linux 下安装软件,通常的办法是下载…...
Flink 作业提交流程
Apache Flink 的 作业提交流程(Job Submission Process) 是指从用户编写完 Flink 应用程序,到最终在 Flink 集群上运行并执行任务的整个过程。它涉及多个组件之间的交互,包括客户端、JobManager、TaskManager 和 ResourceManager。…...
牛客网NC276110题解:小红的数组重排
牛客网NC276110题解:小红的数组重排 题目解析 算法思路 对数组进行排序(非降序)检查特殊情况: 如果存在三个连续相等的元素,则无解如果前两个元素都是0,则无解 若不存在特殊情况,则排序后的数…...
从零启动 Elasticsearch
elastic 有弹力的 ElaticSearch (ES)是一个基于 Lucene 的分布式全文检索引擎。可以做到近乎实时地存储、检索数据,并且本身具有良好的扩展性,可以扩展到上百台服务器,处理PB级别(1 Petabyte 1024TB&…...
nginx服务器实验
1.实验要求 1)在Nginx服务器上搭建LNMP服务,并且能够对外提供Discuz论坛服务。 在Web1、Web2服务器上搭建Tomcat 服务。 2)为nginx服务配置虚拟主机,新增两个域名 www.kgc.com 和 www.benet.com,使用http://www.kgc.…...