diff --git a/webapp/pages/map.vue b/webapp/pages/map.vue
index b792135c7..f55dba49f 100644
--- a/webapp/pages/map.vue
+++ b/webapp/pages/map.vue
@@ -21,7 +21,7 @@
:max-pitch="60"
@load="onMapLoad"
>
-
+
{{ style.title }}
-
+
-
@@ -70,8 +48,6 @@
import mapboxgl from 'mapbox-gl'
import MapboxGeocoder from '@mapbox/mapbox-gl-geocoder'
import '@mapbox/mapbox-gl-geocoder/dist/mapbox-gl-geocoder.css'
-// Wolle: import myImage from '../assets/mapbox/marker-icons/mapbox-marker-icon-blue.svg'
-// import myImage from '~/assets/mapbox/marker-icons/mapbox-marker-icon-20px-blue.png'
// import MapboxLanguage from '@mapbox/mapbox-gl-language'
import { objectValuesToArray } from '../utils/utils'
import { mapGetters } from 'vuex'
@@ -95,11 +71,8 @@ export default {
users: null,
groups: null,
markers: {
- array: [],
+ geoJSON: [],
isAdded: false,
- isCurrentUserAdded: false,
- isUsersAdded: false,
- isGroupsAdded: false,
isImagesAdded: false,
},
}
@@ -109,7 +82,7 @@ export default {
this.currentUserCoordinates = this.currentUserLocation
? this.getCoordinates(this.currentUserLocation)
: null
- this.addMissingMarkers()
+ this.addMarkersOnCheckPrepared()
},
computed: {
...mapGetters({
@@ -160,6 +133,7 @@ export default {
methods: {
onMapLoad({ map }) {
this.map = map
+
// // documentation of correct version: https://github.com/mapbox/mapbox-gl-language/tree/v0.10.0
// // Add RTL support if you want to support Arabic
// // Wolle: does not work yet
@@ -176,143 +150,132 @@ export default {
// // console.log('this.language: ', this.language)
// // is unclear, how to
// // this.language.setLanguage('de') // makes error
+
+ // add search field for locations
this.map.addControl(
new MapboxGeocoder({
accessToken: this.$env.MAPBOX_TOKEN,
mapboxgl: this.mapboxgl,
}),
)
- this.map.loadImage(
- // 'https://docs.mapbox.com/mapbox-gl-js/assets/cat.png',
- // 'https://docs.mapbox.com/mapbox-gl-js/assets/custom_marker.png',
- 'img/mapbox/marker-icons/mapbox-marker-icon-20px-blue.png',
- // 'img/mapbox/marker-icons/mapbox-marker-icon-blue.svg', // SVG is not supported is the error
- // myImage,
- (error, image) => {
- // console.log('cat: ', image, error)
- console.log('custom-marker: ', image, error)
- if (error) throw error
-
- // Add the image to the map style.
- // this.map.addImage('cat', image)
- this.map.addImage('custom-marker', image)
- this.markers.isImagesAdded = true
- this.addMissingMarkers()
+ // load markers
+ const markers = [
+ {
+ id: 'marker-blue',
+ name: 'mapbox-marker-icon-20px-blue.png',
},
- )
- // const image = new Image(35, 35);
- // image.src = myImage;
- // this.map.addImage('custom-marker', image);
- // this.markers.isImagesAdded = true
- // this.addMissingMarkers()
-
- // Wolle: this.mapFlyToCenter()
- // this.addMissingMarkers()
+ {
+ id: 'marker-red',
+ name: 'mapbox-marker-icon-20px-red.png',
+ },
+ {
+ id: 'marker-green',
+ name: 'mapbox-marker-icon-20px-green.png',
+ },
+ ]
+ Promise.all(
+ markers.map(
+ (marker) =>
+ new Promise((resolve, reject) => {
+ // our images have to be in the 'static/img/*' folder otherwise they are not reachable via URL
+ map.loadImage('img/mapbox/marker-icons/' + marker.name, (error, image) => {
+ if (error) throw error
+ map.addImage(marker.id, image)
+ resolve()
+ })
+ }),
+ ),
+ ).then(() => {
+ this.markers.isImagesAdded = true
+ this.addMarkersOnCheckPrepared()
+ })
},
setStyle(url) {
this.map.setStyle(url)
this.activeStyle = url
},
- addMissingMarkers() {
+ addMarkersOnCheckPrepared() {
if (
- // Wolle: !this.isReadyToAddMarkers
- // &&
!this.markers.isAdded &&
this.map &&
this.markers.isImagesAdded &&
this.currentUser &&
this.users &&
this.groups
- // Wolle: && !(
- // // this.markers.isCurrentUserAdded
- // // && this.markers.isUsersAdded
- // // && this.markers.isGroupsAdded
- // )
) {
- // if (!this.markers.isCurrentUserAdded && this.currentUserCoordinates) {
- // this.markers.array.push(new mapboxgl.Marker())
- // this.markers.array[this.markers.array.length - 1]
- // .setLngLat(this.currentUserCoordinates)
- // .addTo(this.map)
- // this.markers.isCurrentUserAdded = true
- // }
- if (!this.markers.isCurrentUserAdded && this.currentUserCoordinates) {
- // this.markers.array.push(new mapboxgl.Marker())
- // this.markers.array[this.markers.array.length - 1]
- // .setLngLat(this.currentUserCoordinates)
- // .addTo(this.map)
- console.log('this.markers.isImagesAdded: ', this.markers.isImagesAdded)
- this.map.addSource('markers', {
- type: 'geojson',
- data: {
- type: 'FeatureCollection',
- features: [
- {
- type: 'Feature',
- properties: {
- type: 'theUser',
- title: this.currentUser.name,
- },
- geometry: {
- type: 'Point',
- coordinates: this.currentUserCoordinates,
- },
- },
- ],
+ // add marker for "currentUser"
+ if (this.currentUserCoordinates) {
+ this.markers.geoJSON.push({
+ type: 'Feature',
+ properties: {
+ type: 'the-user',
+ iconName: 'marker-blue',
+ title: this.currentUser.name,
+ },
+ geometry: {
+ type: 'Point',
+ coordinates: this.currentUserCoordinates,
},
})
- this.map.addLayer({
- id: 'markers',
- type: 'symbol',
- source: 'markers',
- layout: {
- // 'icon-image': 'cat',
- 'icon-image': 'custom-marker',
- 'icon-size': 1.0,
- // get the title name from the source's "title" property
- 'text-field': ['get', 'title'],
- 'text-font': ['Open Sans Semibold', 'Arial Unicode MS Bold'],
- // 'text-offset': [0, 1.25],
- 'text-offset': [0, 0],
- 'text-anchor': 'top',
- },
- })
- this.markers.isCurrentUserAdded = true
}
- // if (!this.markers.isUsersAdded && this.currentUser && this.users) {
- // this.users.forEach((user, index) => {
- // if (user.id !== this.currentUser.id && user.location) {
- // this.markers.array.push(
- // new mapboxgl.Marker({
- // // Wolle: coordinates: this.getCoordinates(user.location),
- // scale: 0.75,
- // color: 'blue',
- // }),
- // )
- // this.markers.array[this.markers.array.length - 1]
- // .setLngLat(this.getCoordinates(user.location))
- // .addTo(this.map)
- // }
- // })
- // this.markers.isUsersAdded = true
- // }
- // if (!this.markers.isGroupsAdded && this.groups) {
- // this.groups.forEach((group, index) => {
- // if (group.location) {
- // this.markers.array.push(
- // new mapboxgl.Marker({
- // // Wolle: coordinates: this.getCoordinates(group.location),
- // scale: 0.75,
- // color: 'green',
- // }),
- // )
- // this.markers.array[this.markers.array.length - 1]
- // .setLngLat(this.getCoordinates(group.location))
- // .addTo(this.map)
- // }
- // })
- // this.markers.isGroupsAdded = true
- // }
+ // add markers for "users"
+ this.users.forEach((user) => {
+ if (user.id !== this.currentUser.id && user.location) {
+ this.markers.geoJSON.push({
+ type: 'Feature',
+ properties: {
+ type: 'user',
+ iconName: 'marker-red',
+ title: user.name,
+ },
+ geometry: {
+ type: 'Point',
+ coordinates: this.getCoordinates(user.location),
+ },
+ })
+ }
+ })
+ // add markers for "groups"
+ this.groups.forEach((group) => {
+ if (group.location) {
+ this.markers.geoJSON.push({
+ type: 'Feature',
+ properties: {
+ type: 'group',
+ iconName: 'marker-green',
+ title: group.name,
+ },
+ geometry: {
+ type: 'Point',
+ coordinates: this.getCoordinates(group.location),
+ },
+ })
+ }
+ })
+
+ // add source and layer
+ this.map.addSource('markers', {
+ type: 'geojson',
+ data: {
+ type: 'FeatureCollection',
+ features: this.markers.geoJSON,
+ },
+ })
+ this.map.addLayer({
+ id: 'markers',
+ type: 'symbol',
+ source: 'markers',
+ layout: {
+ // get the "icon-image" from the source's "iconName" property
+ 'icon-image': ['get', 'iconName'],
+ 'icon-size': 1.0,
+ // get the "text-field" from the source's "title" property
+ 'text-field': ['get', 'title'],
+ 'text-font': ['Open Sans Semibold', 'Arial Unicode MS Bold'],
+ 'text-offset': [0, 0],
+ 'text-anchor': 'top',
+ },
+ })
this.markers.isAdded = true
@@ -360,7 +323,7 @@ export default {
},
update({ User }) {
this.users = User
- this.addMissingMarkers()
+ this.addMarkersOnCheckPrepared()
},
fetchPolicy: 'cache-and-network',
},
@@ -373,7 +336,7 @@ export default {
},
update({ Group }) {
this.groups = Group
- this.addMissingMarkers()
+ this.addMarkersOnCheckPrepared()
},
fetchPolicy: 'cache-and-network',
},
diff --git a/webapp/static/img/mapbox/marker-icons/README.md b/webapp/static/img/mapbox/marker-icons/README.md
index ed89ebe82..1dd83f969 100644
--- a/webapp/static/img/mapbox/marker-icons/README.md
+++ b/webapp/static/img/mapbox/marker-icons/README.md
@@ -9,4 +9,4 @@ At URL:
## Folder For Images Reachable By URL
It looks like that not all folders, as example the `assets/*` folder, is reachable by URL.
-Or images have to be in the `static/img/*` folder.
+Our images have to be in the `static/img/*` folder.