开发者

Retrieving destination coordinates from direction services by distance

I need to retrieve a destination's coordinates using the google maps api directions service. I already have the starting point coordinates, however instead of specifying an ending point in coordinates, I wish to retrieve the coordinates by specifying a distance (in km).

So I guess my question is the following: is it possible to retrieve the destination latlong coordinates (based/calculated on the road开发者_StackOverflow's distance and not directional/straight line) by specifying a distance (amount in km) with the directions service or perhaps any alternative way?

I have an image illustration, however unfortunately am unable to attach to this question as I do not have enough reputation. If my question is unclear in any way, or you wish to see the illustration then please contact me and I'll send it off.


I don't think you can do this as the request parameters say that origin and destination parameters are required.


I beliave it will help someone.

There is a method to get coordinates in the google maps library:

google.maps.geometry.spherical.computeOffset(fromCoordinates, distanceInMeters, headingInDegrees)


I believe you are correct. There doesn't seem to be any current method in the api which would allow you to do the following.

Instead I looped through the coordinates returned from the directions service call, and used a function to calculate the distance between coordinates. However even this was not accurate enough as the coordinates returned also seemed to be aggregated and doesn't return an accurate value/distance when calculating the distances between each coordinate as they are aggregated and therefore each coordinate is not necessary along the road.

To work around the above issue, I ended up adding a click event, and plotted the coordinates along the road myself and then stored them in a local json file which I cache and call using an xmlhttprequest.

Fortunately, for my situation I only need to calculate the distance between point A & B on one individual road, so my alternative won't work in cases when you're using multiple or generic roads/locations. You could instead use the first method described, given that you're happy to live with the aggregated data and an in-accurate calculation.

Below are the functions used to calculate the distances between coordinates and then also the final calculation to find the point & coordinates between the final two points. Please note this code relies on and uses jQuery methods.

1. Calculate distance (in meters) between two coordinates

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. Fetch coordinate of final A-B coordinate (based on percentage remaining). The 'matrix' variable is a json array of coordinates.

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. Convert numeric degrees to radians

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

Hope the following helps any one with the same or simular problem. I haven't investigated this as I've had no need to, but, perhaps if you're dealing with google's paid services, they don't aggregate the data returned by the call?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