百度舆图定位

[复制链接]
发表于 2025-12-11 11:35:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
参考博主:vue3 Element plus 百度舆图封装( 搜刮定位功能,拖拽回显功能)_vue3 pc端实现定位回显位置信息-CSDN博客
 运行情况:vue3+Ant Design
1,申请百度舆图ak
网址:百度舆图-百万开发者首选的舆图服务商,提供专属的行业办理方案
登录/注册后点击右上角控制台,点击左侧【应用管理】下的【我的应用】【创建应用】申请ak
2,index.html内引入
  1. <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=申请的ak值&s=1"></script>
复制代码
3,画舆图
  1. <template>
  2.   <!-- 这个是我这个框架里封装好的弹窗组件 -->
  3.   <BasicModal
  4.     width="1200px"
  5.     v-bind="$attrs"
  6.     :defaultFullscreen="true"
  7.     :canFullscreen="false"
  8.     @register="registerModal"
  9.     title="定位"
  10.     @ok="handleSubmit"
  11.   >
  12.     <!-- ----地图相关--- -->
  13.     <!-- 表单用于搜索 -->
  14.     <a-form class="formdom">
  15.       <a-form-item label="详细地址">
  16.         <a-auto-complete
  17.           v-model:value="mapData.address"
  18.           placeholder="请输入详细地址"
  19.           :backfill="true"
  20.           :options="optionsAll"
  21.           @search="querySearch"
  22.           @select="handleSelect"
  23.         >
  24.           <template #option="item">
  25.             <div>
  26.               <div>{{ item.title }}</div>
  27.               <span style="font-size: 12px; color: #b4b4b4">{{ item.address }}</span>
  28.             </div>
  29.           </template>
  30.         </a-auto-complete>
  31.       </a-form-item>
  32.       <!-- 显示经纬度 -->
  33.       <a-form-item label="经纬度">
  34.         <a-input v-model:value="mapData.point" :disabled="true" />
  35.       </a-form-item>
  36.     </a-form>
  37.     <!-- 画的地图 -->
  38.     <div id="map" style="width: 100%; height: 100%"></div>
  39.   </BasicModal>
  40. </template>
  41. <script lang="ts">
  42.   import { defineComponent, ref } from 'vue';
  43.   import { BasicModal, useModalInner } from '/@/components/Modal'; //框架自带的弹窗组件可忽略
  44.   import { SearchOutlined } from '@ant-design/icons-vue'; //我用的是Ant Design组件库,这个是引入搜索图标
  45.   export default defineComponent({
  46.     name: 'AppModal',
  47.     components: {
  48.       BasicModal, //可忽略
  49.     },
  50.     emits: ['success'],
  51.     setup(props, { emit }) {
  52.       const isUpdate = ref(true); //可忽略
  53.       // 初始经度,纬度
  54.       const lat = ref(36.67411054692821);
  55.       const lng = ref(117.10358591219932);
  56.       // 搜索框下拉选项
  57.       const optionsAll = ref([]);
  58.       // 初始化地图
  59.       let Map = null;
  60.       // 初始图标
  61.       let mk = null;
  62.       // 地图缩放级别
  63.       let zoom = 12;
  64.       // 先定义一个全局变量后面用
  65.       const BMap = window.BMap;
  66.       // 坐标信息
  67.       const mapData = ref({
  68.         address: '', //详细地址
  69.         point: '', //经纬度
  70.         lat: '', //经度
  71.         lng: '', //纬度
  72.       });
  73.       // 初始函数
  74.       const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
  75.         //我这一行引入的都是BasicModal弹窗组件封装好的与地图无关
  76.         // 把值都清空
  77.         mapData.value.address = '';
  78.         mapData.value.point = '';
  79.         mapData.value.lat = '';
  80.         mapData.value.lng = '';
  81.         if (data.isUpdate) {
  82.           // 编辑-因为我这个是弹窗打开地图,可能是编辑可能是添加,也就坐标和地址回显
  83.           lat.value = data.records.lat;
  84.           lng.value = data.records.lng;
  85.           mapData.value.lat = data.records.lat;
  86.           mapData.value.lng = data.records.lng;
  87.           mapData.value.address = data.records.address;
  88.           mapData.value.point = data.records.lng + ',' + data.records.lat;
  89.         }
  90.         // 弹窗初始化
  91.         setModalProps({ confirmLoading: false }); //与地图无关
  92.         isUpdate.value = !!data?.isUpdate; //与地图无关
  93.         //初始化地图 禁用地图默认点击弹框
  94.         Map = new BMap.Map('map', { enableMapClick: false });
  95.         var point = new BMap.Point(lng.value, lat.value);
  96.         // 初始化 地图经纬度 层级12代表缩放zoom
  97.         Map.centerAndZoom(point, zoom);
  98.         Map.enableScrollWheelZoom(true); //滚动缩放
  99.         //创建一个图像标注实例 启用拖拽 默认为false
  100.         mk = new BMap.Marker(point, { enableDragging: true });
  101.         // 图标图片尺寸设置
  102.         mk.z.Bj.size.height = 100;
  103.         mk.z.Bj.size.width = 100;
  104.         Map.addOverlay(mk); //将覆盖物添加到地图中
  105.         // 地图拖动事件
  106.         Map.addEventListener('dragend', function (e) {
  107.           Map.panTo(e.point); //将地图的中心点更改为给定的点
  108.           getAddrByPoint(e.point); //拖拽结束后调用逆地址解析函数,e.point为拖拽后的地理坐标
  109.         });
  110.         // 图标拖动事件
  111.         mk.addEventListener('dragend', function (e) {
  112.           getAddrByPoint(e.point); //拖拽结束后调用逆地址解析函数,e.point为拖拽后的地理坐标
  113.         });
  114.       });
  115.       // 逆解析函数
  116.       async function getAddrByPoint(point) {
  117.         var geco = new BMap.Geocoder();
  118.         geco.getLocation(point, function (res) {
  119.           mapData.value = {
  120.             address: res.address,
  121.             point: point.lng + ' , ' + point.lat,
  122.             lat: point.lat,
  123.             lng: point.lng,
  124.           };
  125.           mk.setPosition(point); //重新设置标注的地理坐标
  126.           // Map.panTo(point); //将地图的中心点更改为给定的点
  127.         });
  128.       }
  129.       // 搜索函数
  130.       const querySearch = (str) => {
  131.         var options = {
  132.           //检索完成后的回调函数
  133.           onSearchComplete: function (res) {
  134.             var arr = [];
  135.             if (local.getStatus() == BMAP_STATUS_SUCCESS) {
  136.               for (var i = 0; i < res.getCurrentNumPois(); i++) {
  137.                 arr.push(res.getPoi(i));
  138.               }
  139.             }
  140.             //拿到数据之后回显给搜索框的下拉框
  141.             optionsAll.value = arr;
  142.             optionsAll.value.forEach((item) => {
  143.               item.value = item.address;
  144.             });
  145.           },
  146.         };
  147.         var local = new BMap.LocalSearch(Map, options);
  148.         local.search(str);
  149.       };
  150.       // 搜索框的下拉框,选中某项会触发的-选择函数
  151.       const handleSelect = (val, options) => {
  152.         // 保存当前数据
  153.         mapData.value = {
  154.           address: options.address,
  155.           point: options.point.lng + ' , ' + options.point.lat,
  156.           lat: options.point.lat,
  157.           lng: options.point.lng,
  158.         };
  159.         mk.setPosition(options.point); //重新设置标注的地理坐标
  160.         Map.panTo(options.point); //将地图的中心点更改为给定的点
  161.       };
  162.       // 弹窗保存--把值传回去
  163.       async function handleSubmit() {
  164.         const latlng = {
  165.           lat: mapData.value.lat,
  166.           lng: mapData.value.lng,
  167.         };
  168.         emit('success', {
  169.           positonStr: mapData.value.address,
  170.           latlng: latlng,
  171.         });
  172.         closeModal();
  173.       }
  174.       return {
  175.         registerModal,
  176.         handleSubmit,
  177.         handleSelect,
  178.         querySearch,
  179.         mapData,
  180.         optionsAll,
  181.         SearchOutlined,
  182.       };
  183.     },
  184.   });
  185. </script>
  186. <style scoped lang="scss">
  187.   .formdom {
  188.     position: absolute;
  189.     top: 0;
  190.     background-color: #fff;
  191.     z-index: 10;
  192.     display: flex;
  193.     justify-content: space-evenly;
  194.     align-items: center;
  195.     width: 100%;
  196.     ::v-deep(.ant-row) {
  197.       width: 30%;
  198.     }
  199.   }
  200. </style>
复制代码
4,大概报错,我在本地跑的时间是正常的,但是放到线上之后就有题目了“报错BMap is not defined”而且舆图是空缺的,过细的话在最开始还会有下面这张图上的错误,查了一下办理办法就是在index.html引入的时间在末端加上&s=1由于我最开始是http为了以防万一我也改成https了


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表