Javascript - добавление пропущенных значений между двумя наборами чисел - PullRequest
0 голосов
/ 11 сентября 2018

У меня в голове есть концепция, но я не совсем уверен в том, как лучше ее реализовать.

Я исследую (в JavaScript) способы заполнения пропущенных значений координатных координат (в парах широта / долгота) между двумя точками.

У меня есть две пары координат ниже:

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 ]

0 голосов
/ 11 сентября 2018

Я решил похожую задачу:

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);
0 голосов
/ 11 сентября 2018

Как я понимаю, эта задача вписывается в линейную функцию, чтобы заполнить точки между 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.

0 голосов
/ 11 сентября 2018

Примечание: я предполагаю, что вам нужен список точек на линии между А и В

Следующий код будет выполняться независимо от того, как две точки связаны друг с другомт. е. если значение 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]);
...