代码之家  ›  专栏  ›  技术社区  ›  Huskie69

javascript-在两组数字之间添加缺少的值

  •  0
  • Huskie69  · 技术社区  · 8 年前

    我脑子里有一个概念,但不完全确定实现它的最佳方式。

    我正在研究(在javascript中)如何填充两点之间丢失的坐标数据值(以lat/lon对表示)。

    我有两对坐标:

    Point A  lat="32.7188350" lon="-16.7611710"
    
    Point B lat="32.711461" lon="-16.911347"
    

    我首先需要将每对的纬度和经度提取成一个单独的值。

    所以…

    latA="32.718835"
    lonA="-16.761171"
    
    latB="32.711461"
    lonB="-16.911347"
    

    我想在这个精度的lata和latb之间插入额外的(缺少的)值。在这个例子中,我们将创建7373个额外的数字/纬度点。

    32.718835 - 32.711461 = 0.007374
    

    然后我想为每个纬度点插入相同数量的相应纵向点(7373)。
    最终结果将是7373个额外的坐标对-从而填补空白。

    关于如何实施这一点的任何建议都非常感谢。

    3 回复  |  直到 8 年前
        1
  •  1
  •   Jaromanda X    8 年前

    注意:我假设您想要A和B之间一行的点列表

    以下代码将运行,不管这两点如何相互关联,即,如果lata大于或小于latb,以及lona大于或小于lonb,在任何组合中

    它可能有点复杂,“整数”的使用可能有点过头,但这应该让您了解如何继续。

    var latA=32.718835,
        lonA=-16.761171,
        latB=32.711461,
        lonB=-16.911347,
        lat = Math.floor(latA * 1e6), // use integers
        lon = Math.floor(lonA * 1e6),
        count = Math.floor(Math.abs(latA-latB)*1e6)+1, // count is always positive, and we add 1 so the following is correct
        lonDiff = (lonB-lonA) / count * 1e6, // this can be either positive or negative, we don't care, it's multiplied by 1e6 so we use integers
        latSign = Math.sign(latB - latA), // so we go in the right direction
        arr = [];
        
    for (let i = 0; i <= count; i++) { // use <= so we have both A and B in the array
    
        arr.push({
            lat: (lat / 1e6).toFixed(6),
            lon: (lon / 1e6).toFixed(6)
        });
        lat += latSign;
        lon += lonDiff;
        
    }
    console.log(arr[0], arr.slice(-1)); // just to show that first/last points are correct

    然而,使用此代码,点的数量总是由纬度差决定的-在这种情况下,对于每1/1000000度的纬度,经度会有20/1000000度的变化-不确定是否要根据纬度和经度的最大或最小差异来插入点

    下面的代码是一般化的-事实上,它将选择更大的差异进行循环-代码中的注释显示要更改的两个位置,使其行为与上面的代码完全相同

    var latA=32.718835,
        lonA=-16.761171,
        latB=32.711461,
        lonB=-16.911347,
        lat = Math.floor(latA * 1e6), // use integers
        lon = Math.floor(lonA * 1e6),
        countLat = Math.floor(Math.abs(latA-latB)*1e6)+1,
        countLon = Math.floor(Math.abs(lonA-lonB)*1e6)+1,
        count = Math.max(countLat, countLon), // change to Math.min to use least number of points
        lonDiff = (lonB-lonA) / countLat * 1e6,
        latDiff = (latB-latA) / countLon * 1e6,
        latSign = Math.sign(latB - latA),
        lonSign = Math.sign(lonB - lonA),
        arr = [];
        
    if (countLat < countLon) { // change to > to use least number of points
        lonDiff = lonSign;
    } else {
        latDiff = latSign;
    }
        
    for (let i = 0; i <= count; i++) {
        arr.push({
            lat: (lat / 1e6).toFixed(6),
            lon: (lon / 1e6).toFixed(6)
        });
        lat += latDiff;
        lon += lonDiff;
        
    }
    console.log(arr.length, arr[0], arr.slice(-1)[0]);
        2
  •  0
  •   Lukas Poustka    8 年前

    我已经解决了类似的任务:

    let points = [[32.7188350, -16.7611710],[32.711461, -16.911347]];
    let result = [];
    for (let i = 0; i < points.length-1; i++) {
    	result.push([
      Math.round(Math.abs(points[i][0] - points[i+1][0])*1000000)/1000000,
      Math.round(Math.abs(points[i][1] - points[i+1][1])*1000000)/1000000
      ]);
    }
    alert(result);
        3
  •  0
  •   Emeeus    8 年前

    据我所知,这个问题适用于线性函数,要填充A和B之间的点,我们必须应用由这些点A和B定义的函数。这里有一个示例:

    var pointB=["-16.911347","32.711461"];//x,y
    
    var pointA=["-16.7611710","32.7188350"];//x,y
    
    
    var slope = (pointB[1]-pointA[1])/(pointB[0]-pointA[0]);
    
    var b = pointB[1] - slope*pointB[0];
    
    var steps = Math.ceil((pointA[1] - pointB[1])*1000000);
    
    var points = []//<-- here the points
    
    for(let i= 1; i<=steps; i++){
    
        let y = +pointB[1]+(i/1000000);
    
        points.push([(y-b)/slope,y])
    
    }
    
    console.log(points[points.length-1])//<- just the last value

    这在A和B之间画一条直线。我们选择 y 查找的值 x .

    推荐文章