百度地图 - 基础学习(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)
