websocket实现GPS数据的实施推送与地图的展示

Posted 牛老师讲GIS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了websocket实现GPS数据的实施推送与地图的展示相关的知识,希望对你有一定的参考价值。

概述

实时展示GPS的数据是webgis中比较常见的一个需求,本文通过nodejs-websocket模拟GPS数据的更新,实现GPS数据的实施推送与地图数据的展示。

效果

实现

nodejs-websocket模拟数据

// websocket.js
// websocket.js
const ws = require('nodejs-websocket')

const createServer = () => 
    let server = ws.createServer(connection => 
        connection.on('text', function(result) 
            console.log('发送消息', result)
        )
        connection.on('connect', function(code) 
            console.log('开启连接', code)
        )
        connection.on('close', function(code) 
            console.log('关闭连接', code)
        )
        connection.on('error', function(code) 
            console.log('异常关闭', code)
        )
    )
    return server


module.exports = createServer()

// app.js
// 导入nodejs-websocket模块
const io = require('nodejs-websocket')
let connection = null
let gps = 

for (let i = 0; i < 200; i++) 
    gps['gps' + i] = 
        offset: randomNum(-0.2, 0.2)
    


// 执行websocket处理连接方法
io.createServer(con => 
    console.log('new connection...')
    connection = con
    sendData()
    //处理客户端发送过来的消息
    // connection.on("text",function(data)
    //     console.log("接收到的客户端消息:" + data);
    // )
    //监听关闭
    connection.on("close", function (code, reason) 
        console.log("Connection closed")
    )
    //监听异常
    connection.on("error",() => 
        console.log('服务异常关闭...')
    )
).listen(3000)

function sendData() 
    connection.sendText(getGpsPositions())
    setTimeout(sendData, 1000)


function getGpsPositions() 
    const [xmin, ymin, xmax, ymax] = [36.6324, 8.04789, 171.6324, 57.96]
    let data = []
    for (let k in gps) 
        const d = gps[k]
        let lon, lat
        if(!d.lon) 
            lon = randomNum(xmin, xmax)
            lat = randomNum(ymin, ymax)
         else 
            lon = d.lon + d.offset
            lat = d.lat + d.offset
        
        gps[k] = 
            lon: lon,
            lat: lat,
            offset: d.offset
        
        data.push(code: k, coords: [lon, lat])
    
    return JSON.stringify(data)


function randomNum(min, max)
    return Math.random() * (max - min) + min

webgis实现

const center = [104.1324, 36.92669]
var map = null, ws = null
var mapDom = document.getElementById('map')
fetch('../data/style.json').then(res => res.json()).then(res => 
    map = new mapboxgl.Map(
        accessToken: 'pk.eyJ1IjoibHp1bml1anAwOCIsImEiOiJjajJqcmlrMTYwMDI2MzJuaXd0NmRtZTl5In0.eMIg2fpiFaDInq2YVE4_2A',
        container: mapDom, // container ID
        style: res,
        center: center, // starting position [lng, lat]
        zoom: 3
    );

    map.on('load', () => 
        map.addSource('points', 
            type: 'geojson',
            data: getGeojson([])
        );
        map.addLayer(
            id: "circle",
            type: "circle",
            source: "points",
            paint: 
                "circle-color": 'red',
                "circle-radius": 4,
                "circle-stroke-color": 'white',
                "circle-stroke-width": 2
            
        );
        ws = new WebSocket("ws://localhost:3000")
        ws.onopen = function() 
           console.log("当前客户端已经连接到websocket服务器")
        
        ws.onmessage = function (evt) 
            const data = JSON.parse(evt.data)
            let features = data.map(d => 
                return 
                    "type":"Feature",
                    "properties": d,
                    "geometry":
                        "type":"Point",
                        "coordinates": d.coords
                    
                
            )
            map.getSource('points').setData(getGeojson(features))
        ;

        ws.onclose = function()
            alert("连接已关闭...");
        ;
    )
)

function getGeojson(features) 
    return  
        "type": "FeatureCollection",
        "features": features
    


以上是关于websocket实现GPS数据的实施推送与地图的展示的主要内容,如果未能解决你的问题,请参考以下文章

GPS转换百度地图坐标&websocket(stomp)实现动态打点

GPS 未针对您的平台实施 - Kivy / Plyer / PyCharm

websocket的消息推送只能固定在某一个页面吗?

Spring Boot 集成 WebSocket,轻松实现信息推送!

WebSocket与消息推送

WebSocket与消息推送