Получение координат пункта назначения от служб направления по расстоянию - PullRequest
0 голосов
/ 14 октября 2011

Мне нужно получить координаты пункта назначения с помощью службы направлений API Google Maps. У меня уже есть координаты начальной точки, однако вместо указания конечной точки в координатах я хочу получить координаты, указав расстояние (в км).

Таким образом, я предполагаю, что мой вопрос заключается в следующем: возможно ли получить координаты широты назначения (основанные / рассчитанные по расстоянию дороги, а не по направлению / прямой линии), указав расстояние (количество в км) с помощью службы маршрутов или возможно какой-нибудь альтернативный способ?

У меня есть иллюстрация с изображением, но, к сожалению, я не могу присоединиться к этому вопросу, поскольку у меня недостаточно репутации Если мой вопрос каким-либо образом неясен или вы хотите увидеть иллюстрацию, свяжитесь со мной, и я вышлю его.

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Я не думаю, что вы можете сделать это, поскольку параметры запроса говорят, что требуются параметры источника и назначения.

0 голосов
/ 24 октября 2011

Я верю, что вы правы. Кажется, в API нет текущего метода, который позволил бы вам сделать следующее.

Вместо этого я перебрал координаты, полученные из вызова службы маршрутов, и использовал функцию для вычисления расстояния между координатами. Однако даже это не было достаточно точным, так как возвращенные координаты также казались агрегированными и не возвращали точное значение / расстояние при расчете расстояний между каждой координатой, поскольку они агрегированы, и, следовательно, каждая координата не является необходимой вдоль дороги.

Чтобы обойти эту проблему, я добавил событие щелчка и сам нанес координаты вдоль дороги, а затем сохранил их в локальном файле json, который я кеширую и вызываю с помощью xmlhttprequest.

К счастью, для моей ситуации мне нужно только рассчитать расстояние между точками A и B на одной отдельной дороге, поэтому моя альтернатива не сработает в тех случаях, когда вы используете несколько или общие дороги / места. Вместо этого вы можете использовать первый описанный метод, учитывая, что вы готовы жить с агрегированными данными и неточными вычислениями.

Ниже приведены функции, используемые для расчета расстояний между координатами, а также окончательного расчета для нахождения точки и координат между последними двумя точками. Обратите внимание, что этот код использует и использует методы jQuery.

1. Рассчитать расстояние (в метрах) между двумя координатами

function pointDistance( begin, end )
{
    var begin   = { lat: begin[0], long: begin[1] },
        end     = { lat: end[0], long: end[1] };

    // General calculations
    var earthRadius     = 6371, //km
        distanceLat     = (end.lat - begin.lat).toRad(),
        distanceLong    = (end.long - begin.long).toRad();

    // Convert lats to radiants
    begin.lat   = begin.lat.toRad();
    end.lat     = end.lat.toRad();

    // Calculation
    var a = Math.sin(distanceLat / 2) * Math.sin(distanceLat / 2) +
            Math.sin(distanceLong / 2) * Math.sin(distanceLong / 2) * Math.cos(begin.lat) * Math.cos(end.lat);

    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    var distance = (earthRadius * c) - 0.000536;

    return (distance * 1000);
}

2. Получить координату конечной координаты A-B (на основе оставшегося процента). Переменная 'matrix' - это массив координат json.

function getCoordinates( totalDistance )
{
    var lastPoint   = { lat: null, long: null },
        total       = parseFloat(0),
        position    = { start: null, end: null, distance: 0 };

    $(matrix).each(function()
    {
        if ( lastPoint.lat == null )
        {
            lastPoint = { lat: this[0], long: this[1] };
            return;
        }

        var distance = pointDistance([lastPoint.lat, lastPoint.long], [this[0], this[1]]);
        total = total + distance;

        if ( (total / 1000) >= totalDistance )
        {
            position.start      = new google.maps.LatLng(lastPoint.lat, lastPoint.long);
            position.end        = new google.maps.LatLng(this[0], this[1]);
            position.distance   = total;

            return false;
        }

        lastPoint = { lat: this[0], long: this[1] };
    });

    return position;
}

3. Преобразовать числовые градусы в радианы

if ( typeof(Number.prototype.toRad) === 'undefined' ) {
    Number.prototype.toRad = function() {
        return this * Math.PI / 180;
    }
}

Надеюсь, что следующее поможет любому с той же или симуляционной проблемой. Я не исследовал это, так как мне не было необходимости, но, возможно, если вы имеете дело с платными сервисами Google, они не агрегируют данные, возвращаемые звонком?

...