2016-06-30 2 views
13

Я создал карты в response-native, ссылаясь на https://github.com/lelandrichardson/react-native-maps Создана карта, но я хочу обнаружить автоматическое местоположение с помощью gps. Вот код, который отображает карту со статичной широтой и долготой. Вот мой обновленный код. Но он все еще не обеспечивает идеальное местоположениеКак создать карты, которые обнаруживают автоматическое местоположение в React-Native

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> 

не могли бы вы исправить его?

Заранее спасибо

ответ

9

Вы можете сделать это с помощью React-родной геолокации:
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}); 
    }); 
} 

You теперь имеют начальную позицию (широту и долготу), используйте ее вместо жесткого кодированного значения. Функция watchPosition вызывает обратный вызов успеха всякий раз, когда изменяется местоположение.

В настоящее время я использую это, чтобы найти местные рестораны в нашем приложении.


Обновлено Ответ:

Я использую Genymotion эмулятор для запуска этого. Если вы также собираетесь запустить этот код в Genymotion, убедитесь, что вы установили поддержку Google Play, в противном случае карты native-native не будут работать. Вам не нужно делать этот шаг, если вы используете физическое устройство.

https://github.com/codepath/android_guides/wiki/Genymotion-2.0-Emulators-with-Google-Play-support

Что касается Geolocation, пожалуйста, убедитесь, что вы добавили разрешение ACCESS_FINE_LOCATION в AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

В противном случае вы получите сообщение об ошибке: «Похоже, что приложение Безразлично» t иметь разрешение на доступ к местоположению. "

Также убедитесь, что ваш 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; 

Запуск выше кода, вы обнаружите, что ваше оригинальное статическое расположение (Mumbai) переписываются с вашим текущим местоположением из устройства через componentDidMount когда getCurrentPosition называется.

Если вам необходимо отслеживать изменения в положении, используйте watchPosition в сочетании с onRegionChange, в противном случае, если вам просто нужно, чтобы получить начальное положение удалить watchPosition шаг.

+0

эй я обновил свой код, вы можете увидеть его как вопрос, но идеальное место по-прежнему не рендеринга – atif

+0

вы используете genymotion?Вы уверены, что ваш GPS включен? Пробовали ли вы консольную запись, чтобы убедиться, что getCurrentPosition возвращает действительную позицию? Я также заметил, что вы не обрабатываете ошибки в вызове getCurrentPosition. Попробуйте добавить «(error) => alert (error.message)», чтобы узнать, получаете ли вы какие-либо ошибки. – Antoni4

+0

Я использую физическое устройство для тестирования. Я удалил часть ошибки, попробовал добавить ее, но не успел. мой код правильный? – atif

Смежные вопросы