Vue3使用高德地图、搜索、地图选点、以及省市区三级联动

这篇具有很好参考价值的文章主要介绍了Vue3使用高德地图、搜索、地图选点、以及省市区三级联动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、准备工作

需要在 高德开发平台 申请自己的 key密钥
vue地图选点,Vue,javascript,vue.js,前端
这里的 Key 名称大家可以随意填写

vue地图选点,Vue,javascript,vue.js,前端
申请完之后我们得到 key密钥
vue地图选点,Vue,javascript,vue.js,前端

vue中使用需要安装**@amap/amap-jsapi-loader --save** 官方文档

npm i @amap/amap-jsapi-loader --save

2、代码实现

首先我们需要三个文件,一个 index.vue 一个用来存放省市区的 index.js 文件
一个 map.vue 地图组件

index.vue 代码
<template>
    <el-form :model="form" ref="formRef" class="box-from" label-width="95px" label-position="right">
        <el-form-item label="省市区">
            <el-select v-model="form.province" style="width: 180px;" placeholder="请选择省份" clearable @change="provinceChange"
                @clear="provinceClear">
                <el-option v-for="item in province" :key="item.code" :label="item.value" :value="item.value" />
            </el-select>
            <el-select v-model="form.city" style="width: 180px; margin-left: 5px;" placeholder="请选择市" clearable
                @change="cityChange" :disabled="form.province === ''" @clear="cityClear">
                <el-option v-for="item in city" :key="item.code" :label="item.value" :value="item.value" />
            </el-select>
            <el-select v-model="form.area" style="width: 180px; margin-left: 5px;" placeholder="请选择区" clearable
                :disabled="form.city === ''">
                <el-option v-for="item in area" :key="item.code" :label="item.value" :value="item.value" />
            </el-select>
        </el-form-item>
        <el-form-item label="详细地址">
            <el-input style="width: 500px;" type="textarea" v-model="form.address" placeholder="请输入详细地址"
                clearable></el-input>
            <el-button @click="addressMap" style="margin-left: 5px;">地图跳转</el-button>
        </el-form-item>
        <el-form-item label="地图选择">
            <Map :addressClick="addressClick" ref="mapRef"></Map>
        </el-form-item>
    </el-form>
</template>

<script setup lang="ts">
import { reactive, ref, toRefs, onMounted } from 'vue';
import { provinceData } from './index'

const state = reactive({
    // 表单
    province: provinceData,
    city: [] as any,
    area: [] as any,
    form: {
        province: '',
        city: '',
        area: '',
        address: ''
    },
})

const { form, province, city, area } = toRefs(state)

const mapRef = ref('') as any

onMounted(() => {
	// 这里传后台获取的经纬度
    mapRef.value.fixed(100.179253, 27.096143)
})

// 省份
function provinceChange(value: any) {
    state.province.forEach(item => {
        if (item.value === value) {
            state.city = item.children
        }
    })
}

// 市
function cityChange(value: any) {
    state.province.forEach(item => {
        if (item.value === state.form.province) {
            item.children.forEach(text => {
                if (text.value === value) {
                    state.area = text.children
                }
            })
        }
    })
}

// 省清空
function provinceClear() {
    state.form.city = ""
    state.form.area = ""
}

// 市清空
function cityClear() {
    state.form.area = ""
}

// 详细地址跳转地图
function addressMap() {
    mapRef.value.toGetCoordinate(state.form.address)
}


// 地图选位置
// 把获取的信息同步到三级联动
function addressClick(item: any, lng: any, lat: any) {
    if (item.regeocode.addressComponent.city === '') {
        state.form.city = item.regeocode.addressComponent.province
    } else {
        state.form.city = item.regeocode.addressComponent.city
    }
    state.form.province = item.regeocode.addressComponent.province
    state.form.area = item.regeocode.addressComponent.district
    state.form.address = item.regeocode.formattedAddress
    state.province.forEach(item => {
        if (item.value === state.form.province) {
            state.city = item.children
            item.children.forEach(text => {
                if (text.value === state.form.city) {
                    state.area = text.children
                }
            })
        }
    })
}
</script>

<style lang="scss" scoped></style>
map.vue 代码
<template>
    <div style="width: 100%;">
        <div id="container" class="map"></div>
        <div class="search-box">
            <el-select v-model="address" clearable placeholder="请输入关键词" style="width: 400px;" :remote-method="remoteMethod"
                filterable remote @change="currentSelect" class="one-text" size="default">
                <el-option v-for="(item, index) in areaList" :key="index" :label="item.district + item.name"
                    :value="item.district + item.name">
                    <span>{{ item.district }}</span> <span>{{ item.name }}</span>
                </el-option>
            </el-select>
        </div>
    </div>
</template>

<script setup>
import { reactive, ref, toRefs, onMounted, nextTick, defineProps } from 'vue';
import AMapLoader from "@amap/amap-jsapi-loader";
const props = defineProps({
    addressClick: Function,
})
onMounted(() => {
    window._AMapSecurityConfig = {
        securityJsCode: '这里放key的安全密钥',
    }
    initMap()
})

