百度地图 - 基础学习(9): 区域重叠面积计算及绘制重叠区域边界线

搞定了 百度地图 - 基础学习(8): 折线构成闭合图形面积计算 又引出一个新问题,两块区域完全重叠或部分重叠,那这个重叠区域的面积又如何计算,以及重叠区域的边界线。

既然是重叠,那首要问题是确定重叠区域,以及重叠部分的关键坐标点。

一、完全重叠

如果是完全重叠的话,就简单很多了:

  第一步:各自计算两个区域的面积

  第二步:判定较小面积区域的各个关键点是否都在较大面积区域内(虽然是完全重叠,但不能靠嘴皮去说,靠眼睛去看,还是需要鉴定,得到一个确实的结果)

  第三步:如果真的是完全重叠,则给较小面积区域新增一个多边形覆盖物以示区分

function pointCmp(pointA, pointB, center) {
        if (pointA.lng >= 0 && pointB.lng < 0) return true;
        // if (pointA.lng == 0 && pointB.lng == 0) return pointA.lat > pointB.lat;
        //向量OA和向量OB的叉积
        let det =
          (pointA.lng - center.lng) * (pointB.lat - center.lat) -
          (pointB.lng - center.lng) * (pointA.lat - center.lat);
        if (det < 0) return true;
        if (det > 0) return false;
        //向量OA和向量OB共线,以距离判断大小
        let d1 =
          (pointA.lng - center.lng) * (pointA.lng - center.lng) +
          (pointA.lat - center.lat) * (pointA.lat - center.lat);
        let d2 =
          (pointB.lng - center.lng) * (pointB.lng - center.lat) +
          (pointB.lat - center.lat) * (pointB.lat - center.lat);
        return d1 > d2;
      }

      //若点a大于点b,即点a在点b顺时针方向,返回true,否则返回false
      var center = {};
      // 计算重心
      let x = 0,
        y = 0;
      let pointListLen = pointList.length;
      for (let i = 0; i < pointListLen; i++) {
        x += pointList[i].lng;
        y += pointList[i].lat;
      }
      center.lng = x / pointListLen;
      center.lat = y / pointListLen;

      //冒泡排序
      for (let i = 0; i < pointListLen - 1; i++) {
        for (let j = 0; j < pointListLen; j++) {
          if (j < pointListLen - 1) {
            if (pointCmp(pointList[j], pointList[j + 1], center)) {
              let tmp = pointList[j];
              pointList[j] = pointList[j + 1];
              pointList[j + 1] = tmp;
            }
          } else {
            if (pointCmp(pointList[j], pointList[0], center)) {
              let tmp = pointList[j];
              pointList[j] = pointList[0];
              pointList[0] = tmp;
            }
          }
        }
      }
(0)

相关推荐