使用Google Maps API(React / Javascript)显示多个位置时出现问题

toe95027  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(146)

我试图在谷歌Map上显示一系列位置的多个大头针。下面的代码只适用于一个位置,但是当使用多个位置时,大头针和标签会重叠,Map会显示为灰色。不知道我做错了什么,但欢迎提供指导
Map.jsx

import React from "react";
import GoogleMapReact from "google-map-react";
import LocationPin from "./LocationPin";

const Map = ({ location, zoomLevel }) => (
  <div className="map">
    <div className="w-full h-[60vh]">
      <GoogleMapReact
        bootstrapURLKeys={{ key: process.env.REACT_APP_GOOGLE_MAPS_TOKEN }}
        defaultCenter={location}
        defaultZoom={zoomLevel}
        options={{ disableDefaultUI: false, zoomControl: true }}
      >
        { location.map((location, index) => (
          <LocationPin
            lat={location.lat}
            lng={location.lng}
            text={location.address}
            key={index}
          />

      ))}
      </GoogleMapReact>
    </div>
  </div>
);

export default Map;

Locations.jsx

import React from 'react';
import Map from "../components/Map";

export const Locations = () => {
  const locations = [{
    address: "Sonoma, California, USA",
    lat: 38.208473,
    lng: -122.451803,
  },{
    address: "San Francisco, California, USA",
    lat: 37.773972,
    lng: -122.431297,
  }];

  return (
    <div className="w-full">
      <div className="mt-4">
            <Map location={locations} zoomLevel={15} />
      </div>
    </div>
  );
}

export default Locations;

LocationPin.jsx

import locationIcon from "@iconify/icons-mdi/map-marker";

const LocationPin = ({ text }) => (
  <div className="flex items-center w-[180px] text-[#00009E]">
    <Icon icon={locationIcon} className="text-6xl" />
    <p className="text-sm">{text}</p>
  </div>
);

export default LocationPin;
k0pti3hp

k0pti3hp1#

问题似乎出在GoogleMapReact的defaultCenter属性上。当前,您将一个位置数组作为位置属性传递给Map组件,然后使用与GoogleMapReact的defaultCenter相同的位置属性。这意味着Map以位置数组而不是单个位置为中心。
要解决此问题,可以将单个位置作为defaultCenter属性传递,也可以计算所有位置的中心并将其作为defaultCenter属性传递。以下示例说明如何计算所有位置的中心:

const Map = ({ locations, zoomLevel }) => {
  // Calculate the center of all the locations
  const bounds = new window.google.maps.LatLngBounds();
  locations.forEach((location) => {
    bounds.extend(new window.google.maps.LatLng(location.lat, location.lng));
  });
  const center = bounds.getCenter();

  return (
    <div className="map">
      <div className="w-full h-[60vh]">
        <GoogleMapReact
          bootstrapURLKeys={{ key: process.env.REACT_APP_GOOGLE_MAPS_TOKEN }}
          defaultCenter={center}
          defaultZoom={zoomLevel}
          options={{ disableDefaultUI: false, zoomControl: true }}
        >
          {locations.map((location, index) => (
            <LocationPin
              lat={location.lat}
              lng={location.lng}
              text={location.address}
              key={index}
            />
          ))}
        </GoogleMapReact>
      </div>
    </div>
  );
};

在本例中,我们使用Google Maps API中的LatLngBounds对象来计算所有位置的中心。我们创建一个新的LatLngBounds对象,并使用每个位置扩展它,然后获得边界的中心,并将其用作Map的defaultCenter。
请注意,在计算位置中心之前,您需要确保已加载Google Maps API。为此,您可以向GoogleMapReact添加一个onGoogleApiLoaded属性,并传递一个计算位置中心的回调函数。

相关问题