度娘了一圈,只发现了一个python代码有用。其他要么太复杂,要么都是调GD地图util啊,BD地图util啊,或者Java util的封装好的方法,但人家又不开源啊!我把这段python翻译成了js代码,简单测试发现OK。这代码看起来也太简单了,简单到我都不相信,,,but, it works!!!
设:需要判断的目标点为P
参数
aLat: P的纬度
aLon: P的经度
pointList: 单个多边形区域顶点数组。如果有多个独立区域,则分别调用本方法,只要有一次为ture即表示在区域内。
请注意pointList的格式,我用的是对象;如果你用的是数组或字符串,请自行修改获取纬度(pLat1,pLat2)、经度(pLon1,pLon2)的代码。
utilofMap.js文件:
function IsPtInPoly(aLat, aLon, pointList) {
/*
:param aLon: double 经度
:param aLat: double 纬度
:param pointList: list [{latitude: 22.22, longitude: 113.113}...] 多边形点的顺序需根据顺时针或逆时针,不能乱
*/
var iSum = 0
var iCount = pointList.length
if(iCount < 3) {
return false
}
for(var i = 0; i < iCount;i++) {
var pLat1 = pointList[i].latitude
var pLon1 = pointList[i].longitude
if(i == iCount - 1) {
var pLat2 = pointList[0].latitude
var pLon2 = pointList[0].longitude
} else {
var pLat2 = pointList[i + 1].latitude
var pLon2 = pointList[i + 1].longitude
}
if (((aLat >= pLat1) && (aLat < pLat2)) || ((aLat>=pLat2) && (aLat < pLat1))) {
if (Math.abs(pLat1 - pLat2) > 0) {
var pLon = pLon1 - ((pLon1 - pLon2) * (pLat1 - aLat)) / (pLat1 - pLat2);
if(pLon < aLon) {
iSum += 1
}
}
}
}
if(iSum % 2 != 0) {
return true
}else {
return false
}
}
module.exports = {
IsPtInPoly: IsPtInPoly,
};