vue2 + mapbox 加载高德矢量地图. 并进行区域反遮照 CV可用

需求:加载高德矢量地图,根据区域编码查询区域边界,进行反遮照 并 自动定位至可视窗口的中间.

效果:

版本:vue2.x、mapbox-gl 3.4.0、@mapbox/mapbox-gl-language 1.0.1、turf 3.0.14


实现过程

// 老规矩 先装依赖
yarn add mapbox-gl@3.4.0
yarn add @mapbox/mapbox-gl-language
yarn add turf
<template>
    <div class="map_box">
        <div ref="map" class="map" id="map"></div>
    </div>
</template>

<script>
import maxboxMap from '@/utils/futureMap/futureMap.js'

export default {
    components: {},
    data() {
        return {
            map: null,
        }
    },
    methods: {
        handleInitMap() {
            let map = new maxboxMap({
                element: 'map',
                areaCode: 110000, // 北京的areaCode 区域反遮照要用. 可以根据需求进行替换
            })
        },
    },
    watch: {},

    mounted() {
        this.handleInitMap()
    },
}
</script>
// mapboxgl地图
import mapboxgl from 'mapbox-gl'
import 'mapbox-gl/dist/mapbox-gl.css'
import turf from 'turf'
// mapboxgl汉化
import MapboxLanguage from '@mapbox/mapbox-gl-language'

// 坐标系转化

const accessToken = '这个得自己申请一个'
// 地图操作 
class MapOperation {
    constructor(option) {
        this.line = null
        this.edit = null
        this.map = null
        this.element = option.element
        this.areaCode = option.areaCode
        this.initialize()
    }
    //初始化
    initialize() {
        mapboxgl.accessToken = accessToken
        this.map = new mapboxgl.Map({
            container: 'map',
            style: {
              version: 8,
              sources: {
                  'raster-tiles': {
                      type: 'raster',
                      tiles: [
                          // wprd0{1-4}
                          // scl=1&style=7 为矢量图(含路网和注记)
                          // scl=2&style=7 为矢量图(含路网但不含注记)
                          // scl=1&style=6 为影像底图(不含路网,不含注记)
                          // scl=2&style=6 为影像底图(不含路网、不含注记)
                          // scl=1&style=8 为影像路图(含路网,含注记)
                          // scl=2&style=8 为影像路网(含路网,不含注记)
                          'http://wprd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=7',
                      ],
                      tileSize: 256,
                  },
              },
              layers: [
                  {
                      id: 'simple-tiles',
                      type: 'raster',
                      source: 'raster-tiles',
                      minzoom: 0,
                      // "maxzoom": 18
                  },
              ],
            },
            // ...start,
            pitch: 0,
            bearing: 0,
            center: [116.405285, 39.904989],
            projection: 'globe', // 为 3D 地球
            antialias: false, //抗锯齿,通过false关闭提升性能
            maxZoom: 17,
            minZoom: 3,
        })
        //设置中文
        this.map.addControl(new MapboxLanguage({ defaultLanguage: 'zh-Hans' }))
        //添加导航控制条
        this.map.addControl(new mapboxgl.NavigationControl(), 'top-left')
        this.map.on('style.load', () => {
            // 飞往地点
            // this.flyTo(end, 12000)
        })
        this.map.on('load', () => {
            // 添加areaCode以外的遮照层
            this.handleAddMask()
        })
        this.map.on('click', e => {
         
        });

    }
    // 添加areaCode以外的遮照层 
    handleAddMask() {
        if (!this.areaCode) {
            return false
        }

        $.ajax({
            type: 'get',
            url: `https://geo.datav.aliyun.com/areas_v3/bound/${this.areaCode}.json`,
            success: res => {
                const bounds = res.features[0]
                const map = this.map
                // Zoom to the zoom level 8 with an animated transition
                console.log()
                const bbox = turf.bbox(res)
                // 调整地图视图到指定边界
                map.fitBounds(bbox, {
                    padding: 20, // 地图边界的内边距,单位为像素
                    // maxZoom: 12, // 地图视图的最大缩放级别
                    duration: 5000, // 动画持续时间,单位为毫秒
                })
                map.addLayer({
                    //蒙版边界
                    id: 'mb-line',
                    type: 'line',
                    source: {
                        type: 'geojson',
                        data: bounds, //区划的面数据
                    },
                    paint: {
                        'line-color': 'rgba(100, 149, 237, 0.6)',
                        'line-width': 1,
                    },
                    layout: {
                        visibility: 'visible',
                    },
                })

                map.addLayer({
                    //蒙版图层   //通过边界数据反选 达到挖洞效果
                    id: 'mb-tag',
                    type: 'fill',
                    source: {
                        type: 'geojson',
                        data: {
                            type: 'Feature',
                            geometry: {
                                type: 'Polygon',
                                coordinates: [
                                    [
                                        // 多边形外围 需要进行遮罩的点 这里是给世界地图加遮罩 所以是世界的四个端点
                                        [-180, 90],
                                        [180, 90],
                                        [180, -90],
                                        [-180, -90],
                                    ],
                                    bounds.geometry.coordinates[0][0],
                                ],
                            },
                        },
                    },
                    paint: {
                        'fill-color': 'rgba(40,59,92, 0.52)',
                        // 'fill-opacity': 1 /* 透明度 */,
                    },
                    layout: {
                        visibility: 'visible',
                    },
                })
            },
        })
    }
}
class Programmer extends MapOperation {
    constructor(option) {
        super(option); // 调用父类的构造函数
        this.sdMap ={
            map:this.map,
            createMarker:this.createMarker
        }
        this.meatureTool = null

    }
}
class maxboxMap extends Programmer {
    constructor(option) {
        super(option); // 调用父类的构造函数
    }
}


export default maxboxMap

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用MapboxGL和Vue3来加载高德地图实例。首先,确保你已经安装了MapboxGL和Vue3的依赖。 接下来,你可以创建一个Vue组件来加载地图。在这个组件中,你需要先引入MapboxGL和高德地图JavaScript库: ```javascript import mapboxgl from 'mapbox-gl'; import AMapLoader from '@amap/amap-jsapi-loader'; export default { mounted() { // 加载高德地图 AMapLoader.load({ key: 'your-amap-api-key', version: '2.0', plugins: ['AMap.Geocoder'] }).then(() => { // 初始化MapboxGL mapboxgl.accessToken = 'your-mapbox-access-token'; // 创建地图实例 const map = new mapboxgl.Map({ container: 'map', style: 'mapbox://styles/mapbox/streets-v11', center: [lng, lat], zoom: 12 }); // 在地图上添加高德地图瓦片图层 const amapLayer = new AMap.TileLayer(); map.addLayer(amapLayer); // 在地图上添加其他图层、标记等 // ... }); } } ``` 在上面的代码中,你需要替换`your-amap-api-key`为你的高德地图API密钥,以及`your-mapbox-access-token`为你的Mapbox访问令牌。你还可以根据需要设置地图的中心点和缩放级别。 最后,将地图容器添加到你的Vue模板中: ```html <template> <div id="map"></div> </template> <script> import mapComponent from '@/components/MapComponent.vue'; export default { components: { mapComponent } } </script> ``` 通过这种方式,你可以在Vue组件中使用MapboxGL和高德地图加载地图实例。记得替换你的API密钥和访问令牌,以及根据需要自定义地图样式和添加其他图层。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值