const state = reactive({
    map: null,
    placeSearch: null,
    autoComplete: null,
    marker: null,
    form: {
        address: '',
        lng: '',
        lat: '',
    },
    areaList: [],
    address: ''
})

const { areaList, address } = toRefs(state)

function initMap(arr) {
    AMapLoader.load({
        key: "这里放你申请的key",
        version: "2.0",
        plugins: ["AMap.ToolBar", "AMap.ControlBar", 'AMap.AutoComplete', 'AMap.PlaceSearch', 'AMap.Geocoder', 'AMap.Marker'],
    }).then((AMap) => {
        state.map = new AMap.Map('container', {
            viewMode: "3D",  //  是否为3D地图模式
            zoom: 15,
            center: arr,
            resizeEnable: true
        });
        // 地图放大缩小插件
        let toolBar = new AMap.ToolBar({
            position: {
                top: '120px',
                right: '51px'
            }
        })
        // 3D地图插件
        let controlBar = new AMap.ControlBar({
            position: {
                top: '20px',
                right: '20px',
            },
        });

        state.geoCoder = new AMap.Geocoder({
            city: '010', //城市设为北京,默认:“全国”
            radius: 1000 //范围,默认:500
        })

        // 正向地理编码
        state.geocoder = new AMap.Geocoder({
            city: state.address
        })

        state.autoComplete = new AMap.AutoComplete({ city: '全国' });

        state.map.on('click', (e) => { // 点击地图事件
            if (!e && !e.lnglat) {
                return
            }
            state.form.lng = e.lnglat.lng
            state.form.lat = e.lnglat.lat
            removeMarker() // 先删除地图上标记点
            setMapMarker() // 在添加新的标记点
        })
        state.map.addControl(toolBar);   // 添加右上角的放大缩小
        state.map.addControl(controlBar);   // 添加右上角的放大缩小
    }).catch((e) => {
        console.error(e);  //加载错误提示
    }).finally(() => {
        removeMarker()
        setMapMarker()
    })
}

function setMapMarker() {
    if (state.form.lng == '' && state.form.lat == '') {
        return
    }
    state.map.setFitView()
    state.marker = new AMap.Marker({
        map: state.map,
        position: [state.form.lng, state.form.lat],
    })
    toGetAddress()
    state.map.setFitView()
    state.map.add(state.marker)
}

function removeMarker() {
    if (state.marker) {
        state.map.remove(state.marker)
    }
}

function toGetAddress() {
    let lnglat = [state.form.lng, state.form.lat]
    state.geoCoder.getAddress(lnglat, (status, result) => {
        if (status === 'complete' && result.regeocode) {
            props.addressClick(result, state.form.lng, state.form.lat) // 返回位置信息以及经纬度
        }
    })
}

function remoteMethod(query) {
    if (query !== '') {
        setTimeout(() => {
            state.autoComplete.search(query, (status, result) => {
                state.areaList = result.tips
            })
        }, 500)
    } else {
        state.areaList = []
    }
}
function currentSelect(val) {
    if (!val) {
        return
    }
    toGetCoordinate(val)
}

function toGetCoordinate(address) {
    state.geocoder.getLocation(address, function (status, result) {
        if (status === 'complete' && result.info === 'OK') {
            initMap([result.geocodes[0].location.lng, result.geocodes[0].location.lat])
            state.form.lng = result.geocodes[0].location.lng
            state.form.lat = result.geocodes[0].location.lat
            state.form.address = result.geocodes[0].formattedAddress
        }
    })
    nextTick(function () {
        removeMarker()
        setMapMarker()
    })
}

function fixed(lng, lat) {
    initMap([lng, lat])
    state.form.lng = lng
    state.form.lat = lat
}


// 暴露方法
defineExpose({
    fixed,
    toGetCoordinate
});
</script>



<style scoped lang="scss">
.map {
    width: 100%;
    height: 400px;
}

.search-box {
    position: absolute;
    z-index: 9;
    top: 20px;
    left: 20px;

    ::v-deep(.el-select) {
        width: 320px;
        border-radius: 50px;
        overflow: hidden;

        .el-input__wrapper {
            border-radius: 50px;
        }
    }
}
</style>
index.js 代码

这里我以文件的形式上传了,大家直接下载即可 省市区三级联动index.js文件

效果展示
vue地图选点,Vue,javascript,vue.js,前端

补充

因为高德地图的搜索每天有限制,可能导致地图上面的搜索无法使用
但是
可以在详细地址那里填写地址信息点击后面按钮跳转地图 (注意:既然是详细地址建议跳转时添加上省市区)

替换自己的key和密钥可以直接使用,如有问题可以私信。

如果对你有帮助麻烦点个赞咯~文章来源地址https://www.toymoban.com/news/detail-744005.html

