Javascript 用n个gps坐标测量区域

Javascript 用n个gps坐标测量区域,javascript,map,gps,coordinates,Javascript,Map,Gps,Coordinates,我需要能够使用javascript/jquery测量n个gps坐标的面积。我无法使用javascript或n个坐标完成此操作,因此我决定询问是否有人知道如何操作 一个例子是,我有6个独立的lat/lon坐标,我需要用它来测量它们的面积(以平方米为单位) 有什么帮助吗?:) 此解决方案仅适用于由纬度/经度点形成的凸多边形。大部分工作是按逆时针顺序重新排列纬度/经度点。一旦完成了重新排序,就可以很容易地找到不规则多边形的区域 //make sure to add the first term to

我需要能够使用javascript/jquery测量n个gps坐标的面积。我无法使用javascript或n个坐标完成此操作,因此我决定询问是否有人知道如何操作

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


有什么帮助吗?:)

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

//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); 

谢谢如果上面的面积测量能起作用,那已经是很大的帮助了。明天我将测试它,并试图为平方米/公里转换找到一些东西。似乎如果我使用真实坐标和小距离变化(就像这样),比如var lats=[51.5072,51.5172,51.5272,51.5372,51.5472];var lons=[0.1275,0.1175,0.1075,0.0975,0.0875];Sum1和Sum2最终是相同的,总面积是0。如果这些点形成一条直线,那么面积将基本为零。另外,请确保两个数组的长度相同。你的lons数组中有1个太多了。看来我为这条评论添加了额外的内容,对不起。但也没有想到直线。我使用了地图上的4个gps点,我知道它们形成了一个平方公里的正方形,我得到了答案:-6.426489562727511e-9。这正是我现在应该拥有的转换为平方米/英里/公里的东西吗?不,我忘记了阵列中纬度的排列顺序很重要。你必须按逆时针的顺序检查,否则你将得不到正确的结果。我将研究如何更改它,并在我弄明白后更新代码。
// 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
}