前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >websocket实现GPS数据的实施推送与地图的展示

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

作者头像
lzugis
发布2022-04-28 08:29:16
6700
发布2022-04-28 08:29:16
举报

概述

实时展示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
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 效果
  • 实现
    • nodejs-websocket模拟数据
      • webgis实现
      相关产品与服务
      图数据库 KonisGraph
      图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档