【问题标题】:How to use google reverse geocoding with react native Expo?如何将谷歌反向地理编码与 React Native Expo 结合使用?
【发布时间】:2017-10-05 16:35:15
【问题描述】:

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

我能够正确返回的纬度和经度,并将这些数据转换为我得到的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) 中的理解,将返回地址,但我不明白如何从那里获取这些数据。

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

【问题讨论】:

  • 您正在使用 Expo,但是这个 react-native-geocoder 库需要您在 iOS 上调整您的 XCode 项目并在 Android 项目上进行更改。你做了那个改变吗?我问是因为他们可能会要求您从 Expo 中退出您的应用程序。
  • @R.Bravo 是的,我做了修改

标签: react-native expo


【解决方案1】:

您不需要从 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"}

【讨论】:

  • 您的解决方案也适用于我。但我想从响应中检索城市和州。我是如何得到的?
  • 您必须迭代响应的address_components 并找到您想要的type。要了解有关 Google 地址组件及其类型的更多信息,请查看:developers.google.com/maps/documentation/geocoding/intro#Types 就我而言,我对巴西地址感兴趣,因此以下代码适用于州名:var stateName = responseJson.results[0].address_components.filter(x =&gt; x.types.filter(t =&gt; t == 'administrative_area_level_1').length &gt; 0)[0].short_name; 用于城市名称我使用了 administrative_area_level_2(可以不在此回复中发布完整代码)
  • 我们可以获取我所在位置周围区域的 JSON 对象吗?
  • @devanshsadhotra 你说的区域是什么意思?只需使用您所在位置的纬度和对数并检查 Google 返回的内容。 Example
  • @R.Bravo 我的意思是,我怎样才能在特定半径内获取我的 latLang 周围的数据
【解决方案2】:

【讨论】:

  • 欢迎来到 StackOverflow!请编辑您的答案以包含对您包含的代码的解释。这将提高您答案的质量,并使人们更容易找到它并对其进行投票:)
【解决方案3】:

如果使用博览会;

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

【讨论】:

    【解决方案4】:

    了解您的要求已通过 google api 回答完成,

    但现在它不是免费的,除了计费谷歌帐户之外,一个人不能使用超过免费限制。

    因此,如果您或任何人使用 React-Native-Geocoder ,您可以像这样实现它:

    var pos = {
      lat: 40.7809261,
      lng: -73.9637594
    };
    
    Geocoder.geocodePosition(pos).then(res => {
        alert(res[0].formattedAddress);
    })
    .catch(error => alert(error));
    

    【讨论】:

    • React-Native-Geocoder 仅适用于弹出的应用程序。不适用于世博会。
    • 它不适用于某些设备,但适用于某些设备
    • 另外,该库要求您将 API 密钥作为字符串,并且不是很安全。
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多