|
//判断点是否在多边形外
var isPointInPolygon = function(o, l) {
if (! (o instanceof AMap.LngLat) || !(l instanceof AMap.Polygon)) {
return false;
}
var k = l.getBounds();
if (!k.contains(o)) {
return false;
}
var t = l.getPath();
var h = t.length;
var n = true;
var j = 0;
var g = 2e-10;
var s, q;
var e = o;
s = t[0];
for (var f = 1; f <= h; ++f) {
if (e.equals(s)) {
return n;
}
q = t[f % h];
if (e.lat < Math.min(s.lat, q.lat) || e.lat > Math.max(s.lat, q.lat)) {
s = q;
continue;
}
if (e.lat > Math.min(s.lat, q.lat) && e.lat < Math.max(s.lat, q.lat)) {
if (e.lng <= Math.max(s.lng, q.lng)) {
if (s.lat == q.lat && e.lng >= Math.min(s.lng, q.lng)) {
return n;
}
if (s.lng == q.lng) {
if (s.lng == e.lng) {
return n;
} else {++j
}
} else {
var r = (e.lat - s.lat) * (q.lng - s.lng) / (q.lat - s.lat) + s.lng;
if (Math.abs(e.lng - r) < g) {
return n;
}
if (e.lng < r) {++j;
}
}
}
} else {
if (e.lat == q.lat && e.lng <= q.lng) {
var m = t[(f + 1) % h];
if (e.lat >= Math.min(s.lat, m.lat) && e.lat <= Math.max(s.lat, m.lat)) {++j;
} else {
j += 2;
}
}
}
s = q;
}
if (j % 2 == 0) {
return false;
} else {
return true;
}
}; |
|