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

React中Google Map组件无法正确居中问题求助

解决Google Map React 地图居中/定位异常问题

我看了你的代码,问题的核心是你把对象格式的坐标当成数组来访问了,导致传递给Google Maps的坐标完全无效,所以地图才会默认定位到海洋区域。下面是具体的错误分析和修复方案:

错误点拆解

你的latLgn状态里每个元素都是包含lat和lng属性的对象:

{ lng: 24.7536, lat: 59.437 }

但你在两处关键代码里都用了数组下标访问(item[1]、pin[1]),这会拿到undefined,Google Maps接收到无效坐标后就会跳转到默认的海洋区域。

修复步骤

1. 修正标记点的坐标绑定

在渲染地图标记时,把数组下标访问改成对象属性访问:

// 错误写法
<div lat={item[1]} lng={item[0]} key={index}></div>

// 正确写法
<div lat={item.lat} lng={item.lng} key={index}></div>

2. 修正getMapBounds函数的坐标处理

计算地图边界时,同样要使用对象的lat和lng属性:

// 错误写法
bounds.extend(new maps.LatLng(pin[1], pin[0]));

// 正确写法
bounds.extend(new maps.LatLng(pin.lat, pin.lng));

3. 可选优化:简化参数传递

我还帮你简化了apiIsLoaded的参数传递,直接在函数内部访问latLgn状态即可,不用额外传参,让代码更简洁。

修复后的完整代码

import React, { useState } from "react";
import GoogleMapReact from "google-map-react";

export default function GMap() {
  const [latLgn, setLatLgn] = useState([
    { lng: 24.7536, lat: 59.437 },
    { lng: 24.7303, lat: 59.4393 },
    { lng: 24.7387, lat: 59.4497 },
  ]);
  const [tallinn] = useState({
    center: { 
      // 期望的地图中心位置
      lng: 24.7536,
      lat: 59.437,
    },
    zoom: 10,
  });

  // API加载完成后适配地图边界
  const apiIsLoaded = (map, maps) => {
    // 根据标记点获取边界
    const bounds = getMapBounds(maps, latLgn);
    // 适配地图到边界范围
    map.fitBounds(bounds);
    // 绑定窗口大小调整监听
    bindResizeListener(map, maps, bounds);
  };

  // 窗口大小调整时重新居中地图
  const bindResizeListener = (map, maps, bounds) => {
    maps.event.addDomListenerOnce(map, "idle", () => {
      maps.event.addDomListener(window, "resize", () => {
        map.fitBounds(bounds);
      });
    });
  };

  // 根据标记点列表返回地图边界
  const getMapBounds = (maps, pins) => {
    const bounds = new maps.LatLngBounds();
    pins.forEach((pin) => {
      bounds.extend(new maps.LatLng(pin.lat, pin.lng));
    });
    return bounds;
  };

  return (
    <div>
      <div style={{ height: "100vh", width: "100%" }}>
        <GoogleMapReact
          bootstrapURLKeys={{key: "AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"}}
          defaultCenter={tallinn.center}
          defaultZoom={tallinn.zoom}
          onGoogleApiLoaded={({ map, maps }) => apiIsLoaded(map, maps)}
          yesIWantToUseGoogleMapApiInternals
        >
          {latLgn.map((item, index) => (
            <div 
              lat={item.lat} 
              lng={item.lng} 
              key={index}
              style={{width: 12, height: 12, backgroundColor: 'red', borderRadius: '50%'}}
            ></div>
          ))}
        </GoogleMapReact>
      </div>
    </div>
  );
}

额外调试提示

我给标记点加了红色圆点样式,这样你能直观看到标记是否正确出现在地图上;如果还是有问题,可以在getMapBounds里打印bounds的值,确认边界计算是否符合预期。

内容的提问来源于stack exchange,提问作者Kim-Jun-Un

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:57:51