Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google多地址反向地理编码:在循环中实现回调函数的问题_Javascript_Excel_Google Maps_For Loop_Google Geocoder - Fatal编程技术网

Javascript Google多地址反向地理编码:在循环中实现回调函数的问题

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

我想从纬度和经度坐标中获取邮政编码,它们存储在一个名为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
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);
    }
}