根据输入的详细地址解析经纬度

摘要:

今天遇到一个需求:就是做客户导入的时候因为导入的客户地址的时候没有经纬度的,但是同步的时候需要经纬度的,所以还是要根据客户提供的详细地址解析出来对应的经纬度!回填到对应的经纬度的表单之中进行客户的同步功能!

bash 复制代码
<template>
  <div>
    <el-input v-model="formData.detailAddress" placeholder="请输入详细地址" @input="fetchCoordinates" />
    <p>经度: {{ coordinates.lng }}</p>
    <p>纬度: {{ coordinates.lat }}</p>
  </div>
</template>

<script lang="ts">
import { ref, reactive } from 'vue';

export default {
  setup() {
    const formData = reactive({
      detailAddress: ''
    });

    const coordinates = reactive({
      lng: '',
      lat: ''
    });

    const fetchCoordinates = async () => {
      if (formData.detailAddress) {
        try {
          const encodedAddress = encodeURIComponent(formData.detailAddress);
          const apiKey = 'YOUR_API_KEY'; // 替换为你的 API 密钥
          const response = await fetch(`https://api.map.com/geocode/json?address=${encodedAddress}&key=${apiKey}`);
          //const response = await fetch(`https://restapi.amap.com/v3/geocode/geo?key=${apiKey}&address=${encodedAddress}`);
          if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
          }
          const data = await response.json();
          console.log('Response data:', data); // 输出响应数据
          if (data.status === 'OK') {
            coordinates.lng = data.results[0].geometry.location.lng;
            coordinates.lat = data.results[0].geometry.location.lat;
          } else {
            console.error('地理编码失败', data);
          }
        } catch (error) {
          console.error('请求失败', error);
        }
      }
    };

    return {
      formData,
      coordinates,
      fetchCoordinates
    };
  }
};
</script>

代码功能解释

模板部分:

  • 使用 el-input 组件绑定 formData.detailAddress,并设置 @input 事件监听器,当用户输入地址时调用
    fetchCoordinates 方法。 显示解析后的经纬度。

脚本部分:

  • 使用 reactive 创建响应式对象 formData 和 coordinates。
  • 定义 fetchCoordinates 方法,该方法在用户输入地址时被调用。
  • 在 fetchCoordinates 方法中,检查 formData.detailAddress 是否有值,如果有值则发起地理编码请求。
  • 添加了对 response.ok 的检查,确保请求成功后再解析 JSON 数据。
  • 请求成功后,解析返回的 JSON 数据,提取经纬度并更新 coordinates 对象。
  • 如果请求失败或地理编码失败,记录详细的错误信息。
  • 添加了 console.log 语句,输出响应数据,帮助调试。

控制流图:

详细解释

  • A用户输入详细地址: 用户在输入框中输入详细地址。
  • B调用 fetchCoordinates 方法: 输入框的 @input 事件触发,调用 fetchCoordinates 方法。
  • C{地址是否为空?}: 检查 formData.detailAddress 是否为空。
  • D结束: 如果地址为空,结束流程。
  • E发起地理编码请求: 发起地理编码请求。
  • F{请求是否成功?}: 检查请求是否成功。
  • G记录请求失败错误: 如果请求失败,记录错误信息。
  • H解析返回数据: 解析返回的 JSON 数据。
  • I{解析是否成功?}: 检查解析是否成功。
  • J记录解析失败错误: 如果解析失败,记录错误信息。
  • K更新经纬度: 更新 coordinates 对象中的经纬度。
  • L显示经纬度: 在页面上显示解析后的经纬度。

调试建议:

  • 检查 API 地址:确保
    https://api.map.com/geocode/json?address=KaTeX parse error: Expected 'EOF', got '&' at position 17: ...encodedAddress}&̲key={apiKey}
    是正确的。
  • 检查 API 密钥:确保 YOUR_API_KEY 替换为你实际的 API 密钥。
  • 查看网络请求:使用浏览器的开发者工具(如 Chrome DevTools)查看网络请求的详细信息,包括请求头和响应体。
  • 日志输出:在代码中添加更多的 console.log 语句,输出请求和响应的详细信息,帮助定位问题。
  • API 文档:查阅 API 提供方的文档,确保请求参数和格式正确。
bash 复制代码
<el-form-item label="详细地址" prop="detailAddress" label-width="120px">
   <el-input v-model="formData.detailAddress" placeholder="请输入详细地址" @input="fetchCoordinates" />
</el-form-item>
<el-form-item label="坐标" prop="splon" label-width="120px">
    <el-input disabled oninput="value = value.replace(/[^0-9.-]/g,'')" v-model="formData.splon" class="!w-115px !mr-2px" clearable placeholder="请选择经度" />
    <el-input disabled oninput="value = value.replace(/[^0-9.-]/g,'')" v-model="formData.splat" class="!w-115px" clearable placeholder="请选择纬度" />
    <el-button text type="primary" size="small" @click="openChooseMap">选择坐标</el-button>
</el-form-item>
bash 复制代码
const fetchCoordinates = async () => {
  if (formData.value.detailAddress) {
    try {
      const encodedAddress = encodeURIComponent(formData.value.detailAddress);
      const apiKey = 'YOUR_API_KEY';
      const response = await fetch(`https://restapi.amap.com/v3/geocode/geo?key=${apiKey}&address=${encodedAddress}`);
      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
      }
      const data = await response.json();
      console.log('Response data:', data); // 输出响应数据
      if (data.status == '1' || data.statusCode == 200) {
        const location = data.geocodes[0].location;
        formData.value.splon = location.split(',')[0];
        formData.value.splat = location.split(',')[1];
      } else {
        // console.error('解析地址失败:', data);
      }
    } catch (error) {
      console.error('请求失败', error);
    }
  }
};
相关推荐
wangruofeng4 分钟前
给前端开发者的 100 个设计参考网站
前端·设计
M--Y2 小时前
LangGraph 工作流模式
开发语言·javascript·python·langchain·大模型·llm·langgraph
星栈3 小时前
视频即代码,Remotion 能做什么、不能做什么
前端·音视频开发
广州华水科技3 小时前
单北斗GNSS位移监测系统的应用与技术解析
前端
用户47949283569154 小时前
从一句话或代码仓到可交互 HTML:开源 Agent 画图技能 Archify v3.2 实测与选型边界
前端·后端·面试
风骏时光牛马6 小时前
生成一个AI多模态标题,仅输出一条标题,无额外文字、问句、备选、配图、文案等任何附加内容,不需要其他的任务服务 只要标题。
前端
wangruofeng6 小时前
从 GIF 到 AVIF:网页图片格式演进与 2026 年选型指南
前端·架构
清晨Coding7 小时前
为什么用 React Developer Tools 查看组件树这么乱?
前端·react.js
johnjincaaaa7 小时前
猿人学第 18 题「jsvmp 洞察先机」逆向通关实录
javascript·后端
鶴哥只手遮天8 小时前
《Electron 45.2.3 内核解剖》第 4 章 补丁体系:380 个补丁改了什么
前端·electron