Como centro de um MapView sobre a localização atual do usuário quando o Ecrã do Mapa aberto? Reagir Nativo Expo

0

Pergunta

Como o centro do mapa para mostrar a localização atual do usuário quando o ecrã do mapa aberto? Seguindo a expo documentação, deve ser alcançado com a Expo API de Localização? No entanto, a documentação não é clara. Eu fiz parte do código do expo Localização de documentação e implementado no meu Ecrã de Mapa. Então, como eu deveria integrá-lo em MapView para executar o getCurrentPositionAsync método e o centro do mapa adequadamente quando o ecrã do mapa aberto?

import React, { useContext, useState, useEffect } from "react";
import MapView from "react-native-maps";
import styled from "styled-components";
import { Searchbar } from "react-native-paper";
import { View } from "react-native";

import * as Location from 'expo-location';

const Map = styled(MapView)`
height: 100%;
width: 100%;
`;

const SearchBarContainer= styled(View)`
padding: ${(props) => props.theme.space[3]};
position: absolute;
z-index: 999;
top: 20px;
width: 100%;
`;

export const MapScreen = ({navigation}) => {

  const [location, setLocation] = useState(null);
  const [errorMsg, setErrorMsg] = useState(null);

  useEffect(() => {
    (async () => {
      let { status } = await Location.requestForegroundPermissionsAsync();
      if (status !== 'granted') {
        setErrorMsg('Permission to access location was denied');
        return;
      }

      let location = await Location.getCurrentPositionAsync({});
      setLocation(location);
    })();
  }, []);

  return (
    <> 
    <SearchBarContainer>
      <Searchbar placeholder="location"/>
    </SearchBarContainer>
    <Map showsUserLocation={true}>
      
    </Map>
    </>
  );};
2

Melhor resposta

1

Eu tenho lutado com este problema por um par de dias assim e acho muito estranho que, apesar de a expo MapView pode mostrar a sua própria localização no mapa, ele não pode retornar a sua própria coördinates.

Apesar disso, o problema pode ser corrigido com a seguinte solução.

  1. Instalar Expo-localização

expo instalar expo-localização

  1. Importação
import * as Location from 'expo-location'
  1. Criar um estado
const [location, setLocation] = useState({});
  1. Criar um useEffect função que recupera o seu coördinates assíncrona (recuperando a localização no botão prima pode levar até 5 a 10 segundos, que é ridiculamente atrasados em relação a experiência do usuário)
useEffect(() => {
        (async () => {
            let { status } = await Location.requestForegroundPermissionsAsync();
            if (status !== 'granted') {
                return;
            }

            let location = await Location.getCurrentPositionAsync({
                accuracy: Location.Accuracy.Balanced,
                enableHighAccuracy: true,
                timeInterval: 5
            });
            setLocation(location);
        })();
    }, []);
  1. O Mapview precisa ter uma referência para falar com o MapView e conjunto é coördinates.
<MapView ref={mapRef}>.... </MapView>
const mapRef = React.createRef();
  1. E, no fim, criar uma função que pode ser acionado por um botão personalizado para o centro para os usuários localização.
const goToMyLocation = async () => {
        mapRef.current.animateCamera({center: {"latitude":location.coords.latitude, "longitude": location.coords.longitude}});
}
2021-11-25 12:37:55
0

Você tem que passar utilizador coordenadas fornecidas pela Expo api de localização no seu mapa componente inorder para mostrar a sua Localização actual, também é necessário definir um estado inicial para a sua localização com o (lat,lng) da seguinte forma e , se você buscar maior acuracy eu recomendaria para estes opção para o seu getCurrentPositionAsync

        export const MapScreen = ({navigation}) => {
        
          const [location, setLocation] = useState({
          latitude: 37.78825,
          longitude: -122.4324,
    });
          const [errorMsg, setErrorMsg] = useState(null);
          useEffect(() => {
            (async () => {
              let { status } = await Location.requestForegroundPermissionsAsync();
              if (status !== 'granted') {
                setErrorMsg('Permission to access location was denied');
                return;
              }
        
              let location = await Location.getCurrentPositionAsync({
                accuracy: Location.Accuracy.Balanced,
                enableHighAccuracy: true,
                timeInterval: 5
});
              setLocation(location);
            })();
          }, []);
        
          return (
            <> 
            <SearchBarContainer>
              <Searchbar placeholder="location"/>
            </SearchBarContainer>
            <Map region={location} showsUserLocation={true}/>
            </>
          );};
2021-11-24 13:05:32

Oi, obrigado pela resposta. Eu implementadas seu código. No entanto, estou recebendo um aviso : Falha prop tipo: prop região.latitudeDelta está marcado como obrigatório em mapView, mas o seu valor é indefinido. E o mapa ainda não está centrado em torno da localização actual?
Patrick89

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................