希望你能帮助我。我使用Angular JS 1在我的网站上出现谷歌地图。(很多代码都是vanilla js)。
在我的地图上,如果您搜索原点和目的地,标记会下降并显示从原点到目的地的Google路线。大! :)
但是,我也编写了代码来使餐馆也出现在这个结果中。但是,由于谷歌配额,餐厅停止出现,经过一定数量的WayPoints(路线/腿/步)。
我只想在搜索结果中显示最多3个航点的餐馆结果(由于配额/ API限制)。
我该怎么做?
这是我的指令代码。
/* global google */
googleMap.$inject = ['Directions'];
function googleMap(Directions) {
console.log('map directive loaded');
return {
restrict: 'E',
template: '<div class="google-map"></div>',
replace: true,
scope: {
center: '=',
zoom: '=',
origin: '=',
destination: '=',
travelMode: '='
},
link($scope, $element) {
const map = new google.maps.Map($element[0], {
zoom: $scope.zoom,
center: $scope.center
});
$scope.$watch('center', () => map.setCenter($scope.center), true);
$scope.$watchGroup(['origin', 'destination', 'travelMode'],
displayRoute, displayRestaurants);
// DISPLAY ROUTE
function displayRoute() {
if (!$scope.origin || !$scope.destination || !$scope.travelMode)
return false;
const directionsDisplay = new google.maps.DirectionsRenderer();
const placesService = new google.maps.places.PlacesService(map);
directionsDisplay.setMap(map);
Directions.route({
origin: $scope.origin,
destination: $scope.destination,
travelMode: $scope.travelMode
}, (response) => {
directionsDisplay.setDirections(response);
response.routes[0].legs[0].steps.map(step => {
placesService.nearbySearch({
location: step.start_point,
radius: 50,
type: ['restaurant']
}, (results) => {
results.map(place => {
return new google.maps.Marker({
map: map,
position: place.geometry.location
});
});
});
});
});
}
// DISPLAY RESTAURANTS
function displayRestaurants() {
console.log('display restaurants function');
}
}
};
}
export default googleMap;
答案 0 :(得分:1)
如果您想在第一个,中间和最后一个航点上进行餐厅搜索(似乎有意义),那么您可以执行以下操作。
替换
directionsDisplay.setDirections(response);
response.routes[0].legs[0].steps.map(step => {
用
directionsDisplay.setDirections(response);
var steps = response.routes[0].legs[0].steps
// Using first, middle and last step - you would probably
// want to just use the waypoints as-is if there are fewer than 3
var lookup = steps.length > 2 ?
[steps[0], steps[Math.round(steps.length / 2)], steps[steps.length - 1]] :
steps
lookup.map(step => {
基本上不是将placesService.nearbySearch映射到每一步 - 只需将其映射到新数组中的第一步,中间步和最后一步。
修改
解释这里发生的事情。
var steps = response.routes[0].legs[0].steps
var lookup = [steps[0], steps[Math.round(steps.length / 2)], steps[steps.length - 1]]
steps
是一个数组 - 这意味着您可以通过索引参数访问其元素。
steps[0]
只是数组中的第一个元素(第一个方向点)。
steps[Math.round(steps.length / 2)]
是步骤数组中的中间元素 - 我们通过将步骤总数除以2得到这个 - 然后舍入以确保我们有一个整数而不是一个浮点数(即如果有一个我们赢得的奇数步骤没有我们可以用作索引的数字。
steps[steps.length - 1]
是步骤数组中的最后一个元素,我们只需从步骤总数中取1即可得到它(因为数组是零索引的)。
我们使用这三个值来构造一个新数组lookup
,然后将其映射到查找函数而不是steps
数组。
这是一个通用示例,其中包含一些有用的注释。
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
var b = [a[0], a[Math.round(a.length / 2)], a[a.length - 1]]
// a.length = 9
// a[0] = 1
// a[1] = 2
// ...
// a[5] = 6
// ...
// a[8] = 9
// a.length / 2 = 4.5 - as we can't do a[4.5] we need to round...
// Math.round(a.length / 2) = 5
// a.length - 1 = 8
// so b = [a[0], a[5], a[8]] or...
// [1, 6, 9]