如何在react native中执行反向地理编码

r7s23pms  于 2022-12-30  发布在  React
关注(0)|答案(4)|浏览(135)

我尝试在react native中获取我的当前位置,使用react-native-geolocation我得到了我所在位置的纬度和经度。现在我想不使用Google API密钥将它们转换为位置的地址。
有没有办法不使用API密钥就能把经纬度转换成地址?

1bqhqjot

1bqhqjot1#

有很多方法可以不使用Google Maps API而将lon/lat转换为地址。搜索reverse geocoding api,你会找到很多替代方法。
几个月前,我被谷歌多收了反向地理编码API请求的费用。所以我改用了Here。他们有一个free tier,每月提供25万个请求,这对我的应用程序很有效。请参阅这里的文档:https://developer.here.com/documentation/examples/rest/geocoder/reverse-geocode这将为您提供非常详细的地址数据(不像ip-api.comMuhammad建议的www.example.com)。
下面是我用来调用API的 Package 器函数:

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()
      })
  })
}
f8rj6qna

f8rj6qna2#

您可以搜索许多替代的反向地理编码API

溶液1:

使用谷歌Map键

const myApiKey="Key Received from Google map"

function getAddressFromCoordinates({latitude, longitude}) {
  return new Promise((resolve, reject) => {
    fetch(
      'https://maps.googleapis.com/maps/api/geocode/json?address=' +
        latitude +
        ',' +
        longitude +
        '&key=' +
        myApiKey,
    )
      .then(response => response.json())
      .then(responseJson => {
        if (responseJson.status === 'OK') {
          resolve(responseJson?.results?.[0]?.formatted_address);
        } else {
          reject('not found');
        }
      })
      .catch(error => {
        reject(error);
      });
  });
}

溶液2:

使用此处平台键

https://developer.here.com/documentation/geocoder/dev_guide/topics/example-reverse-geocoding.html
他们有一个free tier,为我们提供了250 k请求/月免费配额

const HERE_API_KEY="Key Received from Here Plateform"

function getAddressFromCoordinates({latitude, longitude}) {
  return new Promise((resolve, reject) => {
    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) => {
        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 {
          reject('not found')
        }
      })
      .catch((e) => {
        reject(e);
      })
  })
}
erhoui1w

erhoui1w3#

溶液:

const getAddressFromCoordinates  = async(latitude, longitude) => {
        try {
          const response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}&key=key`);
          const json = await response.json();
          setRealAddress(json.results[0]?.formatted_address);
          return json?.results[0]
          // return json.movies;
        } catch (error) {
          console.error(error);
        }
      }
8ehkhllq

8ehkhllq4#

我刚刚遇到了同样的问题,我的React原生项目,然后来到这里的答案,第一个投票的答案真的帮了我,但我不能让它在我这边工作,所以我去他们的网站,并阅读他们的文档,似乎他们更新了API的响应,我能够让它从更新的响应工作,代码如下:

function getAddressFromCoordinates({ latitude, longitude }) {
    return new Promise((resolve, reject) => {
      const url = `https://revgeocode.search.hereapi.com/v1/revgeocodeat=${latitude}%2C${longitude}&lang=en-US&apiKey=${HERE_API_KEY}`;

      fetch(url)
        .then(res => res.json())
        .then(resJson => {
          if (resJson.items[0].title) {
            resolve(resJson.items[0].address.label);
          } else {
            reject('not found');
          }
        })
        .catch(e => {
          reject(e);
        });
    });
  }

相关问题