前面 GeoUtils 類可以很好的計算密閉多邊形、矩形框出的區域面積,但沒有解決折線自相交框出的區域面積計算,這就需要開發人員自己去解決了,
度娘了幾篇文章,最終找到了一個計算方法,經實測效果不錯,結果也比較精準,
// 計算圖形面積 // path:[{lat:,lng:}],[{lat:,lng:}],[{lat:,lng:}] 路勁坐標點陣列 computeSignedArea(path) { let radius = 6370996.81; // 地球平均半徑 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 = 0; i < len; i++) { let tanLat = Math.tan( (Math.PI / 2 - (path[i].lat / 180) * Math.PI) / 2 ); let lng = (path[i].lng / 180) * Math.PI; total += this.polarTriangleArea(tanLat, lng, prevTanLat, prevLng); prevTanLat = tanLat; prevLng = lng; } return Math.abs(total * (radius * radius)); }, // 計算圖形面積 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)); }
方法使用也比較簡單,直接將自相交折線 各個點的坐標組成一個陣列,傳入 computeSignedArea(path) 就行,
由于方法回傳的面積是以平方米作為單位的,所以需要處理下(畢竟地圖區域那么大,以平方米計算,數字顯得很大,但區域卻不見得有多大,故用平方千米作為單位,以此來和我大中國960萬平方千米比較,顯得你這個區域有多大點)
geoUtilsValue = https://www.cnblogs.com/dihong/p/that.computeSignedArea(overlayList) / 1000000 +"平方千米";

參考博文鏈接:https://blog.csdn.net/qq_38615014/article/details/89207005
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/246481.html
標籤:JavaScript
上一篇:JavaScript => ?
下一篇:js 浮點數陷阱
