【问题标题】:google-maps-react get marker position on drag endgoogle-maps-react 在拖动结束时获取标记位置
【发布时间】:2018-07-24 09:24:33
【问题描述】:

我试图弄清楚如何在拖动标记时检索标记位置。我发现了这个:Drag marker event with callback providing lat/long?

并像这样在我的应用上实现:

export class MapContainer extends React.Component {
  onMarkerDragEnd = evt => {
    console.log(evt);
  };

  render() {
    const style = {
      width: "100%",
      height: "300px"
    };

    let lat = this.props.lat;
    let lng = this.props.lng;

    return (
      <Map
        google={this.props.google}
        style={style}
        initialCenter={{
          lat: lat,
          lng: lng
        }}
        zoom={14}
      >
        <Marker
          onClick={this.onMarkerClick}
          draggable={true}
          onDragend={this.onMarkerDragEnd}
          name={"Current location"}
        />
      </Map>
    );
  }
}

onMarkerDragEnd 函数记录一个 evt 对象,如下所示:

{onClick: undefined, draggable: true, onDragend: ƒ, name: 
"Currentlocation", map: Zf, …}
draggable: true
google:{maps: {…}}
map: Zf {gm_bindings_: {…}, __gm: uf, gm_accessors_: {…}, mapTypeId: 
"roadmap", center: _.K, …}
mapCenter:{lat: "37.122024", lng: "25.234458"}
name:"Current location"
onClick:undefined
onDragend:ƒ (evt)
__proto__:Object

我试着做这样的事情:

onMarkerDragEnd = (evt) => {
  console.log(evt.google.maps.Marker.getPosition().lat());
}

但它返回无法获得未定义的位置

那么我如何从这个返回的事件中获取标记的位置? 感谢您的帮助!

