Day 8/100 JS 实现地理坐标电子围栏

1、需求
判断当前坐标,在某个地理坐标区域里(多边形)。
Day 8/100 JS 实现地理坐标电子围栏
文章图片

2、思路
思路如下:
【Day 8/100 JS 实现地理坐标电子围栏】先判断y值是否在yi和yi+1之间
判断A值是否在xi和xi+1之间
判断A值大于还是小于x值,以此判断是左边交点,还是右边交点
左边交点nl,右边交点nr,如果满足1和2,且A值小于x值,那么左边交点nl+1,;如果满足1和2,且A值大于x值,那么右边交点nr+1
注意,如果焦点在多变形的拐点处,只算一次相交。
3、代码

function isIn(point, points){ console.log('point',point); console.log('points',points); const { lng, lat } = point; var iSum = 0, iCount; var dLon1, dLon2, dLat1, dLat2, dLon; if (points.length < 3) return false; iCount = points.length; for (var i = 0; i < iCount; i++) { if (i == iCount - 1) { dLon1 = points[i].lng; dLat1 = points[i].lat; dLon2 = points[0].lng; dLat2 = points[0].lat; } else { dLon1 = points[i].lng; dLat1 = points[i].lat; dLon2 = points[i + 1].lng; dLat2 = points[i + 1].lat; } //以下语句判断A点是否在边的两端点的水平平行线之间,在则可能有交点,开始判断交点是否在左射线上 if (((lat >= dLat1) && (lat < dLat2)) || ((lat >= dLat2) && (lat < dLat1))) { if (Math.abs(dLat1 - dLat2) > 0) { console.log('======================='); //得到 A点向左射线与边的交点的x坐标: dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - lat)) / (dLat1 - dLat2); console.log(dLat1, dLon2, dLat2, dLon2, lat, lng, dLon) if (dLon < lng) iSum++; } } } if (iSum % 2 != 0) return true; return false; } let point={lng:116.31376519097222,lat:40.06724392361111}//经度和纬度 let points=[ {lng:116.311083,lat:40.0696}, {lng:116.31693,lat:40.06974}, {lng:116.316941,lat:40.065331}, {lng:116.310493,lat:40.065273}, {lng:116.311083,lat:40.0696}, ]; //经度和纬度 console.log(isIn(point,points));

参考链接
1、坐标拾取网站
https://lbs.amap.com/tools/pi...
2、原理介绍
https://home.yangxl.cn:81/202...

    推荐阅读