如何在 React Native 中进行反向地理编码

How to do Reverse Geocoding in react native

我正在尝试在 React Native 中获取我的当前位置,使用 react-native-geolocation 我获取我所在位置的纬度和经度。现在我想在不使用 Google API 键的情况下将它们转换为位置地址。

有什么方法可以不使用 Google API 键将经纬度转换为地址吗?

,没有API密钥

,您无法获得准确的地址

如果你想获取 IP base 位置,那么你可以使用下面的 IP-base-API 和 fetch

fetch('http://ip-api.com/json')
    .then((response) => response.json())
    .then((response) => {
      console.log('User\'s Location Data is ', response);
      console.log('User\'s Country ', response.country);
    })
    .catch((error) => {
      console.error(error);
    });

但是您可以获得像 colakollektiv answer 这样的免费配额的反向地理编码。但使用免费额度后需要付费

https://developer.here.com/documentation/geocoder/dev_guide/topics/example-reverse-geocoding.html

function getAddressFromCoordinates({ latitude, longitude }) {
  return new Promise((resolve) => {
    const url = `https://reverse.geocoder.ls.hereapi.com/6.2/reversegeocode.json?apiKey=${HERE_API_KEY}&mode=retrieveAddresses&prox=${latitude},${longitude}`
    fetch(url)
      .then(res => res.json())
      .then((resJson) => {
        // the response had a deeply nested structure :/
        if (resJson
          && resJson.Response
          && resJson.Response.View
          && resJson.Response.View[0]
          && resJson.Response.View[0].Result
          && resJson.Response.View[0].Result[0]) {
          resolve(resJson.Response.View[0].Result[0].Location.Address.Label)
        } else {
          resolve()
        }
      })
      .catch((e) => {
        console.log('Error in getAddressFromCoordinates', e)
        resolve()
      })
  })
}

有很多方法可以在不使用 Google 映射 API 的情况下将 lon/lat 转换为地址。搜索 reverse geocoding api,您会找到一堆替代品。

几个月前,我因反向地理编码 API 请求而被 Google 多收了钱。所以我切换到 Here. They have a free tier that offers 250k requests/months, which works for my app. See the docs here: https://developer.here.com/documentation/examples/rest/geocoder/reverse-geocode 这将为您提供非常详细的地址数据(与穆罕默德建议的 ip-api.com 不同)。

这是我用来调用 API:

的包装函数
function getAddressFromCoordinates({ latitude, longitude }) {
  return new Promise((resolve) => {
    const url = `https://reverse.geocoder.ls.hereapi.com/6.2/reversegeocode.json?apiKey=${HERE_API_KEY}&mode=retrieveAddresses&prox=${latitude},${longitude}`
    fetch(url)
      .then(res => res.json())
      .then((resJson) => {
        // the response had a deeply nested structure :/
        if (resJson
          && resJson.Response
          && resJson.Response.View
          && resJson.Response.View[0]
          && resJson.Response.View[0].Result
          && resJson.Response.View[0].Result[0]) {
          resolve(resJson.Response.View[0].Result[0].Location.Address.Label)
        } else {
          resolve()
        }
      })
      .catch((e) => {
        console.log('Error in getAddressFromCoordinates', e)
        resolve()
      })
  })
}