高德行政区划查询(vue实现)

这篇说下,如何使用高德来实现行政区划查询并划出行政区的范围,实现参考了官网的案例,不过官网的案例是html写的,我这里用vue实现。

官网案例:行政区边界查询示例

一、最终效果:

在这里插入图片描述

二、页面完整代码:


<template>  
  <div>    <div id="container" ref="amap"></div>  
  
  
    <div class="input-card-container">  
      <el-form @submit.prevent="onSubmit" class="input-card">  
        <el-form-item label="行政区边界查询" style="color: grey;">  
          <el-select v-model="level" placeholder="请选择行政级别">  
            <el-option value="district">district</el-option>  
            <el-option value="city">city</el-option>  
            <el-option value="province">province</el-option>  
          </el-select>  
          <!--        <el-input v-model="district" placeholder="请输入名称或adcode"></el-input>-->  
          <el-input v-model="keyWord" placeholder="请输入名称或adcode"></el-input>  
  
        </el-form-item>  
        <el-button type="primary" @click="onSubmit">查询</el-button>  
      </el-form>    </div>  
  
  </div>  
  
</template>  
  
<script>  
  
  //安全密钥
  window._AMapSecurityConfig = {  
    securityJsCode: "安全密钥",  
  };  
  
  import AMapLoader from '@amap/amap-jsapi-loader';  
  export default {  
    name: "Class",  
    data() {  
      return {  
        level:'district',  
        district:null,  
        polygon:null,  
        keyWord:'朝阳区',  
      };  
    },  
    created() {  
      this.initAMap();  
  
    },  
    methods: {  
  
      initAMap() {  
        AMapLoader.load({  
          key: 'key', // 申请好的Web端开发者Key,首次调用 load 时必填  
          version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15          plugins: ['AMap.DistrictSearch','AMap.Polygon']  // 需要使用的的插件列表,如比例尺'AMap.Scale'等,如果是地图控件,必须再 map.addControl添加  
        })  
          .then((AMap) => {  
            this.map = new AMap.Map('container', {  
              // 设置地图容器id  
              //viewMode: '3D', // 默认2d地图模式  
              zoom: 12, // 初始化地图级别  
              zooms: [5, 30], // 地图缩放范围  
              // 可以设置初始化当前位置  
              center: [116.397428, 39.90923] // 初始化地图位置  
            })  
          })  
      },  
      /**绘制区域*/  
      drawBounds() {  
        if (!this.district) {  
          var opts = {  
            subdistrict: 0,  
            extensions: 'all',  
            level: this.level // 使用数据属性 level          };  
          this.district = new AMap.DistrictSearch(opts);  
        }  
  
        if (!this.keyWord) {  
          console.warn('名称不能为空');  
          return;        }  
  
        // this.district.setLevel(this.level); // 使用数据属性 level  
        this.district.level=this.level;  
        console.log(this.district,"district-----------")  
        //行政区查询  
        this.district.search(this.keyWord, (status, result) => { // 使用箭头函数保留 this 上下文  
          if (this.polygon) {  
            this.map.remove(this.polygon); // 使用 this.map            this.polygon = null;  
            //status:complete 表示查询成功,no_data 为查询无结果,error 代表查询错误  
            //查询成功时,result 即为对应的行政区信息  
          }  
  
          console.log(result,"result---------")  
          if (!result || !result.districtList || !result.districtList[0]) {  
            console.warn('请正确填写名称或更新其他名称');  
            return;          }  
  
          const bounds = result.districtList[0].boundaries;  
          if (bounds) {  
            for (let i = 0; i < bounds.length; i += 1) {  
              bounds[i] = [bounds[i]];  
            }  
  
            this.polygon = new AMap.Polygon({  
              strokeWeight: 1,  
              path: bounds,  
              fillOpacity: 0.4,  
              fillColor: '#80d8ff',  
              strokeColor: '#0091ea'  
            });  
  
            this.map.add(this.polygon);  
            this.map.setFitView(this.polygon);  
          }  
        });  
      },  
  
  
      onSubmit(){  
        this.drawBounds(); // 在表单提交时调用 drawBounds 方法  
      },  
  
  
    }  
  };  
</script>  
  
<style scoped lang="scss">  
  #container {  
    padding: 0px;  
    margin: 0px;  
    width: 100%;  
    height: 900px;  
    position: relative;  
  }  
  .input-card-container {  
    /*position: absolute;*/  
    position: fixed;  
    bottom: 20px;  
    right: 20px;  
    z-index: 1;  
  }  
</style>



三、遇到的问题

代码没有问题,也没有报错
发现发送查询行政区请求时 INVALID_USER_SCODE(无效用户代码)

jsonp_65086_1713950536165_({
    "info": "INVALID_USER_SCODE",
    "infocode": "10008",
    "status": "0",
    "sec_code_debug": "",
    "key": "",
    "sec_code": ""
})

在这里插入图片描述

原因:

只是用了key,没有使用安全密钥

key和安全密钥需要一起使用才可以

在这里插入图片描述

解决:

在前端<script>标签中,也就是import上面添加以下代码就可以了

window._AMapSecurityConfig = {  
  securityJsCode: "安全密钥",  
};
Vue 高德地图的 zoom 级别切换时,控制省市区边界的显示通常涉及到地图组件的配置和数据管理。当你调整地图缩放级别时,可以通过监听 `zoom` 事件来动态加载不同级别的行政区划信息。以下是一个基本步骤: 1. **引入依赖**:首先需要在项目中引入高德地图 API 和 Vue 的官方插件(如 `vue-amap`)。 ```html <script src="path/to/amap.min.js"></script> <script src="path/to/vue-amap.min.js"></script> ``` 2. **配置地图实例**:创建 Vue 组件并初始化地图实例,设置默认的中心点、初始缩放级别以及是否显示各级别的行政区域。 ```javascript <template> <div id="map" @zoom="handleZoomChange"></div> </template> <script> import { Map, Marker } from 'vue-amap'; export default { components: { Map, Marker }, data() { return { map: null, initialZoom: 8 // 默认缩放级别 }; }, mounted() { this.initMap(); }, methods: { initMap() { const center = new AMap.LngLat(116.404, 39.915); // 北京坐标 this.map = new AMap.Map('map', { zoom: this.initialZoom, center, zoomControl: true, zoomMin: 1, // 最小缩放级别 zoomMax: 24, // 最大缩放级别 zoomSteps: [1, 2], // 可选缩放步长数组,如果不指定,将按整数倍进行缩放 regions: {} // 存储不同级别的行政区划数据 }); }, handleZoomChange(e) { const zoom = e.target.getZoom(); // 根据 zoom 级别从缓存或服务器获取对应的行政区域数据 this.loadRegionsForZoom(zoom); }, loadRegionsForZoom(zoomLevel) { if (this.regions[zoomLevel]) { this.map.setRegions(this.regions[zoomLevel]); } else { // 加载或请求对应 zoom 级别的数据,例如从 API 获取省级、市级等数据,并将其添加到 regions 对象中 this.$axios.get(`your-api-url?zoom=${zoomLevel}`).then(response => { this.regions[zoomLevel] = response.data; this.map.setRegions(this.regions[zoomLevel]); }); } } } }; </script> ``` 3. **数据管理**:你需要准备一个包含不同缩放级别行政区域的数据结构,并随着地图缩放级别的变化动态更新。 在这个示例中,假设你有一个 API 提供不同级别的行政区划数据,当地图缩放到某个特定级别时,会通过 `loadRegionsForZoom` 方法调用 API 并更新地图的显示。注意实际应用中可能需要处理异步请求的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丿BAIKAL巛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值