Javascript Google多地址反向地理编码:在循环中实现回调函数的问题
我想从纬度和经度坐标中获取邮政编码,它们存储在一个名为Test.xlsx的excel表格中 看起来是这样的:Javascript Google多地址反向地理编码:在循环中实现回调函数的问题,javascript,excel,google-maps,for-loop,google-geocoder,Javascript,Excel,Google Maps,For Loop,Google Geocoder,我想从纬度和经度坐标中获取邮政编码,它们存储在一个名为Test.xlsx的excel表格中 看起来是这样的: Column 1 Column 2 Column 3 Row 1 Latitude Longitude Result Row 2 40.730885 -73.997383 New York City, New York 10012, USA Ro
Column 1 Column 2 Column 3
Row 1 Latitude Longitude Result
Row 2 40.730885 -73.997383 New York City, New York 10012, USA
Row 3 ... ... ...
由于我添加了一个循环来迭代excel工作表中的行,所以由于异步Google Geocoder,我遇到了一些问题。
我想我需要一个callback函数,但不知道如何将其集成到现有代码中。
我已经对stackoverflow做了一些研究,最好的结果可能非常有用:
这是我的密码:
<html>
<head>
<link href="https://google-developers.appspot.com/maps/documentation/javascript/examples/default.css" rel="stylesheet">
<script src="https://maps.googleapis.com/maps/api/js?sensor=true"></script>
<script>
var geocoder;
var map;
var infowindow = new google.maps.InfoWindow();
function initialize() {
geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(40.730885,-73.997383);
var mapOptions = {
zoom: 8,
center: latlng,
mapTypeId: 'roadmap'
}
map = new google.maps.Map(document.getElementById('map_canvas'),mapOptions);
}
function codeLatLng(){
var input = document.getElementById('latlng').value;
var latlngStr = input.split(',',2);
var excel = new ActiveXObject("Excel.Application");
var excel_sheet = new ActiveXObject("Excel.Sheet");
var excel_file = excel.Workbooks.Open("d:\\Test.xlsx");
excel_sheet = excel.Worksheets("Tabelle1");
var i = 2;
for(var i=2;i<=10;i++){
var lat = excel_sheet.Range("A"+i);
var lng = excel_sheet.Range("B"+i);
var latlng = new google.maps.LatLng(lat,lng);
geocoder.geocode({'latLng':latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[1]){
excel_sheet.Range("C"+i) = results[1].formatted_address;
excel_sheet.Application.Visible = true;
excel_sheet.SaveAs("d:\\Test.xlsx");
excel_sheet.Application.Quit();
} else {
excel_sheet.Range("C"+i)="No results found";
}
}else {
alert('Geocoder failed due to: ' + status);
}
});
}
}
</script>
</head>
<body onload="initialize()">
<div>
<input id="latlng" type="textbox" value = "40.730885,-73.997383">
</div>
<div>
<input type="button" value="Reverse Geocode" onclick="codeLatLng()">
</div>
<div id="map_canvas" style="height: 90%; top:60px, border: 1px solid black;"></div>
</body>
</html>
代码中有一个回调函数。您需要的是反向地理编码操作上的函数闭包,以将响应与请求关联起来
var geocoder = new google.maps.Geocoder();
var map;
function initialize() {
var latlng = new google.maps.LatLng(40.730885,-73.997383);
var mapOptions = {
zoom: 8,
center: latlng,
mapTypeId: 'roadmap'
}
map = new google.maps.Map(document.getElementById('map_canvas'),mapOptions);
}
function codeLatLng(latlng, excel_sheet, i){
geocoder.geocode({'latLng':latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results && (results.length > 0 )){
// return the result with the type = "postal_code" (won't always be results[1]
for (var j=0; j<results.length; j++) {
for (var k=0; k<results[j].types.length; k++) {
if (results[j].types[k] == "postal_code") {
excel_sheet.Range("C"+i) = results[j].formatted_address;
excel_sheet.Application.Visible = true;
excel_sheet.SaveAs("");
excel_sheet.Application.Quit();
}
}
}
} else {
excel_sheet.Range("C"+i)="No results found";
}
}else {
alert('Geocoder failed due to: ' + status);
}
});
}
function codeLatLngs(){
var input = document.getElementById('latlng').value;
var latlngStr = input.split(',',2);
var excel = new ActiveXObject("Excel.Application");
var excel_sheet = new ActiveXObject("Excel.Sheet");
var excel_file = excel.Workbooks.Open("");
excel_sheet = excel.Worksheets("Tabelle1");
var i = 2;
for(var i=2;i<=10;i++){
var lat = excel_sheet.Range("A"+i);
var lng = excel_sheet.Range("B"+i);
var latlng = new google.maps.LatLng(lat,lng);
codeLatLng(latlng, excel_sheet, i);
}
}