You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

已获取当前经纬度,如何传入Google Places API?(附问题代码)

问题分析与解决方案

我来帮你梳理下问题根源,主要是两个核心问题:变量作用域限制异步执行顺序冲突,咱们一步步修复:

问题1:变量作用域问题

你在success函数里用var声明的lat1lng1局部变量,只能在success函数内部访问,外面的initMap函数根本拿不到这两个值,自然没法传给Google Places API。

问题2:异步执行顺序问题

Google Maps脚本加载完成后会立刻调用initMap,但地理定位是异步操作(需要等待浏览器获取位置),大概率initMap执行时,success还没拿到坐标,导致pyrmont对象里的latlng都是undefined


修复后的完整代码

<!DOCTYPE html> 
<html> 
<head> 
    <title>Place searches</title> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
    <meta charset="utf-8"> 
    <style> 
        #map { height: 100%; } 
        html, body { height: 100%; margin: 0; padding: 0; } 
    </style> 
    <script type="text/javascript">
        // 1. 把坐标变量声明在全局作用域,让所有函数都能访问
        var lat1, lng1;

        function initGeolocation() {
            if( navigator.geolocation ) {
                navigator.geolocation.getCurrentPosition( success, fail );
            } else {
                alert("Sorry, your browser does not support geolocation services.");
            }
        }

        function success(position) {
            lng1 = position.coords.longitude;
            lat1 = position.coords.latitude;
            // 2. 拿到坐标后再手动初始化地图,确保顺序正确
            initMap();
        }

        function fail() {
            alert("无法获取当前位置,无法加载附近商铺");
        }

        var map;
        var infowindow;

        function initMap() {
            var pyrmont = {lat: lat1, lng: lng1};
            map = new google.maps.Map(document.getElementById('map'), {
                center: pyrmont,
                zoom: 15
            });
            infowindow = new google.maps.InfoWindow();
            var service = new google.maps.places.PlacesService(map);
            service.nearbySearch({
                location: pyrmont,
                radius: 500,
                type: ['store']
            }, callback);
        }

        function callback(results, status) {
            if (status === google.maps.places.PlacesServiceStatus.OK) {
                for (var i = 0; i < results.length; i++) {
                    createMarker(results[i]);
                }
            } else {
                // 可选:添加状态错误提示
                alert("获取附近商铺失败:" + status);
            }
        }

        function createMarker(place) {
            var placeLoc = place.geometry.location;
            var marker = new google.maps.Marker({
                map: map,
                position: place.geometry.location
            });
            google.maps.event.addListener(marker, 'click', function() {
                infowindow.setContent(place.name);
                infowindow.open(map, this);
            });
        }
    </script> 
</head> 
<body onLoad="initGeolocation();"> 
    <div id="map"></div>
    <!-- 3. 去掉script标签里的callback=initMap,避免自动触发 -->
    <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDFvTqvbyut42xc-nF2kToD0Mzwh-_nVvw&libraries=places" async defer></script> 
</body> 
</html>

关键修改点说明

  • lat1lng1提升到全局作用域,解决变量访问限制
  • 移除Google Maps脚本的callback=initMap参数,改为在success函数中手动调用initMap,确保只有拿到坐标后才初始化地图
  • fail函数和callback的错误状态添加了提示,方便排查问题

这样修改后,就能正常把当前位置的坐标传入Google Places API,加载附近的商铺标记了。

内容的提问来源于stack exchange,提问作者Suhel shaikh

火山引擎 最新活动