当航点超过一定数量时,没有绘制路线

时间:2016-01-11 03:19:45

标签: javascript google-maps google-maps-api-3

我首先在本地驱动器中读取一组坐标,然后将它们放入 xcoord和y coord将作为开始,途径,目的地将在Google Map上绘制。

但是我发现,一旦坐标超过一定数量,路线就不再被绘制,而是没有路线的路线图。改变旅行模式也改变了有效航路点的数量。当我有> 100坐标被绘制时可以做什么?此外,我想将所有标记更改为默认标记但不是绿色标记。(26分后标记再次恢复正常。)非常感谢。

我首先使用的是关于8个航路点的问题中提供的示例,其中包括:

Plotting more than 8 waypoints in Google Maps v3

我的代码如下:

xcoord = [];
ycoord = [];
stops = [] ;

document.getElementById('file').onchange = function(){
alert('4');
var file = this.files[0];

var reader = new FileReader();
reader.onload = function(progressEvent){

var lines = this.result.split('\n');
for(var line = 0; line < lines.length; line++){
  //alert(lines[line]);
  var split = [];
  split = lines[line].split(',');
  window.xcoord.push(split[0]);
  window.ycoord.push(split[1]);    
}
alert('finish');    
}

reader.readAsText(file); 

};  

jQuery(function() {

document.getElementById('button').onclick = function initMap(){
for(i = 0;i<xcoord.length;i++){
window.stops.push({"Geometry":{"Latitude":xcoord[i],"Longitude":ycoord[i]}});}
var map = new window.google.maps.Map(document.getElementById("map"));

// new up complex objects before passing them around
var directionsDisplay = new window.google.maps.DirectionsRenderer();
var directionsService = new window.google.maps.DirectionsService();

Tour_startUp(stops);

window.tour.loadMap(map, directionsDisplay);
window.tour.fitBounds(map);

if (stops.length > 1)
    window.tour.calcRoute(directionsService, directionsDisplay);}});



function Tour_startUp(stops) {
if (!window.tour) window.tour = {
    updateStops: function (newStops) {
        stops = newStops;
    },
    // map: google map object
    // directionsDisplay: google directionsDisplay object (comes in empty)
    loadMap: function (map, directionsDisplay) {
        var myOptions = {
            zoom: 13,
            center: new window.google.maps.LatLng(22.2830, 114.200), 
            mapTypeId: window.google.maps.MapTypeId.ROADMAP
        };
        map.setOptions(myOptions);
        directionsDisplay.setMap(map);
    },
    fitBounds: function (map) {
        var bounds = new window.google.maps.LatLngBounds();

        // extend bounds for each record
        jQuery.each(stops, function (key, val) {
            var myLatlng = new window.google.maps.LatLng(val.Geometry.Latitude, val.Geometry.Longitude);
            bounds.extend(myLatlng);
        });
        map.fitBounds(bounds);
    },
    calcRoute: function (directionsService, directionsDisplay) {
        var batches = [];
        var itemsPerBatch = 10; // google API max = 10 - 1 start, 1 stop, and 8 waypoints
        var itemsCounter = 0;
        var wayptsExist = stops.length > 0;

        while (wayptsExist) {
            var subBatch = [];
            var subitemsCounter = 0;

            for (var j = itemsCounter; j < stops.length; j++) {
                subitemsCounter++;
                subBatch.push({
                    location: new window.google.maps.LatLng(stops[j].Geometry.Latitude, stops[j].Geometry.Longitude),
                    stopover: true
                });
                if (subitemsCounter == itemsPerBatch)
                    break;
            }

            itemsCounter += subitemsCounter;
            batches.push(subBatch);
            wayptsExist = itemsCounter < stops.length;
            // If it runs again there are still points. Minus 1 before continuing to
            // start up with end of previous tour leg
            itemsCounter--;
        }

        // now we should have a 2 dimensional array with a list of a list of waypoints
        var combinedResults;
        var unsortedResults = [{}]; // to hold the counter and the results themselves as they come back, to later sort
        var directionsResultsReturned = 0;

        for (var k = 0; k < batches.length; k++) {
            var lastIndex = batches[k].length - 1;
            var start = batches[k][0].location;
            var end = batches[k][lastIndex].location;

            // trim first and last entry from array
            var waypts = [];
            waypts = batches[k];
            waypts.splice(0, 1);
            waypts.splice(waypts.length - 1, 1);

            var request = {
                origin: start,
                destination: end,
                waypoints: waypts,
                optimizeWaypoints: true,
                travelMode: window.google.maps.TravelMode.WALKING
            };
            (function (kk) {
                directionsService.route(request, function (result, status) {
                    if (status == window.google.maps.DirectionsStatus.OK) {

                        var unsortedResult = { order: kk, result: result };
                        unsortedResults.push(unsortedResult);

                        directionsResultsReturned++;

                        if (directionsResultsReturned == batches.length) // we've received all the results. put to map
                        {
                            // sort the returned values into their correct order
                            unsortedResults.sort(function (a, b) { return parseFloat(a.order) - parseFloat(b.order); });
                            var count = 0;
                            for (var key in unsortedResults) {
                                if (unsortedResults[key].result != null) {
                                    if (unsortedResults.hasOwnProperty(key)) {
                                        if (count == 0) // first results. new up the combinedResults object
                                            combinedResults = unsortedResults[key].result;
                                        else {
                                            // only building up legs, overview_path, and bounds in my consolidated object. This is not a complete
                                            // directionResults object, but enough to draw a path on the map, which is all I need
                                            combinedResults.routes[0].legs = combinedResults.routes[0].legs.concat(unsortedResults[key].result.routes[0].legs);
                                            combinedResults.routes[0].overview_path = combinedResults.routes[0].overview_path.concat(unsortedResults[key].result.routes[0].overview_path);

                                            combinedResults.routes[0].bounds = combinedResults.routes[0].bounds.extend(unsortedResults[key].result.routes[0].bounds.getNorthEast());
                                            combinedResults.routes[0].bounds = combinedResults.routes[0].bounds.extend(unsortedResults[key].result.routes[0].bounds.getSouthWest());
                                        }
                                        count++;
                                    }
                                }
                            }
                            directionsDisplay.setDirections(combinedResults);
                            var legs = combinedResults.routes[0].legs;
                            // alert(legs.length);
                            for (var i=0; i < legs.length;i++){
              var markerletter = "A".charCodeAt(0);
              markerletter += i;
                              markerletter = String.fromCharCode(markerletter);
                              createMarker(directionsDisplay.getMap(),legs[i].start_location,"marker"+i,"some text for marker "+i+"<br>"+legs[i].start_address,markerletter);
                            }
                            var i=legs.length;
                            var markerletter = "A".charCodeAt(0);
                markerletter += i;
                            markerletter = String.fromCharCode(markerletter);
                            createMarker(directionsDisplay.getMap(),legs[legs.length-1].end_location,"marker"+i,"some text for the "+i+"marker<br>"+legs[legs.length-1].end_address,markerletter);
                        }
                    }
                });
            })(k);
        }
    }
};

}

1 个答案:

答案 0 :(得分:0)

Snap to road是通过使用PHP加载坐标来完成的 使用谷歌api。代码如下(少于200分):

{{1}}