Javascript Google Places未使用RouteBox返回完整结果
EDIT:我似乎达到了查询限制,但没有返回完整的200个结果。因此,在进一步研究之后,谷歌API似乎会让我查询10个框,返回这些结果,然后在剩下的框中给我一个超查询限制状态。因此,我想我现在有两个选择:放慢我的查询速度,或者扩大我的距离,在路线上创建更少的框。 我目前正在开发一个小的web应用程序,它提供了一条路线沿线的详细信息(比如加油站和公路旅行中的咖啡)。我正在使用GoogleMapsAPI与Places库和我使用RouteBox生成所有适当的方框,但当方框传递到位置库时,我只返回部分位置。通常我会得到路线的前半部分(较短路线)或一些随机块(较长路线)。旧金山到西雅图返回我在西雅图和梅德福周围的加油站。 起初我以为我的成绩上限可能是200,但它对每个框都提出了单独的要求,我的总成绩通常不会达到200。从我所看到的结果来看,返回的结果大体上是一致的。当查看我的网络请求和响应的详细信息时,脚本似乎正在通过Places库发出请求的框中移动,并且突然在中途停止 您可以查看结果和方框的live应用程序已打开 我的JavaScript并不是最强的。这就是我想使用这个API的部分原因,所以如果我犯了一个小错误,请原谅我的无知。全文如下。任何方向都是非常感谢的Javascript Google Places未使用RouteBox返回完整结果,javascript,google-maps,google-places-api,routeboxer,Javascript,Google Maps,Google Places Api,Routeboxer,EDIT:我似乎达到了查询限制,但没有返回完整的200个结果。因此,在进一步研究之后,谷歌API似乎会让我查询10个框,返回这些结果,然后在剩下的框中给我一个超查询限制状态。因此,我想我现在有两个选择:放慢我的查询速度,或者扩大我的距离,在路线上创建更少的框。 我目前正在开发一个小的web应用程序,它提供了一条路线沿线的详细信息(比如加油站和公路旅行中的咖啡)。我正在使用GoogleMapsAPI与Places库和我使用RouteBox生成所有适当的方框,但当方框传递到位置库时,我只返回部分位置
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);
var infowindow=new google.maps.infowindow();
var映射;
var路由交换机;
var服务;
函数初始化(){
directionsDisplay=new google.maps.DirectionsRenderer();
变量映射选项={
缩放:4,
中心:新google.maps.LatLng(39,-98),
mapTypeId:google.maps.mapTypeId.ROADMAP,
};
map=new google.maps.map(document.getElementById('map-canvas'),mapOptions);
服务=新的google.maps.places.PlacesService(地图);
routeBoxer=新的routeBoxer();
directionService=new google.maps.directionService();
directionsRenderer=new google.maps.directionsRenderer({map:map})
方向显示.setMap(地图);
directions display.setPanel(document.getElementById('directions-panel');
}
函数calcRoute(){
var start=document.getElementById('start').value;
var end=document.getElementById('end').value;
var waypt1=document.getElementById('waypoint1')。值;
var waypt2=document.getElementById('waypoint2')。值;
var waypts=[]
如果(路径PT1){
推({
地点:1号路,
中途停留:真});
}
如果(路径PT2){
推({
地点:2号路,
中途停留:真});
}
var请求={
来源:start,
目的地:完,
航路点:航路点,
航路点:对,
travelMode:google.maps.travelMode.DRIVING
};
路由(请求、功能(响应、状态){
if(status==google.maps.directionstatus.OK){
方向显示。设置方向(响应);
//围绕路线建造箱子
var path=response.routes[0]。概述\u路径;
var boxes=RouteBox.box(路径,2);//距离路线的距离(以公里为单位)
抽屉(盒);;
对于(变量i=0;i0){
雷达搜索(请求、回调);
}
}
函数findPlacesByText(边界){
var selectedTypes='';
var inputElements=document.getElementsByClassName('textOption');
对于(变量i=0;输入元素[i];i++){
if(inputElements[i]。选中){
selectedTypes+=inputElements[i]。值+','
}
}
var请求={
界限:界限,,
查询:所选类型
};
如果(selectedTypes.length>0){
文本搜索(请求、回调);
}
}
函数回调(结果、状态){
if(status==google.maps.places.PlacesServiceStatus.OK){
对于(var i=0;i '+place.formatted_phone_number;
如果(!!place.website)contentStr+='
';
contentStr+='
'+place.types+'';
infowindow.setContent(contentStr);
信息窗口。打开(地图、标记);
}否则{
var contentStr=“无结果,状态=“+status+”;
infowindow.setContent(contentStr);
信息窗口。打开(地图、标记);
}
});
});
}
google.maps.event.addDomListener(窗口“加载”,初始化);
经过大量实验和进一步研究,我决定尝试减缓我的查询速度。我处理这个问题的方法是编写一个新函数来调用我的查询函数,然后递归地调用自己,并为下一个路由框设置延迟。如果返回了超过查询限制
状态,它将使用
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);
}
}