Google Map Road API not interpolating path and not giving smooth route

社会主义新天地 提交于 2019-12-23 04:57:17

问题


I am trying to get smooth route for below route path using road API in Roads Inspector but not getting smooth route.Google road api failing to provide smooth route.Some portion of route is not smooth with actual road route e.g at turns, at bridges etc. Please have look for below route path and provide solution to get smooth route/more accurate route along actual road.

Points:

42.04144333333333,-88.060575|42.04123666666667,-88.06014333333333|42.04119166666667,-88.06017166666666|42.040835,-88.05990166666666|42.03982666666667,-88.05242333333334|42.03903666666667,-88.04572333333333|42.03903833333333,-88.04572|42.038495,-88.04141833333334|42.03774666666666,-88.03593833333333|42.037683333333334,-88.03549|42.034861666666664,-88.03204166666667|42.02808,-88.031215|42.02045666666667,-88.03131166666667|42.012881666666665,-88.02988833333333|42.00522333333333,-88.02747666666667|41.997353333333336,-88.02500333333333|41.98961333333333,-88.02349333333333|41.982191666666665,-88.02351333333333|41.97412833333333,-88.02447333333333|41.96599,-88.02588166666666|41.95825833333333,-88.027075|41.952605,-88.03345|41.945281666666666,-88.0377|41.937595,-88.03779333333334|41.92935,-88.037845|41.92084333333333,-88.03799166666667|41.91231,-88.038075|41.90379,-88.038145|41.89564,-88.03784166666667|41.887255,-88.036495|41.87881,-88.03291666666667|41.87096833333333,-88.03694333333334|41.863101666666665,-88.04085166666667|41.85484833333334,-88.04049166666667|41.848978333333335,-88.03315166666667|41.842145,-88.02940833333334|41.83407,-88.02922|41.826135,-88.029025|41.820256666666666,-88.02674333333333|41.813515,-88.02884833333333|41.80965333333333,-88.03722166666667|41.810065,-88.04824833333333|41.8104,-88.06018333333333|41.81016666666667,-88.07216833333334|41.80704166666666,-88.08223833333334|41.80573666666667,-88.09275|41.80591166666667,-88.10409166666666|41.80608,-88.11518333333333|41.80625166666667,-88.12632166666667|41.806415,-88.13737333333333|41.80649666666667,-88.14849166666667|41.80653,-88.15959333333333|41.80652666666667,-88.17042666666667|41.805715,-88.181295|41.80482833333333,-88.19194333333333|41.803918333333336,-88.202765|41.80304666666667,-88.212815|41.802146666666665,-88.22354833333333|41.801383333333334,-88.23485666666667|41.80068833333333,-88.24686666666666|41.8,-88.25845333333334|41.799368333333334,-88.26976833333333|41.798743333333334,-88.28041666666667|41.80003166666667,-88.28312833333334|41.795566666666666,-88.28211666666667|41.79022,-88.28205833333334|41.785465,-88.28198|41.784135,-88.28193833333333|41.782473333333336,-88.283865|41.78230833333333,-88.28874666666667|41.782226666666666,-88.288225|41.781863333333334,-88.287305|41.78176833333333,-88.28751333333334|41.78176833333333,-88.28751333333334

points in the "inspector"


回答1:


Your points don't look like the full output of a GPS tracker (the use case for which this API is designed), and thus you have stretches that are too far apart. Please increase the resolution of your GPS recording to get better output.




回答2:


Google maps seems not to snap far points, (if the distance between is longer than 300m - 400m).

As a solution I added some fake points between points that too far apart.

And now Google Maps snapping my route correctly.

List<LatLon> extendedPointsList = new List<LatLon>();
var lastLatLon = OrigionalRoute[0];
extendedPointsList.Add(lastLatLon);
indexesBeforeAddingPoints.Add(0);

for (int i = 1; i < OrigionalRoute.Count; i++)
{
    var currentLatlon = OrigionalRoute[i];
    double estimatedDistance = 
    getEstimatedDistanceBetweenPoints(currentLatlon, lastLatLon);

    //estimated 400 meters
    if (estimatedDistance > 0.004)
    {
        //estimated 340 meters
        int countOfPoints = (int)Math.Round(estimatedDistance / 0.0034); 


        if (countOfPoints > 1)
        {
            var latDiff = (currentLatlon.Lat - lastLatLon.Lat) / countOfPoints;
            var lonDiff = (currentLatlon.Lon - lastLatLon.Lon) / countOfPoints;

            for (int j = 1; j < countOfPoints; j++)
            {
                var aveLat = lastLatLon.Lat + (latDiff * j);
                var aveLon = lastLatLon.Lon + (lonDiff * j);

                indexesBeforeAddingPoints.Add(i - 1);
                extendedPointsList.Add(new LatLon(aveLat, aveLon));
            }
        }
    }

    indexesBeforeAddingPoints.Add(i);
    extendedPointsList.Add(currentLatlon);

    lastLatLon = currentLatlon;
}

OrigionalRoute = extendedPointsList;

The method to estimate distance (I ignored earth's sphere and projection).

private static double getEstimatedDistanceBetweenPoints(LatLon pointA, LatLon pointB)
{
    return Math.Sqrt(Math.Pow((pointA.Lat - pointB.Lat), 2) + Math.Pow((pointA.Lon - pointB.Lon), 2));
}


来源:https://stackoverflow.com/questions/36025339/google-map-road-api-not-interpolating-path-and-not-giving-smooth-route

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!