【发布时间】:2018-11-16 01:31:03
【问题描述】:
我正在使用 vue 并安装了 vue-mapbox 组件,位于:https://soal.github.io/vue-mapbox/#/quickstart
我已将 js 和 css 更新到最新版本,也添加到 index.html:
<!-- Mapbox GL CSS -->
<link href="https://api.tiles.mapbox.com/mapbox-gl-js/v0.51.0/mapbox-gl.css" rel="stylesheet" />
<!-- Mapbox GL JS -->
<script src="https://api.tiles.mapbox.com/mapbox-gl-js/v0.51.0/mapbox-gl.js"></script>
我正在尝试使用此组件来设置地图边界的默认视图,使用 center 或 bounds 或 fitBounds 到 Lng,Lat 坐标列表。那么,基本上,如何插入 lng、lat 坐标并让地图默认将这些坐标居中在容器内?
这是我创建的一个组件,在 vue 中称为 Map,用于使用上面列出的组件 vue-mapbox 输出地图框:
<template>
<b-row id="map" class="d-flex justify-content-center align-items-center my-2">
<b-col cols="24" id="map-holder" v-bind:class="getMapType">
<mgl-map
id="map-obj"
:accessToken="accessToken"
:mapStyle.sync="mapStyle"
:zoom="zoom"
:center="center"
container="map-holder"
:interactive="interactive"
@load="loadMap"
ref="mapbox" />
</b-col>
</b-row>
</template>
<script>
import { MglMap } from 'vue-mapbox'
export default {
components: {
MglMap
},
data () {
return {
accessToken: 'pk.eyJ1Ijoic29sb2dob3N0IiwiYSI6ImNqb2htbmpwNjA0aG8zcWxjc3IzOGI1ejcifQ.nGL4NwbJYffJpjOiBL-Zpg',
mapStyle: 'mapbox://styles/mapbox/streets-v9', // options: basic-v9, streets-v9, bright-v9, light-v9, dark-v9, satellite-v9
zoom: 9,
map: {}, // Holds the Map...
fitBounds: [[-79, 43], [-73, 45]]
}
},
props: {
interactive: {
default: true
},
resizeMap: {
default: false
},
mapType: {
default: ''
},
center: {
type: Array,
default: function () { return [4.899, 52.372] }
}
},
computed: {
getMapType () {
let classes = 'inner-map'
if (this.mapType !== '') {
classes += ' map-' + this.mapType
}
return classes
}
},
watch: {
resizeMap (val) {
if (val) {
this.$nextTick(() => this.$refs.mapbox.resize())
}
},
fitBounds (val) {
if (this.fitBounds.length) {
this.MoveMapCoords()
}
}
},
methods: {
loadMap () {
if (this.map === null) {
this.map = event.map // store the map object in here...
}
},
MoveMapCoords () {
this.$refs.mapbox.fitBounds(this.fitBounds)
}
}
}
</script>
<style lang="scss" scoped>
@import '../../styles/custom.scss';
#map {
#map-obj {
text-align: justify;
width: 100%;
}
#map-holder {
&.map-modal {
#map-obj {
height: 340px;
}
}
&.map-large {
#map-obj {
height: 500px;
}
}
}
.mapboxgl-map {
border: 2px solid lightgray;
}
}
</style>
所以,我在这里尝试使用fitBounds 方法来让地图以 2 Lng 为中心进行初始化,这里的纬度坐标:[[-79, 43], [-73, 45]]
如何做到这一点?好的,我想我的代码可能有点错误,所以我认为 fitBounds 应该看起来像这样:
fitBounds: () => {
return { bounds: [[-79, 43], [-73, 45]] }
}
无论如何,将地图框的初始位置设置为以 2 个或更多坐标为中心是最困难的。有人成功了吗?
好的,所以我最终创建了一个过滤器来为 bbox 添加空间,如下所示:
Vue.filter('addSpaceToBBoxBounds', function (value) {
if (value && value.length) {
var boxArea = []
for (var b = 0, len = value.length; b < len; b++) {
boxArea.push(b > 1 ? value[b] + 2 : value[b] - 2)
}
return boxArea
}
return value
})
目前看来这已经足够了。而不是像这样使用它:
let line = turf.lineString(this.markers)
mapOptions['bounds'] = this.$options.filters.addSpaceToBBoxBounds(turf.bbox(line))
return mapOptions
【问题讨论】:
标签: javascript vuejs2 mapbox-gl-js