要求
在地图上有多个点。用户要在地图上框选一个多边形。需要知道框住了哪些点。
思路
地图上任意一点,向某个方向的射线,如果与多边形有奇数个交点,则这个点在多边形内。
不证明了。
代码
/**
* 判断指定点坐标lnglat是否在经纬度数组polygon作为顶点数组描述的多边形内部。
* @param {lng,lat} lnglat 指定点坐标.
* @param [{lng,lat}] polygon 多边形的顶点经纬度坐标数组.
* @return 是否在多边形内部.
*/
function isPointInPolygon(lnglat, polygon){
var cnt =0;
for(var i=0;i<polygon.length;i++){
const g = lnglat.lng;
const t = lnglat.lat;
const p1g = polygon[i][0];
const p1t = polygon[i][1];
const p2g = polygon[i===polygon.length-1?0:i+1][0];
const p2t = polygon[i===polygon.length-1?0:i+1][1];
const ming = Math.min(p1g, p2g);
const maxg = Math.max(p1g, p2g);
const mint = Math.min(p1t, p2t);
const maxt = Math.max(p1t, p2t);
if((mint<=t&&t<=maxt&&ming<=g)&&( maxg<=g||(p2g+(p1g-p2g)*((t-p2t)/(p1t-p2t))<g))){
cnt++
}
}
return cnt%2===1;
}