2015-06-24 62 views
1

編輯:看來我正在查詢限制,但我沒有被返回完整的200結果。因此,經過進一步的研究,看起來Google API會讓我查詢10個盒子,返回這些結果,然後用剩餘的OVER_QUERY_LIMIT狀態打我。所以我想我現在有兩個選擇:減慢我的查詢,或者擴大我的距離,在路線上創建更少的盒子。谷歌的地方不會返回完整的結果與RouteBoxer

我目前正在建造一個小型的網絡應用程序,提供沿路線地點的細節(如加油站和咖啡的客場之旅)。我正在將Google Maps API與Places庫一起使用,並使用RouteBoxer我使用RouteBoxer生成所有相應的框,但是當框傳遞到Places庫時,我只能找回一些地方。通常我會得到路線的前半部分(較短路線)或幾個隨機區塊(較長路線)。從舊金山到西雅圖,我只能返回西雅圖和梅德福附近的加油站。

最初我以爲也許我是在達到200的結果上限,但是它爲每個盒子提出了一個單獨的請求,而且我的總結果通常不會達到200.返回的結果通常與我所能看到的一致。在查看我的網絡請求和響應的詳細信息時,似乎腳本正在通過位置庫的請求框移動,並突然停止。

您可以在其中查看結果和框的實時應用程序位於Heroku

我的JavaScript不是最強的。這就是爲什麼我想要使用這個API的一部分,所以如果我犯了一個微不足道的錯誤,請原諒我的無知。完整的腳本如下。任何方向都非常感謝!

var infowindow = new google.maps.InfoWindow(); 
var map; 
var routeBoxer; 
var service; 

function initialize() { 
    directionsDisplay = new google.maps.DirectionsRenderer(); 
    var mapOptions = { 
    zoom: 4, 
    center: new google.maps.LatLng(39, -98), 
    mapTypeId: google.maps.MapTypeId.ROADMAP, 
    }; 
    map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); 
    service = new google.maps.places.PlacesService(map); 

    routeBoxer = new RouteBoxer(); 

    directionService = new google.maps.DirectionsService(); 
    directionsRenderer = new google.maps.DirectionsRenderer({ map: map }) 

    directionsDisplay.setMap(map); 
    directionsDisplay.setPanel(document.getElementById('directions-panel')); 
} 

function calcRoute() { 
    var start = document.getElementById('start').value; 
    var end = document.getElementById('end').value; 
    var waypt1 = document.getElementById('waypoint1').value; 
    var waypt2 = document.getElementById('waypoint2').value; 
    var waypts = [] 

    if (waypt1) { 
    waypts.push({ 
     location:waypt1, 
     stopover:true}); 
    } 
    if (waypt2) { 
    waypts.push({ 
     location:waypt2, 
     stopover:true}); 
    } 

    var request = { 
    origin: start, 
    destination: end, 
    waypoints: waypts, 
    optimizeWaypoints: true, 
    travelMode: google.maps.TravelMode.DRIVING 
    }; 

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

     // Build boxes around route 
     var path = response.routes[0].overview_path; 
     var boxes = routeBoxer.box(path, 2); // distance in km from route 
     drawBoxes(boxes); 
     for (var i=0; i < boxes.length; i++) { 
     var bounds = boxes[i]; 
     findPlaces(bounds); 
     findPlacesByText(bounds); 
     } 
    } else { 
     alert("Directions query failed: " + status); 
    } 
    }); 
} 

function findPlaces(bounds) { 
    var selectedTypes = []; 

    var inputElements = document.getElementsByClassName('placeOption'); 

    for (var i=0; inputElements[i]; i++) { 
    if (inputElements[i].checked) { 
    selectedTypes.push(inputElements[i].value) 
    } 
    } 

    var request = { 
    bounds: bounds, 
    types: selectedTypes 
    }; 

    if (selectedTypes.length > 0) { 
    service.radarSearch(request, callback); 
    } 
} 

function findPlacesByText(bounds) { 
    var selectedTypes = ''; 

    var inputElements = document.getElementsByClassName('textOption'); 

    for (var i=0; inputElements[i]; i++) { 
    if (inputElements[i].checked) { 
    selectedTypes += inputElements[i].value + ', ' 
    } 
    } 

    var request = { 
    bounds: bounds, 
    query: selectedTypes 
    }; 

    if (selectedTypes.length > 0) { 
    service.textSearch(request, callback); 
    } 
} 

function callback(results, status) { 
    if (status == google.maps.places.PlacesServiceStatus.OK) { 
    for (var i = 0; i < results.length; i++) { 
     createMarker(results[i]); 
    } 
    } 
} 

function createMarker(place) { 
    var marker = new google.maps.Marker({ 
    map: map, 
    position: place.geometry.location 
    }); 

    var request = { 
    reference: place.reference 
    }; 

    google.maps.event.addListener(marker,'click',function(){ 
    service.getDetails(request, function(place, status) { 
     if (status == google.maps.places.PlacesServiceStatus.OK) { 
     var contentStr = '<h5>' + place.name + '</h5><p>' + place.formatted_address; 
     if (!!place.formatted_phone_number) contentStr += '<br />' + place.formatted_phone_number; 
     if (!!place.website) contentStr += '<br /><a target="_blank" href="' + place.website + '">' + place.website + '</a>'; 
     contentStr += '<br />' + place.types + '</p>'; 
     infowindow.setContent(contentStr); 
     infowindow.open(map,marker); 
     } else { 
     var contentStr = "<h5>No Result, status=" + status + "</h5>"; 
     infowindow.setContent(contentStr); 
     infowindow.open(map,marker); 
     } 
    }); 
    }); 
} 

google.maps.event.addDomListener(window, 'load', initialize); 

回答

0

經過大量的實驗和進一步的研究,我決定嘗試減緩我的查詢。我處理的方式是編寫一個調用我的查詢函數的新函數,然後以下一個路徑框的延遲遞歸調用自身。如果返回OVER_QUERY_LIMIT狀態,則會延遲增加該框。到目前爲止,它似乎工作得很好,但它很快將延遲時間延長到接近兩秒鐘(或更多)的通話時間,如果您有很長的通話時間,那麼可能需要一段時間。我的新功能似乎解決了這個問題。它需要更多的微調才能真正做到,但它很接近!

var delay = 100; 

... 

function queryPlaces(boxes, searchIndex) { 
    // delay calls to Places API to prevent going over query limit (10/sec) 
    var bounds = boxes[searchIndex]; 
    findPlaces(bounds); 
    findPlacesByText(bounds); 
    if (searchIndex > 0) { 
    searchIndex--; 
    setTimeout(queryPlaces, delay, boxes, searchIndex); 
    } 
} 
相關問題