如何使用谷歌反向地理编码与本地世博会作出反应?

时间:2017-10-05 16:35:15

标签: react-native expo

我想在我的应用程序中放入一个按钮,按下该按钮返回手机的当前地址。

纬度和经度我能够正确返回,并将此数据转换为我到react-native-geocoder库的地址。

我目前的代码如下:

import React, { Component } from 'react';
import { View, Text, Button } from 'react-native';
import Geocoder from 'react-native-geocoder';
 // 0.4.8

class GeolocationExample extends Component {
  constructor(props) {
    super(props);

    this.state = {
      latitude: null,
      longitude: null,
      error: null,
    };
  }

  refresh = () => {
    navigator.geolocation.getCurrentPosition(
      (position) => {
        this.setState({
          latitude: position.coords.latitude,
          longitude: position.coords.longitude,
          error: null,
        });
      },
      (error) => this.setState({ error: error.message }),
      { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 },
    );
  };

  render() {
    Geocoder.geocodePosition(this.state.latitude,this.state.longitude)
    return (
      <View style={{ flexGrow: 1, alignItems: 'center', justifyContent: 'center' }}>
        <Text>Latitude: {this.state.latitude}</Text>
        <Text>Longitude: {this.state.longitude}</Text>

        {this.state.error ? <Text>Error: {this.state.error}</Text> : null}
         <Button
          style={{ marginTop: 30 }}
          onPress={() => { this.refresh(); }}
          title="Refresh"
        />
      </View>
    );
  }
}

export default GeolocationExample;

我在Geocoder.geocodePosition(this.state.latitude,this.state.longitude)中的理解将返回地址,但我不明白如何从那里获取这些数据。

Snack中的代码:https://snack.expo.io/rJhYwaG2Z

4 个答案:

答案 0 :(得分:15)

您不需要从LatLon进行反向地理编码的库,您可以直接调用Google Maps API,如:

fetch('https://maps.googleapis.com/maps/api/geocode/json?address=' + myLat + ',' + myLon + '&key=' + myApiKey)
        .then((response) => response.json())
        .then((responseJson) => {
            console.log('ADDRESS GEOCODE is BACK!! => ' + JSON.stringify(responseJson));
})

(请记住提供您的Google Maps API密钥!!)

结果对象将包含该LatLon的所有地址组件。

Example result

