Skip to content

Commit

Permalink
working prototype v-mapbox
Browse files Browse the repository at this point in the history
  • Loading branch information
ulfgebhardt committed Jan 4, 2023
1 parent bb30d88 commit be41815
Show file tree
Hide file tree
Showing 5 changed files with 371 additions and 4 deletions.
6 changes: 6 additions & 0 deletions webapp/nuxt.config.js
Expand Up @@ -126,6 +126,7 @@ export default {
{ src: '~/plugins/vue-filters.js' },
{ src: '~/plugins/vue-infinite-loading.js', ssr: false },
{ src: '~/plugins/vue-observe-visibility.js', ssr: false },
{ src: '~/plugins/v-mapbox.js', mode: "client" },
],

router: {
Expand Down Expand Up @@ -155,6 +156,11 @@ export default {
'@nuxtjs/pwa',
],

buildModules: [
// https://composition-api.nuxtjs.org/getting-started/setup#quick-start
"@nuxtjs/composition-api/module"
],

/*
** Axios module configuration
*/
Expand Down
3 changes: 3 additions & 0 deletions webapp/package.json
Expand Up @@ -40,6 +40,7 @@
"intersection-observer": "^0.12.0",
"jsonwebtoken": "~8.5.1",
"linkify-it": "~3.0.2",
"mapbox-gl": "1.13.2",
"node-fetch": "^2.6.1",
"nuxt": "~2.12.1",
"nuxt-dropzone": "^1.0.4",
Expand All @@ -50,6 +51,7 @@
"tiptap": "~1.26.6",
"tiptap-extensions": "~1.28.8",
"trunc-html": "^1.1.2",
"v-mapbox": "^1.11.2",
"v-tooltip": "~2.1.3",
"validator": "^13.0.0",
"vue-count-to": "~1.0.13",
Expand All @@ -67,6 +69,7 @@
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/preset-env": "~7.9.0",
"@faker-js/faker": "5.1.0",
"@nuxtjs/composition-api": "0.33.1",
"@storybook/addon-a11y": "^6.3.6",
"@storybook/addon-actions": "^5.3.21",
"@storybook/addon-notes": "^5.3.18",
Expand Down
103 changes: 103 additions & 0 deletions webapp/pages/map.vue
@@ -0,0 +1,103 @@
<!-- Example Reference: https://codesandbox.io/s/v-mapbox-with-nuxt-lbrt6?file=/pages/index.vue -->
<template>
<client-only>
<mgl-map
:mapbox-gl="mapboxgl"
:access-token="mapOptions.accessToken"
:map-style.sync="mapOptions.style"
:center="mapOptions.center"
:zoom="mapOptions.zoom"
:max-zoom="mapOptions.maxZoom"
:cross-source-collisions="false"
:fail-if-major-performance-caveat="false"
:preserve-drawing-buffer="true"
:hash="false"
:min-pitch="0"
:max-pitch="60"
@load="onMapLoad"
>
<!-- TODO: Move into mapboxgl-control-container -->
<div class="map-controls">
<ds-button
v-for="style in styles.available"
:key="style.title"
filled
size="small"
:primary="mapOptions.style === style.url ? true : false"
@click="setStyle(style.url)"
>
{{ style.title }}
</ds-button>
</div>
</mgl-map>
</client-only>
</template>
<script>
import mapboxgl from "mapbox-gl";
export default {
name: "Map",
data() {
return {
mapboxgl,
mapOptions: {
accessToken:
"pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g", // ocelot-token
style: "mapbox://styles/mapbox/outdoors-v12?optimize=true",
center: [10.452764, 51.165707], // center of Germany
zoom: 4,
maxZoom: 22,
},
styles: {
// https://docs.mapbox.com/api/maps/styles/
available: [
{
title: "Outdoors",
url: "mapbox://styles/mapbox/outdoors-v12?optimize=true",
},
{
title: "Streets",
url: "mapbox://styles/mapbox/streets-v11?optimize=true",
},
{
title: "Satellite",
url: "mapbox://styles/mapbox/satellite-streets-v11?optimize=true",
},
{
title: "Dark",
url: "mapbox://styles/mapbox/dark-v10?optimize=true",
},
],
},
};
},
methods: {
onMapLoad({ map }) {
this.map = map;
},
setStyle(url) {
this.map.setStyle(url)
this.mapOptions.style = url
},
},
};
</script>

<style lang="scss">
.mapboxgl-canvas {
height: 70vh;
}
.map-controls {
position: absolute;
left: 50px;
top: 100px;
}
.map-controls button {
margin-left: 5px;
}
.mapboxgl-control-container {
margin-top: -45px;
}
.mapboxgl-control-container a {
color: black;
}
</style>
25 changes: 25 additions & 0 deletions webapp/plugins/v-mapbox.js
@@ -0,0 +1,25 @@
// Vue2 + Mapbox Reference: https://github.com/geospoc/v-mapbox/issues/702
import Vue from "vue";
import {
MglGeojsonLayer,
MglVectorLayer,
MglMap,
MglMarker,
MglPopup,
MglScaleControl,
} from "v-mapbox";

// Map
Vue.component("MglMap", MglMap);

// Controls
Vue.component("MglScaleControl", MglScaleControl);

// Layers
Vue.component("MglGeojsonLayer", MglGeojsonLayer);
Vue.component("MglVectorLayer", MglVectorLayer);

// Marker & Popup
Vue.component("MglMarker", MglMarker);
Vue.component("MglPopup", MglPopup);

0 comments on commit be41815

Please sign in to comment.