问题
I want to put in my application a button that when pressed return the current address of the cell phone.
The latitude and longitude I am able to return correctly, and to convert this data into an address I got to the react-native-geocoder library.
My current code looks like this:
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;
From what I understood in Geocoder.geocodePosition(this.state.latitude,this.state.longitude) would be returning the address, but I did not understand how to get this data from there.
The code in the Snack: https://snack.expo.io/rJhYwaG2Z
回答1:
You don't need an library for reverse geocoding from LatLon, you can just call Google Maps API directly like:
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));
})
(remember to provide your Google Maps API Key!!)
The result object will have all the Address Components for that 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"}
回答2:
Undestanding your requirement is completed with google api answer,
But now it is not for free, one cannot use more than free limit other than billing google account.
So, if you are or anyone working with React-Native-Geocoder , you can implement it like this:
var pos = {
lat: 40.7809261,
lng: -73.9637594
};
Geocoder.geocodePosition(pos).then(res => {
alert(res[0].formattedAddress);
})
.catch(error => alert(error));
来源:https://stackoverflow.com/questions/46590698/how-to-use-google-reverse-geocoding-with-react-native-expo