Vue местоположение в режиме реального времени поделиться на карте - PullRequest
0 голосов
/ 22 сентября 2019

В настоящее время я работаю над приложением, в котором вы должны видеть всех подключенных пользователей, включая себя.Вы видите пользователя (местоположение) с серыми точками, а сама точка оранжевая.

Вы также должны иметь возможность «пометить» местоположение, это местоположение сохраняется в базе данных sqlite, а также совместно используется всеми подключеннымиклиенты, которые отображаются на карте.

Теперь дело в том, что я много пробовал, но, похоже, ничего не работает.Я использую следующие плагины:

dependencies

Код, который я пытался использовать, выглядит следующим образом:

<template>
    <div>
        <mapbox
            access-token="[REMOVED]"
            :map-options="{
                style: 'mapbox://styles/mapbox/streets-v10',
                center: [0.0, 0.0],
                zoom: 15,
            }"
            :geolocate-control="{
                show: true,
                position: 'top-right',
            }"
            @map-load="loaded"
            @geolocate-error="geolocateError"
            @geolocate-geolocate="geolocate"
        />
        <button class="btn btn-contained btn-success add-location" v-on:click="addLocation"><span>Button</span></button>
    </div>

</template>

<script>
    import Mapbox from 'mapbox-gl-vue'

    export default {
        components: { Mapbox },
        props: {
            currLat: Number,
            currLon: Number,
            allPoints: Array
        },
        // Mounted (page load), we ask to track
        mounted: function () {
            const options = {
                enableHighAccuracy: true
            };
            this.$watchLocation(options)
                .then(coordinates => {
                    // Set the center to my coordinates
                    this.currLat = coordinates.lat;
                    this.currLon = coordinates.lng;
                    // Emit the user data to all connected devices.
                    this.$socket.emit('USER_COORDS', {
                        'user': this.$socket.id,
                        'lat': this.currLat,
                        'lon': this.currLon
                    });
                });
        },
        methods: {
            loaded(map) {
                map.addLayer({
                    id: 'points',
                    type: 'symbol',
                    source: {
                        type: 'geojson',
                        data: {
                            type: 'FeatureCollection',
                            features: [

                                {
                                    type: 'Feature',
                                    geometry: {
                                        type: 'Point',
                                        coordinates: [0.0,0.0],
                                    },
                                    properties: {
                                        title: 'VKc',
                                        icon: 'triangle',
                                    },
                                },

                            ],
                        },
                    },
                    layout: {
                        'icon-image': '{icon}-15',
                        'text-field': '{title}',
                        'text-offset': [0, 0.6],
                        'text-anchor': 'top',
                    },
                });
            },
            geolocateError(control, positionError) {
            console.log(positionError);
            Latte.ui.notification.create({
              title: "An error occurred!",
              message: "We could not get your location, please try again by reloading the application."
            });
            },
            geolocate(control, position) {
                console.log(
                    `User position: ${position.coords.latitude}, ${position.coords.longitude}`
                )
              },
            addLocation: function() {
                this.$socket.emit('NEW_LOCATION', {
                    name: 'VK1',
                    lat: this.currLat,
                    lon: this.currLon
                });
            }
        },
        sockets: {
            USER_COORDS_DATA: function (data) {
                // user connects, data of the current location gets emitted

                // console.log(data)
            },
            NEW_LOCATION_DATA: function (data) {
                // Returned data from the server (after storage)
                console.log(data)
            },
        },
    }
</script>

<style>
    @import '../../node_modules/mapbox-gl/dist/mapbox-gl.css';
    #map {
        width: 100%;
        height: calc(100vh - var(--app-bar-height));
    }
    .btn.add-location {
        position: absolute;
        left: 2rem;
        bottom: 2rem;
    }
</style>

Этот результатв следующем представлении:

Result

(кнопка нуждается в стилизации, но здесь это не проблема)

В спине у меня естьработает сервер узлов, который в настоящее время просто прослушивает сообщения и отправляет их обратно (io.emit()), поэтому все пользователи должны получить это обновление.

Как я могу сделать то, что я описал выше?Приложение, которое отображает всех подключенных пользователей, себя в другом цвете, с возможностью сохранения местоположений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...