9

我试图弄清楚如何在拖动标记时检索标记位置。我发现了这个:拖动标记事件,回调提供纬度/经度?

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

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());
}

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

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

4

6 回答 6

13

事件侦听器函数的第三个参数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>
    );
  }
}
于 2018-07-24T10:20:24.833 回答
5

以上答案对我不起作用,因为在我的情况下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,
    });
  };

希望,它会帮助你。

于 2020-04-14T06:03:57.760 回答
2

我有一个简单的解决方案

<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
      }
    })
  }

这将自动提供最新的坐标,您可以通过将其绑定到状态来相应地移动您的标记。

于 2019-05-22T10:56:50.900 回答
0

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

<Marker
        position={marker.position}
        draggable={true}
        onDragend={(t, map, coord) => this.onMarkerDragEnd(coord, index)}
        name={marker.name}
      />
于 2018-10-05T22:20:12.453 回答
0

完整解决方案
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);
于 2020-02-07T12:35:42.773 回答
0
centerMoved(mapProps, map) {
        console.log('args:', mapProps, map);
        console.log(map.getCenter().lat());
}
于 2020-08-09T20:15:27.823 回答