【问题讨论】:

    标签: javascript reactjs google-maps-react


    【解决方案1】:

    onDragend 事件监听函数的第三个参数包含拖动后标记的坐标。

    示例

    class MapContainer extends React.Component {
      state = {
        markers: [
          {
            name: "Current position",
            position: {
              lat: 37.77,
              lng: -122.42
            }
          }
        ]
      };
    
      onMarkerDragEnd = (coord, index) => {
        const { latLng } = coord;
        const lat = latLng.lat();
        const lng = latLng.lng();
    
        this.setState(prevState => {
          const markers = [...this.state.markers];
          markers[index] = { ...markers[index], position: { lat, lng } };
          return { markers };
        });
      };
    
      render() {
        return (
          <Map
            google={this.props.google}
            style={{
              width: "100%",
              height: "300px"
            }}
            zoom={14}
          >
            {this.state.markers.map((marker, index) => (
              <Marker
                position={marker.position}
                draggable={true}
                onDragend={(t, map, coord) => this.onMarkerDragEnd(coord, index)}
                name={marker.name}
              />
            ))}
          </Map>
        );
      }
    }
    

    【讨论】:

    • 如果 onDragend 不适合您,请使用 onDragEnd。 onDragEnd 为我工作。
    【解决方案2】:

    以上答案对我不起作用,因为 onDragEnd 在我的情况下返回 undefined

    onDragend={(t, map, coord) => this.onMarkerDragEnd(coord, index)}
    

    所以我通过使用下面的行找到coordinates

    onDragEnd={(e) => this.onMarkerDragEnd(e.nativeEvent.coordinate)}
    

    您可以在此处找到它(可拖动标记

    https://github.com/react-native-community/react-native-maps

    简单示例

    state = {
        region: {
          latitude: 37.78825,
          longitude: -122.4324,
          latitudeDelta: 0.0922,
          longitudeDelta: 0.0421,
        }
    }
    

    标记

    <Marker
          coordinate={this.getMapRegion()}
          draggable={true}
          onDragEnd={(e) => this.onMarkerDragEnd(e.nativeEvent.coordinate)}
          title={ "Location"}
      />
    

    onMarkerDragEnd

    onMarkerDragEnd = (coord) => {
        let newRegion = {
          latitude: parseFloat(coord.latitude),
          longitude: parseFloat(coord.longitude),
          latitudeDelta: 0.0522,
          longitudeDelta: 0.0321,
        };
        this.setState({
          region: newRegion,
        });
      };
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      我有一个简单的解决方案

      <GoogleMapReact
       bootstrapURLKeys={{ key: '' }}
       defaultCenter={this.state.center}
       defaultZoom={this.state.zoom}
       yesIWantToUseGoogleMapApiInternals={true}
       onClick = {this.changeMarkerPosition}
      >
      

      然后在函数中

        changeMarkerPosition =(e)=>{
          this.setState({
          ...this.state,
            details:{
              ...this.state.details,
              lat:e.lat,
              lng:e.lng
            }
          })
        }
      

      这将自动给出最新的坐标,你可以通过将它绑定到状态来相应地移动你的标记。

      【讨论】:

        【解决方案4】:

        我只是想补充一点,onDragEnd 对我不起作用。相反,我需要在标记事件中使用带有小写 e 的 onDragend,如下所示:

        <Marker
                position={marker.position}
                draggable={true}
                onDragend={(t, map, coord) => this.onMarkerDragEnd(coord, index)}
                name={marker.name}
              />
        

        【讨论】:

          【解决方案5】:

          完整解决方案
          getLocation()函数最初获取当前位置并设置在地图上。
          onMarkerDragEnd()当我们拖动到另一个地方时,函数获取标记位置。

          import React, { Component } from 'react';
          import { Map, GoogleApiWrapper, Marker } from 'google-maps-react';
          
          class Maps extends Component {
              constructor(props) {
                  super(props);
                  this.state = {
                      markers: [
                          {
                              name: "Current position",
                              position: {
                                  lat: '24.914161699999998',
                                  lng: '67.082216'
                              }
                          }
                      ]
          
                  }
              }
          
              onMarkerDragEnd = (coord, index) => {
                  const { latLng } = coord;
                  const lat = latLng.lat();
                  const lng = latLng.lng();
          
                  this.setState(prevState => {
                      const markers = [...this.state.markers];
                      markers[index] = { ...markers[index], position: { lat, lng } };
                      return { markers };
                  });
              }
          
              getLocation = () => {
                  if (navigator && navigator.geolocation) {
                      navigator.geolocation.getCurrentPosition(pos => {
                          const coords = pos.coords;
          
                          let newState = Object.assign({}, this.state);
                          newState.markers[0].position.lat = coords.latitude;
                          newState.markers[0].position.lng = coords.longitude;
          
                          this.setState(newState);
                          console.log("map", this.state.markers[0].position.lat, this.state.markers[0].position.lng)
                      });
                  }
              }
          
              componentDidMount() {
                  this.getLocation()
              }
          
              handleSubmit = async e => {
                  e.preventDefault();
          
                  const location = {
                      latitude: this.state.markers[0].position.lat,
                      longitude: this.state.markers[0].position.lng
                  }
          
              }
          
              render() {
                  return (
          
                      <div>
                          <Map
                              google={this.props.google}
                              style={{
                                  width: "100%",
                                  height: "300px"
                              }}
                              zoom={14}
                              initialCenter={{ lat: this.state.markers[0].position.lat, lng: this.state.markers[0].position.lng }}
                          >
                              {this.state.markers.map((marker, index) => (
                                  <Marker
                                      key={index}
                                      position={marker.position}
                                      draggable={true}
                                      onDragend={(t, map, coord) => this.onMarkerDragEnd(coord, index)}
                                      name={marker.name}
                                  />
                              ))}
                          </Map>
                          <button type="submit" onClick={this.handleSubmit} >submit</button>
                      </div>
                  );
              }
          }
          
          export default GoogleApiWrapper({
              apiKey: 'google api key here'
          })(Maps);
          

          【讨论】:

            【解决方案6】:
            centerMoved(mapProps, map) {
                    console.log('args:', mapProps, map);
                    console.log(map.getCenter().lat());
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-07-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-08-31
              • 2018-12-20
              • 2018-02-03
              相关资源
              最近更新 更多