vue高德地图(三):搜索地点并标记;绘制路线

在这里插入图片描述
在这里插入图片描述

    <!-- 地图  -->
    <div>
        <!--        查询地点-->
        <div class="searchWrap">
            <input type="text" class="searchPlace" v-model="searchVal">
            <button @click="getSearchVal">查询</button>
            <button @click="ride">骑行路线</button>
        </div>
        <div class="mapContainer">
            <div id="container"></div>
            <!-- 显示导航步骤-->
            <div class="panelWrap" ref="panelWrap">
                <div class="panelOpen" v-show="initOpen" @click="togglePanelFn" ref="panelOpen"></div>
                <div id="panel" v-show="togglePanel"></div>
            </div>
        </div>
    </div>

以下路线以骑行的方式进行获取。如需其他交通方式,请在此基础上看文末提示。

//...
//初始化地图和获取用户当前定位看前两篇,这里不再贴出来了。
//...
data() {
    return {
        //此处不声明 map 对象,可以直接使用 this.map赋值或者采用非响应式的普通对象来存储。
        // map: null,
        ip: '',
        searchVal: '',//查询地点
        initOpen: false,//初始化展开按钮
        togglePanel: false,//初始化展开按钮
        lnglat: [],
    }
},
//下边是methods里的方法:
// 获取输入框值 并进行搜索
getSearchVal() {
    console.log('搜索地点', this.searchVal)
    let _this = this
    var marker = new AMap.Marker();
    AMap.plugin('AMap.Geocoder', function () {
        var geocoder = new AMap.Geocoder({
            // city: "010", //城市设为北京,默认:“全国”
        });
        var address = _this.searchVal;
        geocoder.getLocation(address, function (status, result) {
            if (status === 'complete' && result.geocodes.length) {
                var lnglat = result.geocodes[0].location
                console.log('经纬度:', lnglat)
                _this.lnglat = lnglat
                marker.setPosition(lnglat);
                map.add(marker);//map是一个页面全局变量
                map.setFitView(marker);
            } else {
                console.log('根据地址查询位置失败');
            }
        });
    })
},
//骑行导航
ride() {
    let _this= this//存储this变量
    AMap.plugin('AMap.Riding', function () {
        let riding = new AMap.Riding({
            map: map,//AMap.Map对象, 展现结果的地图实例。当指定此参数后,搜索结果的标注、线路等均会自动添加到此地图上。可选参数
            panel: "panel", //结果列表的HTML容器id或容器元素,提供此参数后,结果列表将在此容器中进行展示。可选参数
            hideMarkers: false,
            autoFitView: true,//用于控制在路径规划结束后,是否自动调整地图视野使绘制的路线处于视口的可见范围
        });
        //根据起终点坐标规划骑行路线
        try {
            //_this.ip是存储的用户地址[xx.xxxxxx,xx.xxxxxx], _this.lnglat是用户搜索出的地址[xx.xxxxxx,xx.xxxxxx]
            riding.search(_this.ip, _this.lnglat, function (status, result) {
                console.log('status', status)
                console.log('result', result)
                // result即是对应的骑行路线数据信息,相关数据结构文档请参考  https://lbs.amap.com/api/javascript-api/reference/route-search#m_RidingResult
                if (status === 'complete') {
                    console.log('绘制骑行路线完成')
                    _this.initOpen = true//这里我是弄了一个路线展开和收起的样式
                    _this.togglePanel = true
                } else {
                    console.log('骑行路线数据查询失败')
                }
            });
        } catch (e) {
            console.log('路线报错', e)
        }
    })
},
//展开/收起路线列表
togglePanelFn() {
    this.togglePanel = !this.togglePanel
}

我换成移动端H5了,所以下面样式单位改成了rem,37.5换算。根据需求自行调整。

<style scoped>
    .mapContainer {
        width: 100%;
        height: 50rem;
        position: relative;
    }

    #container {
        padding: 0;
        margin: 0;
        width: 100%;
        height: 100%;
    }

    .panelWrap {
        /*width: 90%;*/
        height: 35rem;
        position: absolute;
        top: 0;
        right: 0;
        display: flex;
        justify-content: right;
    }

    #panel {
        width: 28rem;
        height: 100%;
        overflow-y: scroll;
    }

    .panelOpen {
        width: 3rem;
        height: 3rem;
        background: url("../assets/open.png") no-repeat;
        background-size: contain;
        transform: rotate(-90deg);
    }

    .searchWrap {
        width: 30rem;
        height: 4rem;
    }

    .searchPlace {
        width: 17rem;
        height: 2rem;
    }
</style>

这是我弄得一个展开收起的图片,方向需要自己调整。
在这里插入图片描述
可以用ip模式访问,在手机上浏览器里看效果。需要浏览器有定位权限。

如果需要用驾车/公交/步行等交通方式,将AMap.Riding替换成所需的构造函数,并调整参数即可。官方手册
如公交:AMap.Transfer,增加必填参数city:'郑州'
如驾车:AMap.Driving,没有额外参数
步行 AMap.Walking
骑行AMap.Riding
货车AMap.TruckDriving

Vue3使用高德地图输入地址自动标记地点,可以通过以下步骤来实现: 1. 首先,需要在项目中安装并引入高德地图JavaScript API。可以通过npm包管理器来安装高德地图的npm包。 2. 在Vue3项目中创建一个组件,例如`AMapComponent.vue`,在该组件中初始化高德地图,并注册地图的事件监听器。 3. 在组件中创建一个输入框,用户可以在其中输入地址信息。 4. 当用户输入地址后,可以利用高德地图提供的地址解析服务,将输入的地址信息转换为经纬度坐标。 5. 接收转换得到的经纬度坐标后,可以在地图上创建一个标记(Marker),并将其放置在对应的坐标点上。 6. 同时,也可以在地图上绘制一个覆盖物(如圆形覆盖物或信息窗口),显示更多地点的详细信息。 下面是一个简单的代码示例,展示了如何在Vue3组件中集成高德地图,并实现输入地址自动标记地点的功能: ```vue <template> <div id="map" style="width: 100%; height: 500px;"></div> <input type="text" v-model="address" placeholder="请输入地址" @input="geocodeAddress"> </template> <script> export default { data() { return { address: '', map: null, marker: null }; }, mounted() { this.initMap(); }, methods: { initMap() { // 初始化地图 this.map = new AMap.Map('map', { zoom: 10, center: [116.397428, 39.90923] // 初始中心点 }); }, geocodeAddress() { // 地址解析服务 AMap.service('AMap.Geocoder', () => { const geocoder = new AMap.Geocoder(); geocoder.getAddress([this.address], (status, result) => { if (status === 'complete' && result.info === 'OK') { const firstResult = result.regeocode.formattedAddress; const location = result.regeocode.location; if (this.marker) { this.marker.setPosition(location); } else { // 添加标记 this.marker = new AMap.Marker({ position: location, map: this.map }); } // 设置地图中心点 this.map.setCenter(location); } }); }); } } }; </script> <style> /* 样式可以根据需要进行调整 */ #map { width: 100%; height: 100%; } </style> ``` 需要注意的是,上述代码只是一个基本示例,实际使用时需要替换为有效的高德地图API密钥,并且可能需要进行进一步的异常处理和功能完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值