如何使用 react-google-maps 显示多个标记

Posted

技术标签:

【中文标题】如何使用 react-google-maps 显示多个标记【英文标题】:How do I display multiple markers with react-google-maps 【发布时间】:2017-10-07 04:08:31 【问题描述】:

我正在尝试使用名为 react-google-maps 的 npm 包显示多个标记,但我遇到了困难。我在此处关注如何显示一个地图标记 (https://tomchentw.github.io/react-google-maps/events/simple-click-event) 的演示,但是当我执行向 GoogleMap 组件添加第二个标记元素的琐碎事情时,我无法显示该标记(我'也改变了坐标)。这真的让我很困扰,如果有人能指出出了什么问题,我将不胜感激。

谢谢。

这是我修改过的代码。 我唯一改变的是添加了第二个标记,带有一个新坐标。

/* global google */
import 
  default as React,
  Component,
 from "react";


import withGoogleMap from './assets/withGoogleMap';
import GoogleMap from './assets/GoogleMap';
import Marker from './assets/Marker';

const SimpleClickEventExampleGoogleMap = withGoogleMap(props => (
  <GoogleMap
    ref=props.onMapMounted
    zoom=props.zoom
    center=props.center
    onCenterChanged=props.onCenterChanged
  >
    <Marker
      defaultPosition=props.center
      title="Click to zoom"
      onClick=props.onMarkerClick
    />

    <Marker
      defaultPosition=props.marker2center
      title="Click to zoom"
      onClick=props.onMarkerClick
    />



  </GoogleMap>
));

const INITIAL_CENTER =  lat: -25.363882, lng: 131.044922 ;
const MARKER1_CENTER =  lat: -25.363882, lng: 131.044922 ;
const MARKER2_CENTER =  lat: -25.44, lng: 131.55 ;

/*
 * https://developers.google.com/maps/documentation/javascript/examples/event-simple
 *
 * Add <script src="https://maps.googleapis.com/maps/api/js"></script> to your html to provide google.maps reference
 */
export default class SimpleClickEventExample extends Component 



  state = 
    zoom: 4,
    center: INITIAL_CENTER,
    marker2center: MARKER2_CENTER
  ;

  handleMapMounted = this.handleMapMounted.bind(this);
  handleCenterChanged = this.handleCenterChanged.bind(this);
  handleMarkerClick = this.handleMarkerClick.bind(this);

  handleMapMounted(map) 
    this._map = map;
  

  handleMarkerClick() 
    this.setState(
      zoom: 8,
    );
  

  handleCenterChanged() 
    const nextCenter = this._map.getCenter();
    if (nextCenter.equals(new google.maps.LatLng(INITIAL_CENTER))) 
      // Notice: Check nextCenter equality here,
      // or it will fire center_changed event infinitely
      return;
    
    if (this._timeoutId) 
      clearTimeout(this._timeoutId);
    
    this._timeoutId = setTimeout(() => 
      this.setState( center: INITIAL_CENTER );
      this._timeoutId = null;
    , 3000);

    this.setState(
      // Because center now is a controlled variable, we need to set it to new
      // value when "center_changed". Or in the next render it will use out-dated
      // state.center and reset the center of the map to the old location.
      // We can never drag the map.
      center: nextCenter,
    );
  

  componentWillUnmount() 
    if (this._timeoutId) 
      clearTimeout(this._timeoutId);
    
  

  render() 
    return (
      <div className='googleMap' style=width: "500px", height: "500px", margin: "0 auto">
        <SimpleClickEventExampleGoogleMap
          containerElement=
            <div style= height: `100%`  />
          
          mapElement=
            <div style= height: `100%`  />
          
          zoom=this.state.zoom
          center=this.state.center
          onMapMounted=this.handleMapMounted
          onCenterChanged=this.handleCenterChanged
          onMarkerClick=this.handleMarkerClick
        />
      </div>
    );
  

【问题讨论】:

【参考方案1】:

要显示多个标记,您只需在具有标记位置的数组中进行迭代。

marks.map((mark, index) => <Marker key=index position=mark />)

这是一个具有更多功能的解决方案。每当用户点击时,代码 sn-p 在地图上添加多个圆圈。

import React,  Component  from "react";
import  withScriptjs, withGoogleMap, GoogleMap, Circle  from "react-google-maps";

const Map = withScriptjs(
    withGoogleMap(props => (
        <GoogleMap
            defaultZoom=12
            defaultCenter= lat: -34.397, lng: 150.644 
            onClick=e => props.onMapClick(e)
        >
            props.marks.map((mark, index) => (
                <Circle
                    key=index
                    center=mark
                    radius=1000
                    options=
                        strokeColor: "#66009a",
                        strokeOpacity: 0.8,
                        strokeWeight: 2,
                        fillColor: `#66009a`,
                        fillOpacity: 0.35,
                        zIndex: 1
                    
                />
            ))
        </GoogleMap>
    ))
);

class ReportsPage extends Component 
    state = 
        marks: []
    ;

    setMark = e => 
        this.setState( marks: [...this.state.marks, e.latLng] );
    ;

    deleteMarkS = () => 
        this.setState(
            marks: []
        );
    ;

    render() 
        const  marks  = this.state;
        return (
            <div>
                <button onClick=this.deleteMark>DELETE MARKS</button>
                <Map
                    googleMapURL="http://maps.googleapis.com/maps/api/js?key=[YOUR GOOGLE MAPS KEY]"
                    loadingElement=<div style= height: `100%`  />
                    containerElement=<div style= height: `400px`  />
                    mapElement=<div style= height: `100%`  />
                    onMapClick=this.setMark
                    marks=marks
                />;
            </div>
        );
    


export default ReportsPage;

不要忘记将 [YOUR GOOGLE MAPS KEY] 更改为您的真实密钥。

【讨论】:

【参考方案2】:

您需要将一组标记作为子组件传递给GoogleMap 组件并像这样映射它们:

<GoogleMap>
props.markers.map(marker => (
    <Marker
      position= lat: marker.latitude, lng: marker.longitude 
      key=marker.id
    />
))
</GoogleMap>

在https://github.com/tomchentw/react-google-maps#withgooglemap和https://tomchentw.github.io/react-google-maps/addons/marker-clusterer查看更多信息

【讨论】:

这对我不起作用,很遗憾。如果我不在数组中所有标记的 googleMapURL 末尾使用&amp;callback=_google_map_loaded_cb,则只打印第一个。如果我在 url 中使用回调,我会收到以下错误:You have included the Google Maps JavaScript API multiple times on this page.This may cause unexpected errors.Uncaught (in promise) 知道如何解决这个问题吗?【参考方案3】:

我想你忘了在 SimpleClickEventExampleGoogleMap 组件中传递 marker2center 属性。

看看marker2center=this.state.marker2center:

<SimpleClickEventExampleGoogleMap
  containerElement=
    <div style= height: `100%`  />
  
  mapElement=
    <div style= height: `100%`  />
  
  zoom=this.state.zoom
  center=this.state.center
  marker2center=this.state.marker2center
  onMapMounted=this.handleMapMounted
  onCenterChanged=this.handleCenterChanged
  onMarkerClick=this.handleMarkerClick
/>

当然,如果您要使用一千个标记,您可以使用map,这样您就不需要手动将每个标记都放入地图中。

稍微改变一下看起来像这样:

<SimpleClickEventExampleGoogleMap
  containerElement=
    <div style= height: `100%`  />
  
  mapElement=
    <div style= height: `100%`  />
  
  zoom=this.state.zoom
  center=this.state.center
  markers=[MARKER1_CENTER, MARKER2_CENTER]
  onMapMounted=this.handleMapMounted
  onCenterChanged=this.handleCenterChanged
  onMarkerClick=this.handleMarkerClick
/>

const SimpleClickEventExampleGoogleMap = withGoogleMap(props => (
  <GoogleMap
    ref=props.onMapMounted
    zoom=props.zoom
    center=props.center
    onCenterChanged=props.onCenterChanged
  >
    props.markers.map((marker, index)=> 
      return (
        <Marker
          position=marker
          title="Click to zoom"
          onClick=props.onMarkerClick
        />
      )
    )
  </GoogleMap>
));

【讨论】:

在文档中找不到marker2center 。您能否提供更多详细信息? @rohan-patel marker2center 是本题原创者创建的道具!这就是为什么您在文档中找不到它的原因! 这是有道理的。 ??‍♂️【参考方案4】:

我在我的代码中使用了它,幸运的是它有效!

/* global google */
import React,  Component  from 'react';
import 
    withScriptjs,
    withGoogleMap,
    GoogleMap,
    Marker,
    InfoWindow
 from 'react-google-maps';
import  compose, withProps  from 'recompose';

let markers=[
    
        id:1,
        latitude: 25.0391667,
        longitude: 121.525,
        shelter:'marker 1'

    ,
    
        id: 2,
        latitude: 24.0391667,
        longitude: 110.525,
        shelter: 'marker 2'

    ,
    
        id: 3,
        latitude: 20.0391667,
        longitude: 100.525,
        shelter: 'marker 3'

    
]
const MapWithAMarkerClusterer = compose(
    withProps(
        googleMapURL: "https://maps.googleapis.com/maps/api/js?key=AIzaSyAZN6EEeeaHPlqNx9fAV4YQgR7ksGNoWaQ&v=3.exp&libraries=geometry,drawing,places",
        loadingElement: <div style= height: `100%`  />,
        containerElement: <div style= height: `100%`  />,
        mapElement: <div style= height: `100%`  />,
    ),
    withScriptjs,
    withGoogleMap
)(props =>
    <GoogleMap
        defaultZoom=2
        defaultCenter= lat: 25.0391667, lng: 121.525 
    >
        markers.map(marker => 
            //const onClick = props.onClick.bind(this, marker)
            return (
                <Marker
                    key=marker.id
                   
                    position= lat: marker.latitude, lng: marker.longitude 
                >
                    <InfoWindow>
                        <div>
                            marker.shelter
                        </div>
                    </InfoWindow>
                </Marker>
            )
        )
    </GoogleMap>
);

class googleMap extends Component 

    render() 
        return (
            <MapWithAMarkerClusterer />
        )
    

export default googleMap;

【讨论】:

【参考方案5】:

停止处理react-google-map。有更好的(有更好的社区)包。 检查google-map-react 包。 我做了这个包的实现,它真的很容易使用:https://github.com/BrodaNoel/devseverywhere/blob/master/src/containers/Metrics/index.jsx

编辑: 如果链接失效,在整个项目中搜索GoogleMapReact即可。

【讨论】:

该链接不再有效 谢谢@user3270407!链接已修复。

以上是关于如何使用 react-google-maps 显示多个标记的主要内容,如果未能解决你的问题,请参考以下文章

React-Google-Maps 显示两个标记,一个在原始位置,另一个标记跟随地图的新中心 onDrag

如何使用 react-google-maps 库创建折线

如何使用 react-google-maps 通过单击在地图上添加标记?

如何在 react-google-maps 中添加标记?

react-google-maps:如何使用 fitBounds、panBy、panTo、panToBounds 公共 API?

如何将自定义按钮添加到 react-google-maps?