You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何将Geolocation获取的当前位置设置到Google Map

问题原因

  • google-map-react 的defaultCenter、defaultZoom属于初始化属性,仅在组件首次渲染时生效,后续state更新不会触发属性重生效。你给lats、lngs设置的初始值是空字符串,首次渲染时传入了非法的坐标值,直接导致地图初始化失败,等异步拿到用户坐标时已经无法修正初始化的错误。
  • 异步获取的坐标更新后,defaultCenter不会响应新的state值,地图中心也不会同步更新。

解决方案

你可以按照以下步骤修改代码:

  1. 给坐标设置合法的初始值,或者在拿到用户坐标前不渲染地图组件
  2. 将defaultCenter替换为响应式的center属性,实现坐标更新时地图中心同步变动

修正后的代码

const Map = () => {
    // 初始可以设置一个通用默认坐标,或者设为null后续判断渲染逻辑
    const [lats, setLats] = useState(3.66666);
    const [lngs, setLngs] = useState(8.6666);
    const [status, setStatus] = useState(null);

    const getLocation = () => {
        if (!navigator.geolocation) {
          setStatus('你的浏览器不支持地理定位');
        } else {
          setStatus('正在定位...');
          navigator.geolocation.getCurrentPosition((position) => {
            setStatus(null);
            setLats(position.coords.latitude);
            setLngs(position.coords.longitude);
          }, () => {
            setStatus('无法获取你的位置');
          });
        }
      }


    const mapProps = {
        center: {
          lat: lats,
          lng: lngs
        },
        zoom: 11
      };
    return (
        <div style={{ height: '100vh', width: '100%' }}>
             <Button onClick={getLocation} variant="primary">定位我的位置</Button>
             <p>{status}</p>
                {lats && <p>纬度: {lats}</p>}
                {lngs && <p>经度: {lngs}</p>}
            <GoogleMapReact
            bootstrapURLKeys={{ key: "替换为你的谷歌地图开发者密钥" }}
            // 用center代替defaultCenter,支持响应式更新
            center={mapProps.center}
            defaultZoom={mapProps.zoom}
            >
            <LocationMarker
                lat={59.955413}
                lng={30.337844}
                text="我的标记"
            />
            </GoogleMapReact>
      </div>
    )
}

如果你不想显示默认坐标,也可以在lats、lngs有有效值之后再渲染GoogleMapReact组件:

{lats && lngs && <GoogleMapReact
  bootstrapURLKeys={{ key: "替换为你的谷歌地图开发者密钥" }}
  center={{lat: lats, lng: lngs}}
  defaultZoom={11}
>
  {/* 自定义标记组件 */}
</GoogleMapReact>}

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:24:03