地图选点(百度地图web端)

百度地图的地图选点组件

一、介绍

地图选点指的是可在地图上搜索指定位置,获取到经纬度,或者通过点击地图上的某个位置,获取到详细的中文地址和经纬度。腾讯地图和高德地图都有官方的已封装好的组件可直接调用,但百度地图我研究了下,安卓和ios移动端系统是有封装好的组件,但web端的要自己通过各种api方式来实现,所以在网上大概找了一个封装比较简单全面的。

请添加图片描述

二、代码

1、需要注册百度地图账号,然后在控制台生成应用,获取到密钥ak,然后在public——index.html页面引入地图
<script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&type=webgl&ak=您的密钥"></script>
2、在components下创建一个Baidu-map.js组件
<template>
    <el-dialog title="位置选择" :visible.sync="openMap" width="900px" append-to-body>
        <el-form label-width="80px">
            <el-row>
                <el-col :span="10">
                    <el-form-item label="搜索地址">
                        <el-input size="mini" type="text" id="searchAddres" v-model="searchAddresKeywords"
                            placeholder="请输入地点">
                        </el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="14">
                    <el-form-item label="当前地址">
                        <el-input placeholder="请输入内容" v-model="addressInfo.address">
                            <template
                                slot="prepend">{{addressInfo.province}}{{addressInfo.city}}{{addressInfo.district}}</template>
                        </el-input>
                    </el-form-item>
                </el-col>
            </el-row>
        </el-form>
        <div id="baidu-map-container" style="width: 100%; height: 400px;"></div>

        <div slot="footer" class="dialog-footer">
            <el-button type="primary" @click="confirmSelect">确 定</el-button>
            <el-button @click="cancel">取 消</el-button>
        </div>
    </el-dialog>
</template>

<script>
    export default {
        data() {
            return {
                searchAddresKeywords: "",
                addressInfo: {
                    // 地址信息
                    longitude: "", // 经度
                    latitude: "", // 纬度
                    province: "", // 省
                    city: "", // 市
                    district: "", // 区
                    address: "", // 详细地址
                },
                openMap: false,
            };
        },
        methods: {
            // 初始化百度地图
            initBaiduMap() {
                let that = this;
                this.$nextTick(function () {
                    /** 初始化地图Start */
                    var map = new BMapGL.Map("baidu-map-container"); // 创建地图实例
                    var point = new BMapGL.Point(116.404, 39.915); // 设置中心点坐标
                    map.centerAndZoom(point, 13); // 地图初始化,同时设置地图展示级别
                    map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
                    /** 初始化地图End */

                    /** 点击地图创建坐标事件Start */
                    // 添加地图点击事件
                    map.addEventListener("click", function (e) {
                        var clickpt = e.latlng; // 点击的坐标
                        map.clearOverlays(); // 移除地图上的标注
                        var marker = new BMapGL.Marker(clickpt); // 创建标注
                        map.addOverlay(marker); // 将标注添加到地图中
                        // 逆地址解析
                        that.geocAddress(clickpt);
                    });
                    /** 点击地图创建坐标事件End */

                    /** 搜索地址Start */
                    // 建立一个自动完成的对象
                    var ac = new BMapGL.Autocomplete({
                        input: "searchAddres",
                        location: map,
                    });
                    // 鼠标点击下拉列表后的事件
                    ac.addEventListener("onconfirm", function (e) {
                        map.clearOverlays(); // 移除地图上的标注
                        var local = new BMapGL.LocalSearch(map, {
                            //智能搜索
                            onSearchComplete: function (results) {
                                let poi = results.getPoi(0); //获取第一个智能搜索的结果
                                var searchpt = poi.point; // 获取坐标
                                map.centerAndZoom(searchpt, 16);
                                map.addOverlay(new BMapGL.Marker(searchpt)); //添加标注
                                that.geocAddress(searchpt); // 逆地址解析
                            },
                        });
                        // 搜索词
                        var searchValue = e.item.value;
                        local.search(
                            searchValue.province +
                            searchValue.city +
                            searchValue.district +
                            searchValue.street +
                            searchValue.business
                        );
                    });
                    /** 搜索地址End */
                });
            },

            /** 逆向解析地址 point */
            geocAddress(point) {
                let that = this;
                var geoc = new BMapGL.Geocoder();
                geoc.getLocation(point, function (geocInfo) {
                    // 设置基本信息
                    var addressInfo = geocInfo.addressComponents;
                    that.addressInfo.longitude = point.lng;
                    that.addressInfo.latitude = point.lat;
                    that.addressInfo.province = addressInfo.province;
                    that.addressInfo.city = addressInfo.city;
                    that.addressInfo.district = addressInfo.district;
                    let address = addressInfo.street + addressInfo.streetNumber;
                    if (geocInfo.surroundingPois.length > 0) {
                        address = address + geocInfo.surroundingPois[0].title;
                    }
                    that.addressInfo.address = address;
                });
            },

            /** 打开地图选择 */
            show() {
                this.openMap = true;
                this.initBaiduMap();
            },

            /**
             * 确认选择
             */
            confirmSelect() {
                this.$emit("confirmMapAddress", this.addressInfo);
                this.openMap = false;
            },

            /**
             * 取消选择
             */
            cancel() {
                this.openMap = false;
            }
        },
    };

</script>

<style lang="scss">
    // 防止地图自动完成的对象被遮挡
    .tangram-suggestion {
        z-index: 9999;
    }

</style>

3、在需要调用的页面引入组件
<baidu-map ref="bmapAddressSelect" @confirmMapAddress="confirmMapAddress"></baidu-map>
/** 显示地图 */
showMap() {
    this.$refs.bmapAddressSelect.show()
},
 /** 确认地图地址 */
confirmMapAddress(addressInfo) {
   console.log(addressInfo) // 获取到选点的地址和经纬度
}
4、总结

组件按步骤一步一步引入即可直接使用,但我这里使用的是new BMapGL,如果你的版本是3.0的话,搜索还可以正常使用,但是选点就会有问题,需要改一下组件Baidu-map.js的这一段代码

map.addEventListener("click", function (e) {
   var clickpt = e.latlng; // 点击的坐标
   map.clearOverlays(); // 移除地图上的标注
   var marker = new BMapGL.Marker(clickpt); // 创建标注
   map.addOverlay(marker); // 将标注添加到地图中
   // 逆地址解析
   that.geocAddress(clickpt);
});

将e.latlng更改成e.point即可正常使用!

如果有讲错的地方,欢迎指出,大家一起交流学习!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值