chaihongjun.me

利用腾讯地图定位接口查询定位

在仿照开发一个电影网站前端功能的时候,突然发现了免费使用腾讯地图可以进行定位。整体思路是利用浏览器的geolocation功能拿到用户的经纬度信息,再把这个经纬度信息提交到腾讯接口去查询,即可返回对应的物理定位。当然,这个物理地址有些就相对精确,有些就差异有点达了。

这里复盘一下使用方,一个简单的应用:

<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>定位访客位置</title>

    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.7.16/vue.min.js"></script>
  </head>
  <body>
    <h1>定位</h1>

    <div id="app">
      <button @click="onClick">查询位置</button>

      <div v-if="result">
        <p v-if="result.address_component">
          你的位置是:{{result.address_component.nation}}-{{result.address_component.province}}-{{result.address_component.city}}-{{result.address_component.district}}-{{result.address_component.street}}
        </p>
        <p v-if="result.address_reference">
          街道:{{result.address_reference.town.title}}-地标:{{result.address_reference.landmark_l2.title}}
        </p>

        <p v-if="result.address_reference">路:{{result.address_reference.street.title}}</p>

        <p v-if="result.formatted_addresses">
          formatted_addresses:{{result.formatted_addresses.recommend}}-{{result.formatted_addresses.rough}}-{{result.formatted_addresses.standard_address}}
        </p>
      </div>
    </div>
  </body>
</html>

<script>
  let app = new Vue({
    el: '#app',
    data: {
      result: {},
    },
    methods: {
      onClick() {
        // 调用函数获取用户地址信息
        fetchUserAddress()
      },
    },
  })

  async function getUserGeolocation() {
    return new Promise((resolve, reject) => {
      if ('geolocation' in navigator) {
        navigator.geolocation.getCurrentPosition(
          (position) => {
            const { latitude, longitude } = position.coords
            resolve({ latitude, longitude })
          },
          (error) => {
            reject(new Error(`Error obtaining location: ${error.message}`))
          },
        )
      } else {
        reject(new Error('Geolocation is not supported by this browser.'))
      }
    })
  }

  async function getUserLocation() {
    try {
      return await getUserGeolocation()
    } catch (error) {
      console.error('获取位置失败:', error)
    }
  }

  function fetchUserAddress() {
    getUserLocation()
      .then(({ latitude, longitude }) => {
        const API_URL = `https://h5gw.map.qq.com/ws/geocoder/v1/?key=[你的key]&location=${latitude},${longitude}&apptag=lbs_geocoder&output=jsonp`

        $.ajax({
          url: API_URL,
          dataType: 'jsonp', // 指定数据类型为 jsonp
          jsonp: 'callback', // 默认参数名是 'callback'
          success: function (data) {
            // console.log('获取地址成功:', data)
            const { message, result, status } = data
            if (message === 'Success') {
              app.result = result
              console.log('获取地址成功:', app.result)
            } else {
              console.error('获取地址失败:', message)
            }
          },
          error: function (jqXHR, textStatus, errorThrown) {
            console.error('获取地址失败:', textStatus, errorThrown)
          },
        })
      })
      .catch((error) => {
        console.error('获取位置或地址时出错:', error)
      })
  }
</script>

注意代码那里的[你的key],没错就是这样的,可以根据这段代码拓展更详细使用方式。


知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:柴宏俊»