基于百度地图的区域重叠判断
原文链接: Fyerl's Blog
前些日的一个小需求:
用户在后台划不规则区域,区域之间不能重叠,如图
判断分两步:
1、判断多变形是否有相交线段,无则进行第二步判断(公式)
2、判断多变形之间是否存在顶点与多边形的包含关系(BMapLib.GeoUtils.isPointInPolygon)
代码如下:
/**
* 点: { lat: xxx, lng: xxx }
* 线: [{ lat: xxx, lng: xxx }, { lat: xxx, lng: xxx }]
* 面: [{ lat: xxx, lng: xxx }, { lat: xxx, lng: xxx }, { lat: xxx, lng: xxx }...]
* */
const { BMap, BMapLib } = window;
/**
* 线段是否相交
* seg: [{ lat: xxx, lng: xxx }, { lat: xxx, lng: xxx }]
* */
function isSegmentsIntersectant(segA, segB) {
const abc = (segA[0].lat - segB[0].lat) * (segA[1].lng - segB[0].lng) - (segA[0].lng - segB[0].lng) * (segA[1].lat - segB[0].lat);
const abd = (segA[0].lat - segB[1].lat) * (segA[1].lng - segB[1].lng) - (segA[0].lng - segB[1].lng) * (segA[1].lat - segB[1].lat);
if (abc * abd >= 0) {
return false;
}
const cda = (segB[0].lat - segA[0].lat) * (segB[1].lng - segA[0].lng) - (segB[0].lng - segA[0].lng) * (segB[1].lat - segA[0].lat);
const cdb = cda + abc - abd;
return !(cda * cdb >= 0);
}
/**
* 判断两多边形边界是否相交
*/
function isPolygonsIntersectant(plyA, plyB) {
for (let i = 0, il = plyA.length; i < il; i++) {
for (let j = 0, jl = plyB.length; j < jl; j++) {
const segA = [plyA[i], plyA[i === il - 1 ? 0 : i + 1]];
const segB = [plyB[j], plyB[j === jl - 1 ? 0 : j + 1]];
if (isSegmentsIntersectant(segA, segB)) {
return true;
}
}
}
return false;
}
/**
* 判断两多变形是否存在点与区域的包含关系(A的点在B的区域内或B的点在A的区域内)
*/
function isPointInPolygonBidirectional(plyA, plyB) {
const [pA, pB] = [[], []];
plyA.forEach((item) => {
pA.push(new BMap.Point(item.lng, item.lat));
});
plyB.forEach((item) => {
pB.push(new BMap.Point(item.lng, item.lat));
});
let [a, b] = [false, false];
a = pA.some(item => BMapLib.GeoUtils.isPointInPolygon(item, new BMap.Polygon(pB)));
if (!a) {
b = pB.some(item => BMapLib.GeoUtils.isPointInPolygon(item, new BMap.Polygon(pA)));
}
return a || b;
}
/**
* 判断多边形是否重叠
* */
export function isPolygonsOverlap(plyA, plyB) {
return isPolygonsIntersectant(plyA, plyB) || isPointInPolygonBidirectional(plyA, plyB);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架