我正在开发一个地图位置。当我在某个特定的地方点击时,我得到纬度和经度,但不是当前的位置,纬度和经度。
我不知道如何找到答案。
我如何获得它们以及如何将标记放在该位置?
这是我的代码:
class Maps extends React.Component {
constructor(props) {
super(props);
this.state = {
region: {
latitude: LATITUDE,
longitude: LONGITUDE,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA,
},
marker: {
latlng:{
latitude: null,
longitude: null,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA
}
}
}
}
componentDidMount() {
navigator.geolocation.getCurrentPosition (
(position) => { alert("value:" + position) },
(error) => { console.log(error) },
{
enableHighAccuracy: true,
timeout: 20000,
maximumAge: 10000
}
)
}
onMapPress(e) {
alert("coordinates:" + JSON.stringify(e.nativeEvent.coordinate))
this.setState({
marker: [{ coordinate: e.nativeEvent.coordinate }]
})
}
render() {
return (
<View style={styles.container}>
<View style={{flexGrow:1}}>
<MapView
ref="map"
provider={this.props.provider}
style={styles.map}
onPress={this.onMapPress.bind(this)}
provider = {PROVIDER_DEFAULT}
mapType="standard"
zoomEnabled={true}
pitchEnabled={true}
showsUserLocation={true}
followsUserLocation={true}
showsCompass={true}
showsBuildings={true}
showsTraffic={true}
showsIndoors={true}>
</MapView>
</View>
</View>
)
}
}
答案 0 :(得分:33)
我是按照这些步骤使用react-native@0.42.3
和react-native-maps@^0.13.1
以及在日期使用react-native@0.44.0
和react-native-maps@^0.15.2
完成的:
在mapRegion
,最后state
和最后longitude
设置latitude
对象null
:
state = {
mapRegion: null,
lastLat: null,
lastLong: null,
}
然后在componentDidMount()
函数中观察当前位置的每次更改:
componentDidMount() {
this.watchID = navigator.geolocation.watchPosition((position) => {
...
});
}
如果有更改,请在this.state.mapRegion
中更新它们,传递实际的坐标和delta
值(我的可能与您的不同,因此请调整它们):
componentDidMount() {
this.watchID = navigator.geolocation.watchPosition((position) => {
// Create the object to update this.state.mapRegion through the onRegionChange function
let region = {
latitude: position.coords.latitude,
longitude: position.coords.longitude,
latitudeDelta: 0.00922*1.5,
longitudeDelta: 0.00421*1.5
}
this.onRegionChange(region, region.latitude, region.longitude);
}, (error)=>console.log(error));
}
然后你需要onRegionChange()
功能,用于&#34;设置&#34; componentDidMount()
函数中元素的新值:
onRegionChange(region, lastLat, lastLong) {
this.setState({
mapRegion: region,
// If there are no new values set the current ones
lastLat: lastLat || this.state.lastLat,
lastLong: lastLong || this.state.lastLong
});
}
在componentWillUnmount()
上卸载地理位置:
componentWillUnmount() {
navigator.geolocation.clearWatch(this.watchID);
}
渲染MapView
传递您当前的mapRegion
对象,其内部的MapView.Marker
只是为了向您显示当前的latitude
和longitude
改变:
render() {
return (
<View style={{flex: 1}}>
<MapView
style={styles.map}
region={this.state.mapRegion}
showsUserLocation={true}
followUserLocation={true}
onRegionChange={this.onRegionChange.bind(this)}>
<MapView.Marker
coordinate={{
latitude: (this.state.lastLat + 0.00050) || -36.82339,
longitude: (this.state.lastLong + 0.00050) || -73.03569,
}}>
<View>
<Text style={{color: '#000'}}>
{ this.state.lastLong } / { this.state.lastLat }
</Text>
</View>
</MapView.Marker>
</MapView>
</View>
);
}
为地图添加StyleSheet.absoluteFillObject,以便使用设备的整个宽度和高度正确渲染。
const styles = StyleSheet.create({
map: {
...StyleSheet.absoluteFillObject,
}
});
因此,对于onPress()
函数,您可以执行与onRegionChange()
类似的操作,以获取实际坐标并设置它们:
onMapPress(e) {
let region = {
latitude: e.nativeEvent.coordinate.latitude,
longitude: e.nativeEvent.coordinate.longitude,
latitudeDelta: 0.00922*1.5,
longitudeDelta: 0.00421*1.5
}
this.onRegionChange(region, region.latitude, region.longitude);
}
检查expo.io上的完整代码(虽然react-native-maps
尚未安装)
答案 1 :(得分:4)
我建议您阅读有关地理定位的官方文档:https://facebook.github.io/react-native/docs/geolocation.html
然后,使用当前位置,您可以将该信息放入您的状态:
navigator.geolocation.getCurrentPosition((position) => {
this.setState({position: {longitude: position.longitude, latitude: position.latitude}});
}, (error) => {
alert(JSON.stringify(error))
}, {
enableHighAccuracy: true,
timeout: 20000,
maximumAge: 1000
});
接下来,您可以在渲染方法中使用标记构建最终视图:
render() {
return (
<MapView ...>
<MapView.Marker
coordinate={this.state.position}
title="title"
description="description"
/>
</MapView>
)
}
答案 2 :(得分:0)
使用以下代码查找位置权限:
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
alert("You can use the location")
}
else {
alert("Location permission denied")
}
}
catch (err) {
console.warn(err)
}
使用以下代码获取当前位置的纬度和经度:
this.watchID = navigator.geolocation.watchPosition((position) => {
let region = {
latitude: position.coords.latitude,
longitude: position.coords.longitude,
latitudeDelta: 0.00922*1.5,
longitudeDelta: 0.00421*1.5
}
}