【问题标题】:How to make marker always centered when map is moving around?地图移动时如何使标记始终居中?
【发布时间】:2019-09-29 13:15:58
【问题描述】:

我正在使用 react-google-maps 组件制作带有一个标记的地图。我做到了,它运行良好,但问题是我希望该标记始终居中。

我在 google 上进行了研究,并找到了几种解决方案:一个是通过 google API,但我不知道如何实现 react-google-maps,第二个 - 在地图上添加假标记 - 我认为不是很好的解决方案。

import React from 'react';
import { GoogleMap, withScriptjs, withGoogleMap, Marker} from 'react-google-maps';

function Map() {
    return(
        <GoogleMap
                defaultZoom={13}
                defaultCenter={{lat:54.68916, lng:25.2798}}
        >
           <Marker 
                position={{lat:54.68916, lng:25.2798}}
                draggable={true}
                onDragEnd={(e) => markerDrop(e)}
           />
        </GoogleMap>
    );
}

function markerDrop(event){
    //get values of marker
    let lat = event.latLng.lat();
    let lng = event.latLng.lng();
    //insert values to forms
    document.getElementById('location_latitude').value = lat;
    document.getElementById('location_longitude').value = lng;
    return
}


const WrappedMap = withScriptjs(withGoogleMap(Map));



export default function PickLocation(){
    return(
        <div>
            <WrappedMap 
                googleMapURL={'https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,drawing,places&key=AIzaSy'}
                loadingElement={<div style={{ height: `100%` }} />}
                containerElement={<div style={{ height: `400px` }} />}
                mapElement={<div style={{ height: `100%` }} />}
            />
        </div>
    )
}

和结果必须与uber拾取地图相似,其中标记位于地图中间,并且地图正在移动。

【问题讨论】:

  • 您可以通过将GoogleMap 组件的center 属性设置为与标记相同的lat lng 来实现。例如:&lt;GoogleMap center={{lat: this.props.markerLat, lng: this.props.markerLng}} ....&gt;
  • 我之前尝试过这个解决方案,但后来我在控制台中收到错误 TypeError: Cannot read property 'props' of undefined
  • 要做到这一点,您必须更改Map 的组件属性或标记位置更改时的状态。您必须将 Map 更改为类组件或接收属性作为参数的函数。

标签: javascript reactjs google-maps react-google-maps


【解决方案1】:

以下是保持标记在地图移动时居中的更改列表:

1) 引入center 状态保持标记位置:

const [center, setCenter] = useState(null);

2) 在地图移动时(通过bounds_changeddrag 事件监听器)更新当前center

const handleBoundsChanged = () => {
    const mapCenter = refMap.current.getCenter(); //get map center
    setCenter(mapCenter);
};

在哪里

<GoogleMap 
   ref={refMap}
   onBoundsChanged={handleBoundsChanged} 
   ...
/>

3) 通过center状态定位标记:

<Marker  position={center} />

示例

function Map() {
  const [center, setCenter] = useState({ lat: 54.68916, lng: 25.2798 });
  const refMap = useRef(null);

  const handleBoundsChanged = () => {
    const mapCenter = refMap.current.getCenter(); //get map center
    setCenter(mapCenter);
  };

  return (
    <GoogleMap
      ref={refMap}
      defaultZoom={13}
      defaultCenter={{ lat: 54.68916, lng: 25.2798 }}
      onBoundsChanged={useCallback(handleBoundsChanged)}
    >
      <Marker position={center} />
    </GoogleMap>
  );
}

Here is a demo

注意:由于使用Hooks React 版本需要16.8 或以上版本

【讨论】:

  • 这对我有用,帮助我找出错误(使用react-google-maps-api-docs.netlify.app/#googlemap
  • 如果你使用 @react-google-maps/api 你应该使用事件 onIdle 而不是 OnBoundsChanged。示例:onIdle={useCallback(handleBoundsChanged)}
猜你喜欢
  • 2021-10-11
  • 2015-07-05
  • 2016-12-28
  • 2020-03-10
  • 2020-02-16
  • 2013-09-13
  • 2013-02-14
  • 2015-10-06
  • 2017-10-20
相关资源
最近更新 更多