到了这里,关于Vue3使用高德地图、搜索、地图选点、以及省市区三级联动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 在vue3项目中使用新版高德地图

    在vue3项目中使用新版高德地图

    高德开发平台 : 高德开放平台 | 高德地图API (amap.com) 1. 首先你要注册好账号登录 2. 获取key和密钥    自2021年12月02日升级,升级之后所申请的 key 必须配备安全密钥  jscode  一起使用         按 NPM 方式安装使用 Loader :         在页面中通过NPM 方式安装的使用 :    

    2023年04月19日
    浏览(12)
  • Echarts+高德地图,获取全国省市区,区域板块地图获取并高亮显示

    Echarts+高德地图,获取全国省市区,区域板块地图获取并高亮显示

    当用户选择省市区之后,可以看到对应区域的高亮显示。 如图: 之前用户选择的是江苏省,因此当前高亮显示的是江苏省地图板块,如果之前用户选择的是成都市,那么地图则会变成四川省的版图,高亮显示成都市,如下图: 可以继续下钻,选择区域高亮显示。 这里分享一个

    2024年02月16日
    浏览(10)
  • 小程序通过经纬度获取省市区(高德地图)

    小程序通过经纬度获取省市区(高德地图)

    在app.js文件中引入高德地图的js文件 获取当前定位   amap-wx.130.js文件

    2024年02月08日
    浏览(9)
  • 高德地图系列(三):vue项目利用高德地图实现地址搜索功能

    高德地图系列(三):vue项目利用高德地图实现地址搜索功能

    目录 第一章 效果图 第二章 源代码 高德地图为我们提供了搜索联想,以及搜索结果标记,该案例已将基础功能打通,后续我们肯定还会对功能有所修改,想实现自己想要的效果,基本上看高德地图文档对着改就好了(跟我们用别的工具一样做即可)  代码描述如下:  注意事

    2024年02月03日
    浏览(5)
  • vue 使用高德地图实现自定义选取起点和终点功能,支持搜索地址跳转定位(保姆级教程)

    vue 使用高德地图实现自定义选取起点和终点功能,支持搜索地址跳转定位(保姆级教程)

    1. 起点终点选择  2. 地址搜索   1. 获取高德地图key 1.1  访问高德地图官网注册完成后登录,进入控制台  1.2  左侧 应用管理-我的应用,点击创建新应用 1.3 点击添加   1.4 选择 Web端(JS API)  1.5 创建完成,得到key和安全密钥   2. 引入高德地图npm包 提示:以下代码全部在*.vu

    2024年02月04日
    浏览(9)
  • vue3高德地图点击标点

    vue3高德地图点击标点

      1.首先如果没有key的话需要在高德开发平台申请key。 2.安装 3.容器: 4.容器样式: 5.在组件中引入所需的 API。 6.创建一个 Marker 实例。 7.定义样式:  显示地图层级与中心点信息: 获取经纬度坐标:   整体代码:  

    2024年02月11日
    浏览(6)
  • VUE3+Ts使用高德地图组件@vuemap/vue-amap语法检测Amap is not defind

    VUE3+Ts使用高德地图组件@vuemap/vue-amap语法检测Amap is not defind

    踩坑记录:最近项目中用到了@vuemap/vue-amap高德地图组件,正常配置完成后,引入官方示例,地图正常出现,可以正常编译不出错,但是代码提示给我整了个这。 于是,开始查资料,为什么会出现这个情况,然后是因为在main.js导入的名字VueMap和高德自己全局暴露AMap不是一码事

    2024年02月06日
    浏览(9)
  • Vue 高德地图(@amap/amap-jsapi-loader)的基本使用:添加标记、POI关键字搜索、路线规划...(方法一)

    Vue 高德地图(@amap/amap-jsapi-loader)的基本使用:添加标记、POI关键字搜索、路线规划...(方法一)

    具体的步骤可以参考我的上一篇博客,有详细说明如何注册申请高德的Key、秘钥,初始化地图等等 vue-amap : vue-amap 基于 Vue 2.x 与高德的地图组件 高德官方介绍:地图 JS API Web服务API简介 高德Web服务API向开发者提供HTTP接口,开发者可通过这些接口使用各类型的地理数据服务,

    2024年01月18日
    浏览(14)
  • 前端系列19集-vue3引入高德地图,响应式,自适应

    前端系列19集-vue3引入高德地图,响应式,自适应

    npm i @amap/amap-jsapi-loader --save 要在Vue 3中引入高德地图,你可以按照以下步骤进行操作: 在项目目录中使用npm或yarn安装高德地图的JavaScript API库。你可以使用以下命令之一: npm install @amap/amap-jsapi-loader yarn add @amap/amap-jsapi-loader 在Vue组件中引入并使用高德地图。 在你的Vue组件中

    2024年02月07日
    浏览(6)
  • VUE3+TS+element UI +高德地图实现轨迹回放带进度条

    VUE3+TS+element UI +高德地图实现轨迹回放带进度条

    记录一下,由于项目需要做车辆的历史轨迹回放,查了很多资料,在高德地图里有这几种解决方案。 所用技术:vue3 + TS +element UI plus +高德地图  这是相关的Demo借鉴 高德地图的轨迹回放demo 轨迹巡航器控制 高德地图Amap UI 下面是效果图: 1,这是高德地图提供的轨迹回放demo

    2024年02月11日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包