javascript - JavaScript 变量和谷歌地图距离服务
问题描述
我使用 Google Maps Distance Service API 来获取两点之间的行驶距离和时间。这是我的代码:
<div id="right-panel">
<div id="output"></div>
</div>
<div id="map"></div>
<script>
function initMap() {
var bounds = new google.maps.LatLngBounds;
var markersArray = [];
var origin1 = "<?php echo $partenza; ?>";
var destinationA = "<?php echo $destinazione; ?>";
var destinationIcon = 'https://chart.googleapis.com/chart?' +
'chst=d_map_pin_letter&chld=D|FF0000|000000';
var originIcon = 'https://chart.googleapis.com/chart?' +
'chst=d_map_pin_letter&chld=O|FFFF00|000000';
var map = new google.maps.Map(document.getElementById('map'), {
center: {lat: 55.53, lng: 9.4},
zoom: 10
});
var geocoder = new google.maps.Geocoder;
var service = new google.maps.DistanceMatrixService;
distanza = 0;
service.getDistanceMatrix({
origins: [origin1],
destinations: [destinationA],
travelMode: 'DRIVING',
unitSystem: google.maps.UnitSystem.METRIC,
avoidHighways: false,
avoidTolls: false
}, function(response, status) {
if (status !== 'OK') {
alert('Error was: ' + status);
} else {
var originList = response.originAddresses;
var destinationList = response.destinationAddresses;
var outputDiv = document.getElementById('output');
outputDiv.innerHTML = '';
deleteMarkers(markersArray);
var showGeocodedAddressOnMap = function(asDestination) {
var icon = asDestination ? destinationIcon : originIcon;
return function(results, status) {
if (status === 'OK') {
map.fitBounds(bounds.extend(results[0].geometry.location));
markersArray.push(new google.maps.Marker({
map: map,
position: results[0].geometry.location,
icon: icon
}));
} else {
alert('Geocode was not successful due to: ' + status);
}
};
};
results = response.rows[0].elements;
geocoder.geocode({'address': originList[0]},
showGeocodedAddressOnMap(false));
geocoder.geocode({'address': destinationList[0]},
showGeocodedAddressOnMap(true));
outputDiv.innerHTML += results[0].distance.text + ' in ' +
results[0].duration.text + '<br>';
distanza = results[0].distance.value;
durata = results[0].duration.value;
document.innerHTML = distanza + "<br>" + durata;
}
});
}
function deleteMarkers(markersArray) {
for (var i = 0; i < markersArray.length; i++) {
markersArray[i].setMap(null);
}
markersArray = [];
}
console.log("Distanza: "+distanza);
console.log("Durata: "+durata);
</script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=MY_API_HERE&callback=initMap">
</script>
我想用“console.log”获取点之间的距离和时间,但是当我输入 console.log("Distanza: "+distanza); javascript控制台说:“未定义距离”......我如何在函数之外访问这两个变量?
解决方案
您发布的代码中有多个问题,我只需快速浏览一下就可以看到(了解:我没有测试它)。
正确声明你的变量。就像var distanza = 0;
那将是第一个建议。
此外,如果您在函数中声明变量,则只能在该函数中使用它。这称为变量范围。如果您需要一个变量在其他地方可用,请在全局范围内(在任何函数之外)声明它。
然后你应该console.log
在你的showGeocodedAddressOnMap
里面做你用于地理编码器的回调函数。地理编码器是异步的,所以在你做你的console.log
时候,地理编码器很可能还没有返回任何东西。
以下是您的代码的未经测试的更正版本。
var durata, distanza;
function initMap() {
var bounds = new google.maps.LatLngBounds;
var markersArray = [];
var origin1 = "<?php echo $partenza; ?>";
var destinationA = "<?php echo $destinazione; ?>";
var destinationIcon = 'https://chart.googleapis.com/chart?' +
'chst=d_map_pin_letter&chld=D|FF0000|000000';
var originIcon = 'https://chart.googleapis.com/chart?' +
'chst=d_map_pin_letter&chld=O|FFFF00|000000';
var map = new google.maps.Map(document.getElementById('map'), {
center: {
lat: 55.53,
lng: 9.4
},
zoom: 10
});
var geocoder = new google.maps.Geocoder;
var service = new google.maps.DistanceMatrixService;
distanza = 0;
service.getDistanceMatrix({
origins: [origin1],
destinations: [destinationA],
travelMode: 'DRIVING',
unitSystem: google.maps.UnitSystem.METRIC,
avoidHighways: false,
avoidTolls: false
}, function(response, status) {
if (status !== 'OK') {
alert('Error was: ' + status);
} else {
var originList = response.originAddresses;
var destinationList = response.destinationAddresses;
var outputDiv = document.getElementById('output');
outputDiv.innerHTML = '';
deleteMarkers(markersArray);
var showGeocodedAddressOnMap = function(asDestination) {
var icon = asDestination ? destinationIcon : originIcon;
return function(results, status) {
if (status === 'OK') {
map.fitBounds(bounds.extend(results[0].geometry.location));
markersArray.push(new google.maps.Marker({
map: map,
position: results[0].geometry.location,
icon: icon
}));
distanza = results[0].distance.value;
durata = results[0].duration.value;
console.log("Distanza: " + distanza);
console.log("Durata: " + durata);
} else {
alert('Geocode was not successful due to: ' + status);
}
};
};
results = response.rows[0].elements;
geocoder.geocode({
'address': originList[0]
},
showGeocodedAddressOnMap(false));
geocoder.geocode({
'address': destinationList[0]
},
showGeocodedAddressOnMap(true));
outputDiv.innerHTML += results[0].distance.text + ' in ' +
results[0].duration.text + '<br>';
distanza = results[0].distance.value;
durata = results[0].duration.value;
document.innerHTML = distanza + "<br>" + durata;
}
});
}
function deleteMarkers(markersArray) {
for (var i = 0; i < markersArray.length; i++) {
markersArray[i].setMap(null);
}
markersArray = [];
}
推荐阅读
- axapta - 如何查看 xLanguage 标准类下的代码?
- c# - ColumnSeries 中每个值的不同颜色
- javascript - 如何让我的按钮导航到不同的页面?
- kotlin - LocalDateTime 格式为 yyyy-MM-dd'T'HH:mm:ss.SSSSSS?
- python - 在python中一一比较列表的元素
- r - 使用 styleinterval 修改百分比的背景颜色
- javascript - ReferenceError:未定义服务器
- apache-spark - Spark 将活动阶段设置为 1
- javascript - 我们可以在 js 中包含来自 .yml 的变量值以用于 if else 条件吗?
- java - 如何在我的项目中消除AlertDialog的问题