Google Maps API地理编码 - 返回GPS协调

时间:2018-03-22 10:54:40

标签: google-maps geocode

我有这段代码:

var get_lat = function(address) {
    geocoder.geocode( { 'address': address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            console.log('lat is: '+ results[0].geometry.location.lat());
            return results[0].geometry.location.lat();
        }
    });
}

var get_lng = function(address) {
    geocoder.geocode( { 'address': address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            console.log('lng is: '+ results[0].geometry.location.lng());
            return results[0].geometry.location.lng();
        }
    });
}

在控制台中打印我需要的坐标,但返回值始终未定义:

我在Google地图的经典初始化中使用它,如下所示:

function createMarker(latlng) {
    var marker = new google.maps.Marker({
        position: latlng,
        map: map,
    });
}

function initialize() {
    var myOptions = {
        zoom: 8,
        center: new google.maps.LatLng(49.210366,15.989588)
    }

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    var address = "Correct address that console.logs the correct GPS coordinations in function definitions above";
    var gps_lat = get_lat(address);
    var gps_lng = get_lng(address);
    console.log('GPS lat: ' + gps_lat); // logs "undefined"
    console.log('GPS lng: ' + gps_lng); // logs "undefined"

    var marker = createMarker({lat: gps_lat}, lng: gps_lng});
}


$(window).on("load", function (e) {  
    initialize();
});

你知道为什么这个函数控制了正确的值但是它没有返回任何东西吗?

对于GMAP API,我使用以下脚本:http://maps.google.com/maps/api/js?sensor=false&libraries=geometry

2 个答案:

答案 0 :(得分:1)

您在匿名函数中有return,您传递给geocoder.geocode,所有这些函数都在另一个函数中get_lat / get_lng)。 get_lat / get_lng本身没有return语句,因此会返回undefined

此外,geocoder.geocode将异步调用您的匿名函数。这意味着get_lat / get_lng无法获得returnreturn get_lat / get_lng调用。

一个解决方案(最简单的解决方案)是将createMarker代码放入geocoder.geocode的回调中。此外,在这种情况下,您必须合并两个get_lat / get_lng函数。例如:

geocoder.geocode( { 'address': address}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
        var gps_lat = results[0].geometry.location.lat()
        var gps_lng = results[0].geometry.location.lng();
        console.log('lat is ' + gps_lat + '. lng is ' + gps_lng);
        var marker = createMarker({lat: gps_lat, lng: gps_lng});
        return results[0].geometry.location.lat();
    }
});

答案 1 :(得分:0)

您必须等到Google API提供回复。因此,编写一个逻辑来在Google API的回调函数中创建标记,如下所示。

var getLatLng = function (address)
    {
        geocoder.geocode({ 'address': address }, function (results, status)
        {                
            if (status == google.maps.GeocoderStatus.OK)
            {
                var location = results[0].geometry.location;

                // Create marker once you get response from Google
                createMarker({ lat: location.lat(), lng: location.lng() });
            }
        });
    }

并调用该函数,如下所示

function initialize()
    {
        var myOptions =
        {
            zoom: 8,
            center: new google.maps.LatLng(49.210366, 15.989588)
        }

        map = new google.maps.Map(document.getElementById("map"), myOptions);
        var address = "Correct address that console.logs the correct GPS coordinations in function definitions above";            

        // Old code ------------------------------------------------
        //var gps_lat = get_lat(address);
        //var gps_lng = get_lng(address);

        //console.log('GPS lat: ' + gps_lat); // logs "undefined"
        //console.log('GPS lng: ' + gps_lng); // logs "undefined"

        //var marker = createMarker({ lat: gps_lat, lng: gps_lng });
        // ----------------------------------------------------------

        // New code
        getLatLng(address);
    }

你将在地图上得到标记