<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script src="data.js"></script>
<title>Document</title>
</head>
<body>
</body>
<script>
var s = "112.523197631836,37.868892669677734;112.5170669555664,37.8605842590332;112.52099609375,37.849857330322266;112.54137420654297,37.8512732521875;112.5351180302734,37.858699798583984"
console.log(computeSignedArea(cvpath(s)))
function cvpath(s) {
let path = s.split(';').map(item => {
return {
lng: item.split(',')[0]/1,
lat: item.split(',')[1]/1
}
})
return path
}
function computeSignedArea(path) {
let radius = 6371009
let len = path.length
if (len < 3) return 0
let total = 0
let prev = path[len - 1]
let prevTanLat = Math.tan(((Math.PI / 2 - prev.lat / 180 * Math.PI) / 2))
let prevLng = (prev.lng) / 180 * Math.PI
for (let i in path) {
let tanLat = Math.tan((Math.PI / 2 -
(path[i].lat) / 180 * Math.PI) / 2)
let lng = (path[i].lng) / 180 * Math.PI
total += polarTriangleArea(tanLat, lng, prevTanLat, prevLng)
prevTanLat = tanLat
prevLng = lng
}
return Math.abs(total * (radius * radius))
}
function polarTriangleArea(tan1, lng1, tan2, lng2) {
let deltaLng = lng1 - lng2
let t = tan1 * tan2
return 2 * Math.atan2(t * Math.sin(deltaLng), 1 + t * Math.cos(deltaLng))
}
</script>
</html>
<script>
var earthRadiusMeters = 6371000.0
var metersPerDegree = 2.0 * Math.PI * earthRadiusMeters / 360.0
var radiansPerDegree = Math.PI / 180.0
var degreesPerRadian = 180.0 / Math.PI
var pointArr=[]
let d=data
console.log(d)
b(data)
function calculateArea(points) {
if (points.length > 2) {
var areaMeters2 = PlanarPolygonAreaMeters2(points)
// if (areaMeters2 > 1000000.0) {
areaMeters2 = SphericalPolygonAreaMeters2(points)
alert("面积为" + areaMeters2 + "平方米")
// }
}
}
function b() {
var s = "112.523197631836,37.868892669677734;112.5170669555664,37.8605842590332;112.52099609375,37.849857330322266;112.54137420654297,37.8512732521875;112.5351180302734,37.858699798583984"
// let s=data
var s1 = new Array()
s1 = s.split(";")
for (var i = 0
var ss = s1[i]
var temp = ss.split(",")
var point = new Array()
point.push(Number(temp[0]), Number(temp[1]))
pointArr.push(point)
}
calculateArea(pointArr)
}
/*球面多边形面积计算*/
function SphericalPolygonAreaMeters2(points) {
var totalAngle = 0
for (var i = 0
var j = (i + 1) % points.length
var k = (i + 2) % points.length
totalAngle += Angle(points[i], points[j], points[k])
}
var planarTotalAngle = (points.length - 2) * 180.0
var sphericalExcess = totalAngle - planarTotalAngle
if (sphericalExcess > 420.0) {
totalAngle = points.length * 360.0 - totalAngle
sphericalExcess = totalAngle - planarTotalAngle
} else if (sphericalExcess > 300.0 && sphericalExcess < 420.0) {
sphericalExcess = Math.abs(360.0 - sphericalExcess)
}
return sphericalExcess * radiansPerDegree * earthRadiusMeters * earthRadiusMeters
}
/*角度*/
function Angle(p1, p2, p3) {
var bearing21 = Bearing(p2, p1)
var bearing23 = Bearing(p2, p3)
var angle = bearing21 - bearing23
if (angle < 0) {
angle += 360
}
return angle
}
/*方向*/
function Bearing(from, to) {
var lat1 = from[1] * radiansPerDegree
var lon1 = from[0] * radiansPerDegree
var lat2 = to[1] * radiansPerDegree
var lon2 = to[0] * radiansPerDegree
var angle = -Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2))
if (angle < 0) {
angle += Math.PI * 2.0
}
angle = angle * degreesPerRadian
return angle
}
/*平面多边形面积*/
function PlanarPolygonAreaMeters2(points) {
var a = 0
for (var i = 0
var j = (i + 1) % points.length
var xi = points[i][0] * metersPerDegree * Math.cos(points[i][1] * radiansPerDegree)
var yi = points[i][1] * metersPerDegree
var xj = points[j][0] * metersPerDegree * Math.cos(points[j][1] * radiansPerDegree)
var yj = points[j][1] * metersPerDegree
a += xi * yj - xj * yi
}
return Math.abs(a / 2)
}
</script>
有想换工作的同学可以找我内推哦不低于15k(前端,java,测试)
