使用Google地图API API v3的DirectionsService查找并显示最近标记的路线

时间:2013-05-17 11:23:52

标签: php javascript jquery google-maps-api-3 google-direction

感谢您在这个论坛中的帮助,我几乎完成了我的任务,搜索起点和许多标记之间的最短路径。然而,我的距离测量只是采用了Haversine公式,但它没有显示两点之间的真实路由距离。我正在尝试结合以前开发的功能,这些功能已在Google Map中使用,以使用DirectionServices获得两点之间的最短距离。从下面的主页,我找到了计算每条路线距离的方法。 http://ratan.com.np/calculate-distance-location-longitude-latitude-google-maps-v3-route/

并且我已经反复检查了我的代码,但我仍然不知道为什么代码失败...它返回了语法错误'意外令牌<'....

任何人都可以帮我看一下代码......在我修改过的程序中看到任何概念上的错误......非常感谢...

单击按钮调用'Submit2()函数

var directionsDisplay;
var directionsService = new google.maps.DirectionsService();

var map;
var origin = null;
var destination = null;
var markersArray = [];

var start_lat = null;
var start_long = null;
var end_lat = null;
var end_long = null;

var station_num = null; 
var trig_name = null;


var total_dist;
var closest_dist;
var closest_marker;


var Submit2=function() {

        var URL2="Search_nearest_trig_advanced.php";    //Call another PHP to load all markers in JSON format
        $.ajax({
            url: URL2,

            type: "POST",
            dataType: "json",
            success: function(data){
                $.each(data, function(i, item) {
                     start_lat = item.start_lat;  //Return the Lat, Lng of the Starting point from Textbox
                     start_long = item.start_long;
                     station_num = item.station_num; 
                     trig_name = item.trig_name;
                     end_lat = item.end_lat;
                     end_long = item.end_long;


                     origin = new google.maps.LatLng(start_lat, start_long); //Origin and Destination parameters are used for Google Direction Services
                     destination = new google.maps.LatLng(end_lat, end_long);   
                     marker = new google.maps.Marker({
                         map: map,
                         position: destination,
                         icon: trigicon,
                         title: trig_name
                     })
                     markersArray.push(marker);
                     calcRoute2();  //find the total distance 'total_dist' for each route

                     if (total_dist > closest_dist) { //Replace the closest_marker by the one with shorter distance
                     closest_dist = total;   
                     closest_marker.setMap(null);
                     closest_marker = marker;
                     } 

                }); 
            },

            error:function(xhr, ajaxOptions, thrownError){ 
                alert(xhr.status); 
                alert(thrownError); 
             }

        }); 

        destination = closest_marker.getPosition();
        calcRoute(); //the original method to show the route


};

调用calcRoute()函数计算路径距离

  function calcRoute2() {

  document.getElementById("directions_panel").innerHTML = "";


  directionsDisplay = new google.maps.DirectionsRenderer({
    'map': map,
    'preserveViewport': false,  //Google Map will change the zoom extent to match with the Direction route if set false
    'draggable': true
});


var request = {
    origin: origin,
    destination: destination,
    waypoints: waypoints,
    travelMode: google.maps.DirectionsTravelMode.DRIVING,
    optimizeWaypoints: document.getElementById('optimize').checked,
    avoidHighways: document.getElementById('highways').checked,
    avoidTolls: document.getElementById('tolls').checked
};

directionsService.route(request, function(response, status) {
  if (status == google.maps.DirectionsStatus.OK) {
    directionsDisplay.setDirections(response);
    computeTotalDistance(response);

  }
});

directionsVisible = false;
}

function computeTotalDistance(result) {
    var total_dist = 0;
    var myroute = result.routes[0];
    for (i = 0; i < myroute.legs.length; i++) {
    total_dist += myroute.legs[i].distance.value;
    }
    total_dist = total_dist / 1000 // the distance output is converted to KiloMeter

    }

'search_nearest_trig_advanced.php'

<?php
require_once "dbconnect.php";
require_once "hk1980.php";
    $coor_x = $_POST['hk80_x'];
    $coor_y = $_POST['hk80_y'];
/* Connect to the MySQL database. */
if (!($connection = @ mysql_connect($remotehost, $username, $password)))
    die("Connection failed");
if (!(mysql_select_db($database, $connection)))
    die("Couldn't select testing database");

// Run the query on the connection

$sql_query = "Select station_num, trig_name, X(trig_xy_pos) as X_Coor, Y(trig_xy_pos) as Y_Coor From trig_station";

if (!($sql_result = @ mysql_query($sql_query, $connection)))
    die("Couldn't run query");

while ($row = @ mysql_fetch_array($sql_result, MYSQL_ASSOC))
{   
        $start_east = floatval($coor_x);
        $start_north = floatval($coor_y);
        $hk1980_start = array($start_east, $start_north);   

        $end_east = floatval($row['X_Coor']);
        $end_north = floatval($row['Y_Coor']);
        $hk1980_end = array($end_east,$end_north);

        $wgs84_start = hk1980_to_wgs84($hk1980_start[1],$hk1980_start[0],2);
        $wgs84_end = hk1980_to_wgs84($hk1980_end[1],$hk1980_end[0],2);

        $row_set[] = array("start_lat" => $wgs84_start[0], "start_long" => $wgs84_start[1], "station_num" => $row['station_num'],"trig_name" => $row['trig_name'],"end_lat" => $wgs84_end[0],"end_long" => $wgs84_end[1]);
    }
    echo json_encode($row_set);
?>

2 个答案:

答案 0 :(得分:2)

DistanceMatrix不会返回路线转弯路线。您必须使用DirectionsService。因此,您要做的是首先将您的原点和目的地传递给Matrix并找到最短的路线。在您找到最短路线后,该路线将通过路线服务以获取转弯信息。

如果您需要循环多条路线,则可能需要使用高级服务。 Google限制免费访问其服务以防止滥用。

Here is a working example of the concept

相关代码:

function calculateDistances() {
    var service = new google.maps.DistanceMatrixService();
    service.getDistanceMatrix({
        origins: [origin], //array of origins
        destinations: destinations, //array of destinations
        travelMode: google.maps.TravelMode.DRIVING,
        unitSystem: google.maps.UnitSystem.METRIC,
        avoidHighways: false,
        avoidTolls: false
    }, callback);
}

function callback(response, status) {
    if (status != google.maps.DistanceMatrixStatus.OK) {
        alert('Error was: ' + status);
    } else {
        //we only have one origin so there should only be one row
        var routes = response.rows[0];
        //need to find the shortest 
        var lowest = Number.POSITIVE_INFINITY;
        var tmp;
        var shortestRouteIdx;
        var resultText = "Possible Routes: <br/>";
        for (var i = routes.elements.length - 1; i >= 0; i--) {
            tmp = routes.elements[i].duration.value;
            resultText += "Route " + destinations[i] + ": " + tmp + "<br/>";
            if (tmp < lowest) {
                lowest = tmp;
                shortestRouteIdx = i;
            }
        }
        //log the routes and duration.
        $('#results').html(resultText);

        //get the shortest route
        var shortestRoute = destinations[shortestRouteIdx];
        //now we need to map the route.
        calculateRoute(origin, shortestRoute)
    }
}

//Calculate the route of the shortest distance we found.
function calculateRoute(start, end) {
    var request = {
        origin: start,
        destination: end,
        travelMode: google.maps.TravelMode.DRIVING
    };
    directionsService.route(request, function (result, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            directionsDisplay.setDirections(result);
        }
    });
}

答案 1 :(得分:0)

如果您要尝试到多个地点的行车距离且不需要路线,请使用DistanceMatrix