美文网首页
Vue集成百度地图bmap

Vue集成百度地图bmap

作者: 马小帅mm | 来源:发表于2018-10-26 11:41 被阅读0次

需求:vue中常常用到在弹框里显示百度地图,并根据定位坐标给地图创建标注,创建围栏等。以下代码的一些ui使用的是element-ui框架

1.引入对应的百度地图css, js文件

<!--百度map key-->
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=ESaDPCg7kmtxOLL5NGKHkA4sspxasyXG"></script>
<!--画图,多边形-->
<link rel="stylesheet" href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css" />
<script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
<!--点聚合-->
<script type="text/javascript" src="/public/plugins/bmap/TextIconOverlay.js"></script>
<script type="text/javascript" src="/public/plugins/bmap/MarkerClusterer.js"></script>

2.在Vue中将百度地图弹框定义成一个map组件

Vue.component('baidu-map', {
    template: '<div v-show="dialogBaidu"><div  class="v-modal" tabindex="0" style="z-index: 122;"></div>'+
    '<div class="el-dialog__wrapper" style="z-index: 1000;">'+
    '    <div class="el-dialog" style="margin-top: 15vh;">'+
    '       <div class="el-dialog__header">'+
    '            <span class="el-dialog__title ">{{title}}</span>'+
    '            <button type="button " @click="dialogBaidu=false;" aria-label="Close" class="el-dialog__headerbtn"><i class="el-dialog__close el-icon el-icon-close"></i></button>'+
    '       </div>'+
    '       <div class="el-dialog__body">'+
    '            <div id="baidumap" style="height: 500px;"></div>'+
    '        </div>'+
    '        <div class="el-dialog__footer">'+
    '            <div class="dialog-footer">'+
    '                <button type="button " @click="dialogBaidu=false;" class="el-button el-button--primary">'+
    '                    <span>关闭</span>'+
    '                </button>'+
    '            </div>'+
    '        </div>'+
    '    </div>'+
    '</div></div>',
    data: function () {
        return {
            MAP: null,
        }
    },
    props: {
        title: '',//弹框标题
        lat: { //主定位点经度
            type: String,
            default: ''
        },
        lng: { //主定位点纬度
            type: String,
            default: ''
        },
        icon: { //主定位点标注的Icon图片
            required: false,
            type: String,
            default: '/public/image/person_point.png'
        }, 
        showdialog: { // 是否显示弹框 true显示 false不显示
            type: Boolean,
            default: false
        },
        gpsArea: {//围栏集合
            required: false,
            type: Array,
            default: function () {
                return [];
            }
        }, 
        markerIcon:  { //标注集合icon图片
            required: false,
            type: String,
            default: '/public/image/greencar.png'
        },
        markerPoints: {
            //标注集合 [{'longitude': '114.02597366', 'latitude': '22.54605355'}]
            required: false,
            type: Array,
            default: function () {
                return [];
            }
        }
    },
    computed: {
        'dialogBaidu': {
            get: function () {
                var self = this;
                if (self.showdialog) {
                    //地图定位
                    self.theLocation();
                }
                return self.showdialog;
            },
            set: function (value) {
                this.$parent.showdialog = value;
            }
        }
        
    },
    mounted: function () {
        var self = this,
        map = null;
        map = new BMap.Map("baidumap"); // 创建Map实例
        self.MAP = map;
        map.centerAndZoom(new BMap.Point(114.02597366, 22.54605355), 15); // 初始化地图,设置中心点坐标和地图级别
        map.setCurrentCity("深圳"); // 设置地图显示的城市 此项是必须设置的
        map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
        
    },
    methods: {
        // 编写自定义函数,创建标注
        createMarker: function (car, markerIcon) {
            var self = this;
            var marker = null;
            var new_point = new BMap.Point(car.longitude, car.latitude);
            if (markerIcon) {
                var myIcon = new BMap.Icon(markerIcon, new BMap.Size(35, 35), {
                    imageOffset: new BMap.Size(0, 0)
                });
                marker = new BMap.Marker(new_point, { icon: myIcon });
            } else {
                marker = new BMap.Marker(new_point);
            }
            
            marker.setZIndex(-999);
            return marker;
        },
        // 定位网点
        theLocation: function() {
            var self = this,
                map = self.MAP,
                //传过来的坐标需要去掉P 替换成.  比如114P02597366变成114.02597366
                lat = (self.lat || '').replace(/P/g, '.'),
                lng = (self.lng || '').replace(/P/g, '.'),
                gpsArea = self.gpsArea, //网点坐标
                markerIcon = self.markerIcon,
                icon = self.icon;
            
            var arr = [];  // 取值坐标地址
            
            setTimeout(function () {
                if (lat && lng) {
                    map.clearOverlays();
                    var marker = self.createMarker({'longitude': lng, 'latitude': lat}, icon);
                    map.panTo(new BMap.Point(lng, lat));
                    map.addOverlay(marker); // 将标注添加到地图中
                }

                //创建点集合
                var markers = self.markerPoints.map(function (place, index) {
                    return self.createMarker(place, markerIcon);
                });
                var markerClusterer = new BMapLib.MarkerClusterer(map, {
                    markers: markers,
                    girdSize: 100,
                    maxZoom: 15,
                    minClusterSize: 100
                });

                //创建围栏
                if(gpsArea.length && gpsArea.length>0){
                    var poi = new BMap.Point(gpsArea[0]['lng'], gpsArea[0]['lat']);
                    map.centerAndZoom(poi, 18);
                }
                if(gpsArea){
                    gpsArea.forEach(item => {
                        arr.push(new BMap.Point(item.lng, item.lat));
                    });
                }
                if((arr instanceof Array) && arr.length > 0){
                    var polygon = new BMap.Polygon(arr, {strokeColor:"blue", strokeWeight:2, strokeOpacity:0.5, strokeZIndex: 900});  //创建多边形
                    map.addOverlay(polygon);   //增加多边形
                    polygon.enableEditing();
                }

            }, 500);
            
        },
    }
});

3.页面引用组件,并传入对应的参数

<el-button @click="theLocation({'latitude':detailData.car_latitude,'longitude':detailData.car_longitude,'icon': '/public/image/car_point.png','gps_area':car_parking_area })" type="success" >显示百度地图弹框</el-button>
<!-- baidu map 显示组件  前四个参数必填 -->
    <baidu-map 
        title="定位信息" 
        :lat="lat"
        :lng="lng"
        :showdialog="showdialog" 
        :icon="icon" 
        :gps-area="gps_area"
        :marker-icon="'/public/image/place.png'"
        :marker-points="near_places">
    </baidu-map>

4.点击按钮,显示弹框

// js
theLocation: function(row) {
    var self = this;
    //vue中坐标的传递需要去掉. 替换成P  比如114.02597366变成114P02597366
    self.lat = row.latitude.replace(/\./g, 'P'),
    self.lng = row.longitude.replace(/\./g, 'P'),
    self.gps_area = row.gps_area, //网点坐标
    self.icon = row.icon;
    self.showdialog = true;
},

相关文章

网友评论

      本文标题:Vue集成百度地图bmap

      本文链接:https://www.haomeiwen.com/subject/vqektqtx.html