如何创建在 React-Native 中检测自动位置的地图
how to create maps which detect automatic location in React-Native
我参考 https://github.com/lelandrichardson/react-native-maps 在 react-native 中创建了地图
地图已创建,但我想使用 gps 检测自动位置。这是使用静态纬度和经度呈现地图的代码。
这是我更新的代码。但它仍然没有呈现完美的位置
getInitialState() {
return {
initialPosition: 'unknown',
lastPosition: 'unknown',
};
},
componentDidMount() {
navigator.geolocation.getCurrentPosition(
(position) => {
var initialPosition = JSON.stringify(position);
this.setState({initialPosition});
},
{enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
);
this.watchID = navigator.geolocation.watchPosition((position) => {
var lastPosition = JSON.stringify(position);
this.setState({lastPosition});
});
},
componentWillUnmount() {
navigator.geolocation.clearWatch(this.watchID);
},
render() {
return (
<View style={styles.container}>
<MapView
ref="map"
mapType="terrain"
style={styles.map}
initialPosition={this.state.initialPosition}
lastPosition={this.state.lastPosition}
>
</MapView>
</View>
你能更正一下吗?
提前致谢
您可以使用 React-native 地理定位来做到这一点:
https://facebook.github.io/react-native/docs/geolocation.html
那里已经有一个关于如何做到这一点的很好的例子:
componentDidMount: function() {
navigator.geolocation.getCurrentPosition(
(position) => {
var initialPosition = JSON.stringify(position);
this.setState({initialPosition});
},
(error) => alert(error.message),
{enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
);
this.watchID = navigator.geolocation.watchPosition((position) => {
var lastPosition = JSON.stringify(position);
this.setState({lastPosition});
});
}
您现在有了 initialPosition(纬度和经度),使用它代替您的硬编码值。 watchPosition 会在位置发生变化时调用成功回调。
我目前正在使用它在我们的应用程序中查找当地餐馆。
更新答案:
我正在使用 Genymotion 模拟器 运行 这个。如果你也打算在Genymotion上运行这段代码,请确保你已经安装了Google播放支持,否则react-native-maps将无法工作. 如果您使用的是物理设备,则不必执行此步骤。
https://github.com/codepath/android_guides/wiki/Genymotion-2.0-Emulators-with-Google-Play-support
关于地理位置,请确保您在AndroidManifest.xml:
中添加了ACCESS_FINE_LOCATION权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
否则会报错:"Looks like the app doesn't have the permission to access location."
另外请确保您的 GPS/Wifi/Data 已启用,否则您的设备无法检索您的当前位置。
var React = require('react');
var ReactNative = require('react-native');
var {
StyleSheet,
PropTypes,
View,
Text,
Dimensions,
TouchableOpacity,
} = ReactNative;
var MapView = require('react-native-maps');
var { width, height } = Dimensions.get('window');
const ASPECT_RATIO = width / height;
// (Initial Static Location) Mumbai
const LATITUDE = 19.0760;
const LONGITUDE = 72.8777;
const LATITUDE_DELTA = 0.01;
const LONGITUDE_DELTA = LATITUDE_DELTA * ASPECT_RATIO;
var CustomMap = React.createClass({
getInitialState() {
return {
region: {
latitude: LATITUDE,
longitude: LONGITUDE,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA
},
};
},
componentDidMount: function() {
navigator.geolocation.getCurrentPosition(
(position) => {
this.setState({
region: {
latitude: position.coords.latitude,
longitude: position.coords.longitude,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA
}
});
},
(error) => alert(error.message),
{enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
);
this.watchID = navigator.geolocation.watchPosition((position) => {
const newRegion = {
latitude: position.coords.latitude,
longitude: position.coords.longitude,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA
}
this.onRegionChange(newRegion);
});
},
componentWillUnmount: function() {
navigator.geolocation.clearWatch(this.watchID);
},
onRegionChange(region) {
this.setState({ region });
},
render() {
return (
<View style={styles.container}>
<MapView
ref="map"
mapType="terrain"
style={styles.map}
region={this.state.region}
onRegionChange={this.onRegionChange}
>
</MapView>
<View style={styles.bubble}>
<Text style={{ textAlign: 'center'}}>
{`${this.state.region.latitude.toPrecision(7)}, ${this.state.region.longitude.toPrecision(7)}`}
</Text>
</View>
</View>
);
},
});
var styles = StyleSheet.create({
container: {
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
justifyContent: 'flex-end',
alignItems: 'center',
},
map: {
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
},
bubble: {
backgroundColor: 'rgba(255,255,255,0.7)',
paddingHorizontal: 18,
paddingVertical: 12,
borderRadius: 20,
},
});
module.exports = CustomMap;
运行 上面的代码,你应该会发现你原来的静态位置(孟买)在调用 getCurrentPosition 时通过 componentDidMount 被设备上的当前位置覆盖了。
如果您需要跟踪位置的变化,请结合使用 watchPosition 和 onRegionChange,否则如果您只需要获取初始值位置删除 watchPosition 步骤。
我参考 https://github.com/lelandrichardson/react-native-maps 在 react-native 中创建了地图 地图已创建,但我想使用 gps 检测自动位置。这是使用静态纬度和经度呈现地图的代码。 这是我更新的代码。但它仍然没有呈现完美的位置
getInitialState() {
return {
initialPosition: 'unknown',
lastPosition: 'unknown',
};
},
componentDidMount() {
navigator.geolocation.getCurrentPosition(
(position) => {
var initialPosition = JSON.stringify(position);
this.setState({initialPosition});
},
{enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
);
this.watchID = navigator.geolocation.watchPosition((position) => {
var lastPosition = JSON.stringify(position);
this.setState({lastPosition});
});
},
componentWillUnmount() {
navigator.geolocation.clearWatch(this.watchID);
},
render() {
return (
<View style={styles.container}>
<MapView
ref="map"
mapType="terrain"
style={styles.map}
initialPosition={this.state.initialPosition}
lastPosition={this.state.lastPosition}
>
</MapView>
</View>
你能更正一下吗?
提前致谢
您可以使用 React-native 地理定位来做到这一点:
https://facebook.github.io/react-native/docs/geolocation.html
那里已经有一个关于如何做到这一点的很好的例子:
componentDidMount: function() {
navigator.geolocation.getCurrentPosition(
(position) => {
var initialPosition = JSON.stringify(position);
this.setState({initialPosition});
},
(error) => alert(error.message),
{enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
);
this.watchID = navigator.geolocation.watchPosition((position) => {
var lastPosition = JSON.stringify(position);
this.setState({lastPosition});
});
}
您现在有了 initialPosition(纬度和经度),使用它代替您的硬编码值。 watchPosition 会在位置发生变化时调用成功回调。
我目前正在使用它在我们的应用程序中查找当地餐馆。
更新答案:
我正在使用 Genymotion 模拟器 运行 这个。如果你也打算在Genymotion上运行这段代码,请确保你已经安装了Google播放支持,否则react-native-maps将无法工作. 如果您使用的是物理设备,则不必执行此步骤。
https://github.com/codepath/android_guides/wiki/Genymotion-2.0-Emulators-with-Google-Play-support
关于地理位置,请确保您在AndroidManifest.xml:
中添加了ACCESS_FINE_LOCATION权限<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
否则会报错:"Looks like the app doesn't have the permission to access location."
另外请确保您的 GPS/Wifi/Data 已启用,否则您的设备无法检索您的当前位置。
var React = require('react');
var ReactNative = require('react-native');
var {
StyleSheet,
PropTypes,
View,
Text,
Dimensions,
TouchableOpacity,
} = ReactNative;
var MapView = require('react-native-maps');
var { width, height } = Dimensions.get('window');
const ASPECT_RATIO = width / height;
// (Initial Static Location) Mumbai
const LATITUDE = 19.0760;
const LONGITUDE = 72.8777;
const LATITUDE_DELTA = 0.01;
const LONGITUDE_DELTA = LATITUDE_DELTA * ASPECT_RATIO;
var CustomMap = React.createClass({
getInitialState() {
return {
region: {
latitude: LATITUDE,
longitude: LONGITUDE,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA
},
};
},
componentDidMount: function() {
navigator.geolocation.getCurrentPosition(
(position) => {
this.setState({
region: {
latitude: position.coords.latitude,
longitude: position.coords.longitude,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA
}
});
},
(error) => alert(error.message),
{enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
);
this.watchID = navigator.geolocation.watchPosition((position) => {
const newRegion = {
latitude: position.coords.latitude,
longitude: position.coords.longitude,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA
}
this.onRegionChange(newRegion);
});
},
componentWillUnmount: function() {
navigator.geolocation.clearWatch(this.watchID);
},
onRegionChange(region) {
this.setState({ region });
},
render() {
return (
<View style={styles.container}>
<MapView
ref="map"
mapType="terrain"
style={styles.map}
region={this.state.region}
onRegionChange={this.onRegionChange}
>
</MapView>
<View style={styles.bubble}>
<Text style={{ textAlign: 'center'}}>
{`${this.state.region.latitude.toPrecision(7)}, ${this.state.region.longitude.toPrecision(7)}`}
</Text>
</View>
</View>
);
},
});
var styles = StyleSheet.create({
container: {
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
justifyContent: 'flex-end',
alignItems: 'center',
},
map: {
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
},
bubble: {
backgroundColor: 'rgba(255,255,255,0.7)',
paddingHorizontal: 18,
paddingVertical: 12,
borderRadius: 20,
},
});
module.exports = CustomMap;
运行 上面的代码,你应该会发现你原来的静态位置(孟买)在调用 getCurrentPosition 时通过 componentDidMount 被设备上的当前位置覆盖了。
如果您需要跟踪位置的变化,请结合使用 watchPosition 和 onRegionChange,否则如果您只需要获取初始值位置删除 watchPosition 步骤。