Как создавать карты, которые обнаруживают автоматическое местоположение в React-Native

Я создал карты в response-native, ссылаясь на https://github.com/lelandrichardson/react-native-maps создается карта, но я хочу обнаружить автоматическое местоположение с помощью 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>

Вы можете исправить это?

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

Ответ 1

Вы можете сделать это с помощью React-native geolocation:
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 Play, в противном случае адаптивные карты не будут работать. Вам не нужно делать этот шаг, если вы используете физическое устройство.

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

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

<uses-permission android:name="android.permission.ACCESS_FINE_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;

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

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