Перекрестное сравнение объектов внутри объекта - PullRequest
0 голосов
/ 30 апреля 2018

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

function FarthestDistance(points) {
// here this function should cross compare all objects within 'points' to calculate which two locations have the furthest distance between them
// the function should calculate the distance between each point in a recursive manner and return the two farthest points back
}

var obj = {{lat1,lon1},{lat2,lon2},{lat3,lon3},{lat4,lon4}};
FarthestDistance(obj);

Надеюсь, теперь все ясно. Спасибо.

1 Ответ

0 голосов
/ 01 мая 2018

Хорошо, это для модуля Magic Mirror , который я делаю. Это оболочка для Traccar Service , которая будет развернута на волшебном зеркале. Мне нужно было рассчитать две самые дальние точки на карте из объекта, содержащего несколько местоположений каждого зарегистрированного пользователя. Затем, когда у меня появятся две самые дальние точки на карте, я смогу вычислить среднюю точку между ними, чтобы установить ее в качестве центра карты. Сейчас я работаю над увеличением масштаба карты, чтобы включить все маркеры на карте ... в любом случае, для проблемы, которую я объяснил здесь, решение было найдено после небольшого количества исследований. Вот и все.

function toRadians (deg){ // Helper function
    return deg * (Math.PI/180);
}

function toDegrees (rad){ // Helper function
    return rad * (180/Math.PI);
}

function distance (obj){ // Helper function from https://www.movable-type.co.uk/scripts/latlong.html | http://mathforum.org/library/drmath/view/51822.html
    var R = 6371e3; // metres
    var φ1 = obj[0][0];
    var φ2 = obj[1][0];
    var Δφ = obj[1][0]-obj[0][0];
    var Δλ = obj[1][1]-obj[0][1];

    var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
            Math.cos(φ1) * Math.cos(φ2) *
            Math.sin(Δλ/2) * Math.sin(Δλ/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    return (R * c);
}

function midPoints(obj){ // Helper functions (which I modified for the specifications) from /377280/algoritm-nahozhdeniya-dvuh-tochek-naibolee-udalennyh-drug-ot-druga | https://www.movable-type.co.uk/scripts/latlong.html | http://mathforum.org/library/drmath/view/51822.html
    var self = this;
    var solution = {"start": [], "end": [], "distance": 0};
    for (i = 0; i < obj.length; i++) { 
        for (j = i+1; j < obj.length; j++) {
            var newpoint = [
                [
                    self.toRadians(obj[i][0]),
                    self.toRadians(obj[i][1])
                ],
                [
                    self.toRadians(obj[j][0]),
                    self.toRadians(obj[j][1])
                ]
            ];
            var distance = self.distance(newpoint);
            if (distance > solution.distance){
                solution = {"start": [obj[i][0],obj[i][1]], "end": [obj[j][0],obj[j][1]], "distance": distance}
            }
        }
    }
    var Bx = Math.cos(solution.end[0]) * Math.cos(solution.end[1]-solution.start[1]);
    var By = Math.cos(solution.end[0]) * Math.sin(solution.end[1]-solution.start[1]);
    var latMid = Math.atan2(Math.sin(solution.start[0]) + Math.sin(solution.end[0]),Math.sqrt((Math.cos(solution.start[0])+Bx)*(Math.cos(solution.start[0])+Bx) + By*By ) );
    var lonMid = solution.start[1] + Math.atan2(By, Math.cos(solution.start[0]) + Bx);
    return {"lat": self.toDegrees(latMid), "lon": self.toDegrees(lonMid), "distance": solution.distance};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...