1.高德JSAPI实现
引入高德接口
<script type="text/javascript" src="/uploads/20220218/bb002f7374bba0c91cea62377af96560.png"></script>
初始化坐标点数组 格式如
var pos = [[lng1,lat1],[lng2,lat2],[lng3,lat3]]
//返回单位为平方米 转化为平方公里需要初以1000000
var area = AMap.GeometryUtil.ringArea(pos);
var range = parseInt(area/1000000)+'平方公里';
2.调用网上大佬的实现函数
https://blog.csdn.net/wennjie1/article/details/73481308
function computeSignedArea(path) {
//传入path:{[{lat:,lng:}],[{lat:,lng:}],[{lat:,lng:}]}
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=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 += 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));
}
console.log('网上函数计算结果:'+(computeSignedArea(pos) / 1000000))
php 实现
function computeSignedArea($path)
{
//传入path:{[{lat:,lng:}],[{lat:,lng:}],[{lat:,lng:}]}
$radius = 6371009;
$len = count($path);
if ($len < 3) return 0;
$total = 0;
$prev = $path[$len - 1];
$prevTanLat = tan(((M_PI / 2 - $prev['lat'] / 180 * M_PI) / 2));
$prevLng = ($prev['lng']) / 180 * M_PI;
for ($i = 0; $i < $len; $i++) {
$tanLat = tan((M_PI / 2 - ($path[$i]['lat']) / 180 * M_PI) / 2);
$lng = ($path[$i]['lng']) / 180 * M_PI;
$total += polarTriangleArea($tanLat, $lng, $prevTanLat, $prevLng);
$prevTanLat = $tanLat;
$prevLng = $lng;
}
return abs($total * ($radius * $radius));
}
function polarTriangleArea($tan1, $lng1, $tan2, $lng2)
{
$deltaLng = $lng1 - $lng2;
$t = $tan1 * $tan2;
return 2 * atan2($t * sin($deltaLng), 1 + $t * cos($deltaLng));
}
dd(computeSignedArea($path) / 1000000);