用n个gps坐标测量面积

Measuring area with n amount of gps coordinates

本文关键字:测量 坐标 gps      更新时间:2023-09-26

我需要能够使用javascript/jquery测量n数量的gps坐标的面积。我无法使用javascript或n个坐标找到这一点,所以我决定问是否有人知道如何?

一个例子是,我有6个独立的经纬度坐标,我需要用它们来测量它们的面积(以平方米为单位)。

帮忙吗?:)

此解决方案仅适用于由纬度/经度点形成的凸多边形。大部分工作是按照逆时针顺序重新排列经纬度点。一旦重新排序完成,你可以很容易地找到不规则多边形的面积。

//make sure to add the first term to the end of both arrays
//              ---------------SAME---------------
//             |                                  |
var lats = [25.767368, 34.088808, 40.727093, 25.767368];
//             |                                  |
var lons = [-80.18930, -118.40612, -73.97864, -80.18930];
//get the average center point of the polygon
var lats_sum = 0;
var lons_sum = 0; 
for (var i=lats.length; i--;) {
    lats_sum += lats[i];
    lons_sum += lons[i]; 
}
var lat_origin = lats_sum / lats.length; 
var lon_origin = lons_sum / lons.length; 
//translate origin to (0,0) by shifting lat lons
//and calculate the standard angle of the point
var angles = new Array(lats.length); 
for (var j=lats.length; j--;) {
    lats[j] -= lat_origin; 
    lons[j] -= lon_origin; 
    if (lons[j] >= 0 && lats[j] >= 0) {
        angles[j] = Math.abs(Math.atan(lats[j]/lons[j]) * 180 / Math.PI); 
    } else if (lons[j] < 0 && lats[j] >= 0) {
        angles[j] = 90 + Math.abs(Math.atan(lats[j]/lons[j]) * 180 / Math.PI); 
    } else if (lons[j] < 0 && lats[j] < 0) {
        angles[j] = 180 + Math.abs(Math.atan(lats[j]/lons[j]) * 180 / Math.PI); 
    } else if (lons[j] >= 0 && lats[j] < 0) {
        angles[j] = 270 + Math.abs(Math.atan(lats[j]/lons[j]) * 180 / Math.PI);
    }
}
//re-arrange the points from least to greatest angle 
var cur_ang, cur_lat, cur_lon; 
for (var l = 0; l < angles.length; l++) {
    for (var k = 0; k < angles.length - 1; k++) {
        cur_ang = angles[k]; 
        cur_lat = lats[k]; 
        cur_lon = lons[k]; 
        if (cur_ang < angles[k+1]) {
            angles[k] = angles[k+1];
            lats[k] = lats[k+1]; 
            lons[k] = lons[k+1]; 
            angles[k+1] = cur_ang; 
            lats[k+1] = cur_lat; 
            lons[k+1] = cur_lon; 
        }
    }
}
//calculate area for irregular polygon
var sum1 = 0;
var sum2 = 0; 
for (var t = 0; t < lats.length; t++) {
    if (t != lats.length - 1) {
        sum1 += lats[t] * lons[t+1];
        sum2 += lons[t] * lats[t+1]; 
    } else {
        sum1 += lats[t] * lons[0]; 
        sum2 += lons[t] * lats[0]; 
    }
}
var area = (sum1 - sum2) / 2.0;
console.log("Area: " + area); 

那么当谈到将长面积转换为平方米时,我不知道。这是我在网上找到的一个功能,可以帮助你开始。

// Use to convert from lat long dist to meters
function measure(lat1, lon1, lat2, lon2){  // generally used geo measurement function
    var R = 6378.137; // Radius of earth in KM
    var dLat = (lat2 - lat1) * Math.PI / 180;
    var dLon = (lon2 - lon1) * Math.PI / 180;
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return d * 1000; // meters
}