{"results":[{"address_components":[{"long_name":"540","short_name":"540","types":["street_number"]},{"long_name":"Avenida Alda Garrido","short_name":"Av. Alda Garrido","types":["route"]},{"long_name":"Barra da Tijuca","short_name":"Barra da Tijuca","types":["political","sublocality","sublocality_level_1"]},{"long_name":"Rio de Janeiro","short_name":"Rio de Janeiro","types":["administrative_area_level_2","political"]},{"long_name":"Rio de Janeiro","short_name":"RJ","types":["administrative_area_level_1","political"]},{"long_name":"Brazil","short_name":"BR","types":["country","political"]},{"long_name":"22640-000","short_name":"22640-000","types":["postal_code"]}],"formatted_address":"Av. Alda Garrido, 540 - Barra da Tijuca, Rio de Janeiro - RJ, 22640-000, Brazil","geometry":{"location":{"lat":-23.0077328,"lng":-43.315117},"location_type":"ROOFTOP","viewport":{"northeast":{"lat":-23.0063838197085,"lng":-43.3137680197085},"southwest":{"lat":-23.0090817802915,"lng":-43.3164659802915}}},"place_id":"ChIJfSac_7vQmwARNiQbMrnXe4E","types":["street_address"]},{"address_components":[{"long_name":"Apto 301","short_name":"Apto 301","types":["subpremise"]},{"long_name":"470","short_name":"470","types":["street_number"]},{"long_name":"Avenida Alda Garrido","short_name":"Av. Alda Garrido","types":["route"]},{"long_name":"Barra da Tijuca","short_name":"Barra da Tijuca","types":["political","sublocality","sublocality_level_1"]},{"long_name":"Rio de Janeiro","short_name":"Rio de Janeiro","types":["administrative_area_level_2","political"]},{"long_name":"Rio de Janeiro","short_name":"RJ","types":["administrative_area_level_1","political"]},{"long_name":"Brazil","short_name":"BR","types":["country","political"]},{"long_name":"22621-000","short_name":"22621-000","types":["postal_code"]}],"formatted_address":"Av. Alda Garrido, 470 - Apto 301 - Barra da Tijuca, Rio de Janeiro - RJ, 22621-000, Brazil","geometry":{"location":{"lat":-23.0079088,"lng":-43.3148068},"location_type":"ROOFTOP","viewport":{"northeast":{"lat":-23.0065598197085,"lng":-43.3134578197085},"southwest":{"lat":-23.0092577802915,"lng":-43.3161557802915}}},"place_id":"ChIJpQ8sq77QmwARA6fRe9QZWZ0","types":["establishment","lodging","point_of_interest"]},{"address_components":[{"long_name":"589","short_name":"589","types":["street_number"]},{"long_name":"Avenida Alda Garrido","short_name":"Av. Alda Garrido","types":["route"]},{"long_name":"Barra da Tijuca","short_name":"Barra da Tijuca","types":["political","sublocality","sublocality_level_1"]},{"long_name":"Rio de Janeiro","short_name":"Rio de Janeiro","types":["administrative_area_level_2","political"]},{"long_name":"Rio de Janeiro","short_name":"RJ","types":["administrative_area_level_1","political"]},{"long_name":"Brazil","short_name":"BR","types":["country","political"]},{"long_name":"22620-171","short_name":"22620-171","types":["postal_code"]}],"formatted_address":"Av. Alda Garrido, 589 - Barra da Tijuca, Rio de Janeiro - RJ, 22620-171, Brazil","geometry":{"location":{"lat":-23.0081304,"lng":-43.3147502},"location_type":"ROOFTOP","viewport":{"northeast":{"lat":-23.0067814197085,"lng":-43.3134012197085},"southwest":{"lat":-23.0094793802915,"lng":-43.3160991802915}}},"place_id":"ChIJr2eVq77QmwARA3U9jQNI5Z8","types":["establishment","premise"]},{"address_components":[{"long_name":"540","short_name":"540","types":["street_number"]},{"long_name":"Avenida Alda Garrido","short_name":"Av. Alda Garrido","types":["route"]},{"long_name":"Barra da Tijuca","short_name":"Barra da Tijuca","types":["political","sublocality","sublocality_level_1"]},{"long_name":"Rio de Janeiro","short_name":"Rio de Janeiro","types":["administrative_area_level_2","political"]},{"long_name":"Rio de Janeiro","short_name":"RJ","types":["administrative_area_level_1","political"]},{"long_name":"Brazil","short_name":"BR","types":["country","political"]},{"long_name":"22620-171","short_name":"22620-171","types":["postal_code"]}],"formatted_address":"Av. Alda Garrido, 540 - Barra da Tijuca, Rio de Janeiro - RJ, 22620-171, Brazil","geometry":{"location":{"lat":-23.0078265,"lng":-43.3151749},"location_type":"RANGE_INTERPOLATED","viewport":{"northeast":{"lat":-23.0064775197085,"lng":-43.3138259197085},"southwest":{"lat":-23.0091754802915,"lng":-43.3165238802915}}},"place_id":"EkRBdi4gQWxkYSBHYXJyaWRvLCA1NDAgLSBCYXJyYSBkYSBUaWp1Y2EsIFJpbyBkZSBKYW5laXJvIC0gUkosIEJyYXppbCIbEhkKFAoSCXvIbAC80JsAEXZMHH23Zf8TEJwE","types":["street_address"]},{"address_components":[{"long_name":"Avenida Alda Garrido","short_name":"Av. Alda Garrido","types":["route"]},{"long_name":"Barra da Tijuca","short_name":"Barra da Tijuca","types":["political","sublocality","sublocality_level_1"]},{"long_name":"Rio de Janeiro","short_name":"Rio de Janeiro","types":["administrative_area_level_2","political"]},{"long_name":"Rio de Janeiro","short_name":"RJ","types":["administrative_area_level_1","political"]},{"long_name":"Brazil","short_name":"BR","types":["country","political"]},{"long_name":"22620-171","short_name":"22620-171","types":["postal_code"]}],"formatted_address":"Av. Alda Garrido - Barra da Tijuca, Rio de Janeiro - RJ, 22620-171, Brazil","geometry":{"bounds":{"northeast":{"lat":-23.0077138,"lng":-43.3146692},"southwest":{"lat":-23.0080912,"lng":-43.3153903}},"location":{"lat":-23.0079025,"lng":-43.3150298},"location_type":"GEOMETRIC_CENTER","viewport":{"northeast":{"lat":-23.0065535197085,"lng":-43.3136807697085},"southwest":{"lat":-23.0092514802915,"lng":-43.3163787302915}}},"place_id":"ChIJe8hsALzQmwARd0wcfbdl_xM","types":["route"]},{"address_components":[{"long_name":"22620-400","short_name":"22620-400","types":["postal_code"]},{"long_name":"Barra da Tijuca","short_name":"Barra da Tijuca","types":["political","sublocality","sublocality_level_1"]},{"long_name":"Rio de Janeiro","short_name":"Rio de Janeiro","types":["administrative_area_level_2","political"]},{"long_name":"State of Rio de Janeiro","short_name":"RJ","types":["administrative_area_level_1","political"]},{"long_name":"Brazil","short_name":"BR","types":["country","political"]}],"formatted_address":"Barra da Tijuca, Rio de Janeiro - State of Rio de Janeiro, 22620-400, Brazil","geometry":{"bounds":{"northeast":{"lat":-23.0078347,"lng":-43.3137711},"southwest":{"lat":-23.0118196,"lng":-43.3149785}},"location":{"lat":-23.0108544,"lng":-43.3146249},"location_type":"APPROXIMATE","viewport":{"northeast":{"lat":-23.0078347,"lng":-43.31302581970849},"southwest":{"lat":-23.0118196,"lng":-43.31572378029149}}},"place_id":"ChIJxyn3hb7QmwARggN-wB930Xo","types":["postal_code"]},{"address_components":[{"long_name":"Barra da Tijuca","short_name":"Barra da Tijuca","types":["political","sublocality","sublocality_level_1"]},{"long_name":"Rio de Janeiro","short_name":"Rio de Janeiro","types":["administrative_area_level_2","political"]},{"long_name":"State of Rio de Janeiro","short_name":"RJ","types":["administrative_area_level_1","political"]},{"long_name":"Brazil","short_name":"BR","types":["country","political"]},{"long_name":"22620-171","short_name":"22620-171","types":["postal_code"]}],"formatted_address":"Barra da Tijuca, Rio de Janeiro - State of Rio de Janeiro, Brazil","geometry":{"bounds":{"northeast":{"lat":-23.0009429,"lng":-43.2977475},"southwest":{"lat":-23.0153102,"lng":-43.3294084}},"location":{"lat":-23.0093991,"lng":-43.3173933},"location_type":"APPROXIMATE","viewport":{"northeast":{"lat":-23.0009429,"lng":-43.2977475},"southwest":{"lat":-23.0153102,"lng":-43.3294084}}},"place_id":"ChIJ2zZsIqPQmwARquMCy3yno4Q","types":["postal_code","postal_code_prefix"]},{"address_components":[{"long_name":"Barra da Tijuca","short_name":"Barra da Tijuca","types":["political","sublocality","sublocality_level_1"]},{"long_name":"Rio de Janeiro","short_name":"Rio de Janeiro","types":["administrative_area_level_2","political"]},{"long_name":"State of Rio de Janeiro","short_name":"RJ","types":["administrative_area_level_1","political"]},{"long_name":"Brazil","short_name":"BR","types":["country","political"]}],"formatted_address":"Barra da Tijuca, Rio de Janeiro - State of Rio de Janeiro, Brazil","geometry":{"bounds":{"northeast":{"lat":-22.9642374,"lng":-43.2844897},"southwest":{"lat":-23.0228827,"lng":-43.45027049999999}},"location":{"lat":-23.0003709,"lng":-43.36589499999999},"location_type":"APPROXIMATE","viewport":{"northeast":{"lat":-22.9642374,"lng":-43.2844897},"southwest":{"lat":-23.0228827,"lng":-43.45027049999999}}},"place_id":"ChIJXf62J0ramwARTg-e2NH2w2M","types":["political","sublocality","sublocality_level_1"]},{"address_components":[{"long_name":"Rio de Janeiro","short_name":"Rio de Janeiro","types":["administrative_area_level_2","political"]},{"long_name":"State of Rio de Janeiro","short_name":"RJ","types":["administrative_area_level_1","political"]},{"long_name":"Brazil","short_name":"BR","types":["country","political"]}],"formatted_address":"Rio de Janeiro - State of Rio de Janeiro, Brazil","geometry":{"bounds":{"northeast":{"lat":-22.7460201,"lng":-43.0990395},"southwest":{"lat":-23.0828927,"lng":-43.7965385}},"location":{"lat":-22.9112301,"lng":-43.4452148},"location_type":"APPROXIMATE","viewport":{"northeast":{"lat":-22.7460201,"lng":-43.0990395},"southwest":{"lat":-23.0828927,"lng":-43.7965385}}},"place_id":"ChIJC7UkQv5-mQAR7llshDwliPk","types":["administrative_area_level_2","political"]},{"address_components":[{"long_name":"Rio de Janeiro","short_name":"Rio de Janeiro","types":["locality","political"]},{"long_name":"Rio de Janeiro","short_name":"Rio de Janeiro","types":["administrative_area_level_2","political"]},{"long_name":"State of Rio de Janeiro","short_name":"RJ","types":["administrative_area_level_1","political"]},{"long_name":"Brazil","short_name":"BR","types":["country","political"]}],"formatted_address":"Rio de Janeiro, State of Rio de Janeiro, Brazil","geometry":{"bounds":{"northeast":{"lat":-22.7460327,"lng":-43.0969042},"southwest":{"lat":-23.0822288,"lng":-43.7950599}},"location":{"lat":-22.9068467,"lng":-43.1728965},"location_type":"APPROXIMATE","viewport":{"northeast":{"lat":-22.7460327,"lng":-43.0969042},"southwest":{"lat":-23.0822288,"lng":-43.7950599}}},"place_id":"ChIJW6AIkVXemwARTtIvZ2xC3FA","types":["locality","political"]},{"address_components":[{"long_name":"State of Rio de Janeiro","short_name":"RJ","types":["administrative_area_level_1","political"]},{"long_name":"Brazil","short_name":"BR","types":["country","political"]}],"formatted_address":"State of Rio de Janeiro, Brazil","geometry":{"bounds":{"northeast":{"lat":-20.7632054,"lng":-40.9568207},"southwest":{"lat":-23.3689318,"lng":-44.8893205}},"location":{"lat":-22.9098755,"lng":-43.2094971},"location_type":"APPROXIMATE","viewport":{"northeast":{"lat":-20.7632054,"lng":-40.9568207},"southwest":{"lat":-23.3689318,"lng":-44.8893205}}},"place_id":"ChIJw4riypQYmAAR0IMFwRrDSQM","types":["administrative_area_level_1","political"]},{"address_components":[{"long_name":"Brazil","short_name":"BR","types":["country","political"]}],"formatted_address":"Brazil","geometry":{"bounds":{"northeast":{"lat":5.2717863,"lng":-28.650543},"southwest":{"lat":-34.0891,"lng":-73.9828169}},"location":{"lat":-14.235004,"lng":-51.92528},"location_type":"APPROXIMATE","viewport":{"northeast":{"lat":5.2717863,"lng":-28.650543},"southwest":{"lat":-34.0891,"lng":-73.9828169}}},"place_id":"ChIJzyjM68dZnAARYz4p8gYVWik","types":["country","political"]}],"status":"OK"}

答案 1 :(得分:3)

使用Google api答案完成对您的要求的理解,

但是现在它不是免费的,除了为Google帐户计费以外,不能使用超过免费限额的其他东西。

因此,如果您正在使用React-Native-Geocoder或与之合作的任何人,都可以这样实现:

var pos = {
  lat: 40.7809261,
  lng: -73.9637594
};

Geocoder.geocodePosition(pos).then(res => {
    alert(res[0].formattedAddress);
})
.catch(error => alert(error));

答案 2 :(得分:0)

Location.reverseGeocodeAsync(位置)

答案 3 :(得分:0)

如果使用expo;

import * as Location from 'expo-location'

getAddress = async () => {
    let {status} = await Location.requestForegroundPermissionsAsync(); // Get the location permission from the user and extract the 'status' key from it.
    if(status !== 'granted') {

        alert('permission denied!');
        return;
    }
    let address = Location.reverseGeoCodeAsync({lat, lng});

}

这里有更多细节;

https://docs.expo.io/versions/latest/sdk/location/#locationreversegeocodeasynclocation