博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于百度地图的区域重叠判断
阅读量:5939 次
发布时间:2019-06-19

本文共 2027 字,大约阅读时间需要 6 分钟。

原文链接:

前些日的一个小需求:

用户在后台划不规则区域,区域之间不能重叠,如图
图片描述

判断分两步:

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);}

转载地址:http://odttx.baihongyu.com/

你可能感兴趣的文章
下载网站原代码步骤
查看>>
11.2---字符串数组排序,删除变位词(CC150)
查看>>
IIS启动网站
查看>>
SQL Server 的 6 种隔离级别
查看>>
EnumDescription
查看>>
css3之calc()
查看>>
Search a 2D Matrix II
查看>>
Linux-FTP
查看>>
php写日志函数
查看>>
开源性能测试工具Locust使用篇(二)
查看>>
开源 CMS系统 / SNS系统 / BBS系统
查看>>
LeetCode--007--整数反转(java)
查看>>
K - Ignatius and the Princess IV
查看>>
Latex学习(标题,子标题)
查看>>
matlab练习程序(最大流/最小割)
查看>>
CentOS安装中文支持
查看>>
Java内部类详解
查看>>
(document).height()与$(window).height()
查看>>
Spring Boot|监控-Actuator
查看>>
java读取txt字符串挨个写入int数组
查看>>