var BMapLib = window.BMapLib = BMapLib || {};
|
(function() {
|
var a = 6370996.81;
|
var b = BMapLib.GeoUtils = function() {};
|
b.isPointInRect = function(f, g) {
|
if (!(f instanceof BMap.Point) || !(g instanceof BMap.Bounds)) {
|
return false
|
}
|
var e = g.getSouthWest();
|
var h = g.getNorthEast();
|
return (f.lng >= e.lng && f.lng <= h.lng && f.lat >= e.lat && f.lat <= h.lat)
|
};
|
b.isPointInCircle = function(e, h) {
|
if (!(e instanceof BMap.Point) || !(h instanceof BMap.Circle)) {
|
return false
|
}
|
var i = h.getCenter();
|
var g = h.getRadius();
|
var f = b.getDistance(e, i);
|
if (f <= g) {
|
return true
|
} else {
|
return false
|
}
|
};
|
b.isPointOnPolyline = function(f, h) {
|
if (!(f instanceof BMap.Point) || !(h instanceof BMap.Polyline)) {
|
return false
|
}
|
var e = h.getBounds();
|
if (!this.isPointInRect(f, e)) {
|
return false
|
}
|
var m = h.getPath();
|
for (var k = 0; k < m.length - 1; k++) {
|
var l = m[k];
|
var j = m[k + 1];
|
if (f.lng >= Math.min(l.lng, j.lng) && f.lng <= Math.max(l.lng, j.lng) && f.lat >= Math.min(l.lat, j
|
.lat) && f.lat <= Math.max(l.lat, j.lat)) {
|
var g = (l.lng - f.lng) * (j.lat - f.lat) - (j.lng - f.lng) * (l.lat - f.lat);
|
if (g < 2e-10 && g > -2e-10) {
|
return true
|
}
|
}
|
}
|
return false
|
};
|
isPointInPolygon = function(o, l) {
|
if (!(o instanceof BMap.Point) || !(l instanceof BMap.Polygon)) {
|
return false
|
}
|
var k = l.getBounds();
|
if (!this.isPointInRect(o, k)) {
|
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
|
}
|
};
|
b.degreeToRad = function(e) {
|
return Math.PI * e / 180
|
};
|
b.radToDegree = function(e) {
|
return (180 * e) / Math.PI
|
};
|
|
function d(g, f, e) {
|
if (f != null) {
|
g = Math.max(g, f)
|
}
|
if (e != null) {
|
g = Math.min(g, e)
|
}
|
return g
|
}
|
|
function c(g, f, e) {
|
while (g > e) {
|
g -= e - f
|
}
|
while (g < f) {
|
g += e - f
|
}
|
return g
|
}
|
b.getDistance = function(j, h) {
|
if (!(j instanceof BMap.Point) || !(h instanceof BMap.Point)) {
|
return 0
|
}
|
j.lng = c(j.lng, -180, 180);
|
j.lat = d(j.lat, -74, 74);
|
h.lng = c(h.lng, -180, 180);
|
h.lat = d(h.lat, -74, 74);
|
var f, e, i, g;
|
f = b.degreeToRad(j.lng);
|
i = b.degreeToRad(j.lat);
|
e = b.degreeToRad(h.lng);
|
g = b.degreeToRad(h.lat);
|
return a * Math.acos((Math.sin(i) * Math.sin(g) + Math.cos(i) * Math.cos(g) * Math.cos(e - f)))
|
};
|
b.getPolylineDistance = function(f) {
|
if (f instanceof BMap.Polyline || f instanceof Array) {
|
var l;
|
if (f instanceof BMap.Polyline) {
|
l = f.getPath()
|
} else {
|
l = f
|
}
|
if (l.length < 2) {
|
return 0
|
}
|
var j = 0;
|
for (var h = 0; h < l.length - 1; h++) {
|
var k = l[h];
|
var g = l[h + 1];
|
var e = b.getDistance(k, g);
|
j += e
|
}
|
return j
|
} else {
|
return 0
|
}
|
};
|
b.getPolygonArea = function(t) {
|
if (!(t instanceof BMap.Polygon) && !(t instanceof Array)) {
|
return 0
|
}
|
var R;
|
if (t instanceof BMap.Polygon) {
|
R = t.getPath()
|
} else {
|
R = t
|
}
|
if (R.length < 3) {
|
return 0
|
}
|
var w = 0;
|
var D = 0;
|
var C = 0;
|
var L = 0;
|
var J = 0;
|
var F = 0;
|
var E = 0;
|
var S = 0;
|
var H = 0;
|
var p = 0;
|
var T = 0;
|
var I = 0;
|
var q = 0;
|
var e = 0;
|
var M = 0;
|
var v = 0;
|
var K = 0;
|
var N = 0;
|
var s = 0;
|
var O = 0;
|
var l = 0;
|
var g = 0;
|
var z = 0;
|
var Q = 0;
|
var G = 0;
|
var j = 0;
|
var A = 0;
|
var o = 0;
|
var m = 0;
|
var y = 0;
|
var x = 0;
|
var h = 0;
|
var k = 0;
|
var f = 0;
|
var n = a;
|
var B = R.length;
|
for (var P = 0; P < B; P++) {
|
if (P == 0) {
|
D = R[B - 1].lng * Math.PI / 180;
|
C = R[B - 1].lat * Math.PI / 180;
|
L = R[0].lng * Math.PI / 180;
|
J = R[0].lat * Math.PI / 180;
|
F = R[1].lng * Math.PI / 180;
|
E = R[1].lat * Math.PI / 180
|
} else {
|
if (P == B - 1) {
|
D = R[B - 2].lng * Math.PI / 180;
|
C = R[B - 2].lat * Math.PI / 180;
|
L = R[B - 1].lng * Math.PI / 180;
|
J = R[B - 1].lat * Math.PI / 180;
|
F = R[0].lng * Math.PI / 180;
|
E = R[0].lat * Math.PI / 180
|
} else {
|
D = R[P - 1].lng * Math.PI / 180;
|
C = R[P - 1].lat * Math.PI / 180;
|
L = R[P].lng * Math.PI / 180;
|
J = R[P].lat * Math.PI / 180;
|
F = R[P + 1].lng * Math.PI / 180;
|
E = R[P + 1].lat * Math.PI / 180
|
}
|
}
|
S = Math.cos(J) * Math.cos(L);
|
H = Math.cos(J) * Math.sin(L);
|
p = Math.sin(J);
|
T = Math.cos(C) * Math.cos(D);
|
I = Math.cos(C) * Math.sin(D);
|
q = Math.sin(C);
|
e = Math.cos(E) * Math.cos(F);
|
M = Math.cos(E) * Math.sin(F);
|
v = Math.sin(E);
|
K = (S * S + H * H + p * p) / (S * T + H * I + p * q);
|
N = (S * S + H * H + p * p) / (S * e + H * M + p * v);
|
s = K * T - S;
|
O = K * I - H;
|
l = K * q - p;
|
g = N * e - S;
|
z = N * M - H;
|
Q = N * v - p;
|
m = (g * s + z * O + Q * l) / (Math.sqrt(g * g + z * z + Q * Q) * Math.sqrt(s * s + O * O + l * l));
|
m = Math.acos(m);
|
G = z * l - Q * O;
|
j = 0 - (g * l - Q * s);
|
A = g * O - z * s;
|
if (S != 0) {
|
o = G / S
|
} else {
|
if (H != 0) {
|
o = j / H
|
} else {
|
o = A / p
|
}
|
}
|
if (o > 0) {
|
y += m;
|
k++
|
} else {
|
x += m;
|
h++
|
}
|
}
|
var u, r;
|
u = y + (2 * Math.PI * h - x);
|
r = (2 * Math.PI * k - y) + x;
|
if (y > x) {
|
if ((u - (B - 2) * Math.PI) < 1) {
|
f = u
|
} else {
|
f = r
|
}
|
} else {
|
if ((r - (B - 2) * Math.PI) < 1) {
|
f = r
|
} else {
|
f = u
|
}
|
}
|
w = (f - (B - 2) * Math.PI) * n * n;
|
return w
|
}
|
})();
|