百万级别矢量数据动态切片,这个方法很实用

对于矢量数据的渲染显示,一般是以geojson的方式加载,或者直接以shp的形式解析加载,不管那种方法,对于少量的数据显示还可以满足要求,但是面对百万级别的数据量,直接加载显示的话,会造成严重的卡顿,甚至卡死。这里介绍一种动态切片的方法,轻松加载百万级别的矢量数据。
用到的工具有:postgis + openlayers + springboot
用到的数据有:100万条点数据

数据准备

首先将数据导入到数据库,我这里使用的是测试数据,java连接数据库生成了包括经纬度和时间、类型、UUID等字段的矢量点数据,总共100万条。在后续渲染加载中,通过ptype字段设置不同的点颜色。
在这里插入图片描述
使用postgis根据参数对数据进行切片。使用到的方法为 st_asmvt这个方法返回的是mvt格式的切片数据,以二进制数据流的方式返回。
在这里插入图片描述
在这里插入图片描述
其中 st_makeenvelope(118, 30, 120, 32)是切片的范围。在前端是通过XYZ将要切片的行列和级别转换为经纬度,在这里使用。
这样根据返回的二进制数据流,通过一个后端服务传递到前端。

后端服务

后端服务我才用了springboot,主要就是接收二进制数据流,返回给前端。这里具体是通过前端的XYZ参数,将其转换为经纬度,以此为筛选条件,调用切片函数进行切片。
GET方法接收前端请求

    @GetMapping("reqstream")
    public byte[] getTileReqStream(@RequestParam("x") String x, @RequestParam("y") String y, @RequestParam("z") String z, HttpServletResponse response) throws IOException {
        x = x.replace(".pbf", "");
        y = y.replace(".pbf", "");
        z = z.replace(".pbf", "");
        //原始流数据
        byte[] b1 = tileReqService.getTileReqStream(x, y, z);
        return b1;
    }

将XYZ转换为经纬度,切片

    @Override
    public byte[] getTileReqStream(String x, String y, String z) {
        double [] lonlat = xyz2lonlat(Double.parseDouble(x), Double.parseDouble(y), Double.parseDouble(z));
        double [] lonlat1 = xyz2lonlat(Double.parseDouble(x) + 0.5, Double.parseDouble(y) + 0.5, Double.parseDouble(z));
        List<TileReq> tileReqs = tileReqMapper.getTileReqStream(lonlat[0], lonlat[1], lonlat1[0], lonlat1[1]);
        TileReq tileReq = tileReqs.get(0);
        byte[] s = tileReq.getMvt();
        return s;
    }

    public double[] xyz2lonlat(double x, double y, double z){
        double [] lonlat = {0, 0};
        double n = Math.pow(2, z);
        double lon_deg = (x / n) * 360.0 - 180.0;
        double lat_rad = Math.atan(Math.sinh(Math.PI * (1 - (2 * y) / n)));
        double lat_deg = (180 * lat_rad) / Math.PI;
        lonlat[0] = lon_deg;
        lonlat[1] = lat_deg;
        return lonlat;
    }

前端openlayers加载

前端使用openlayers进行加载渲染。根据字段ptype设置点的颜色。

let vtLayer = new VectorTileLayer({
            source: new VectorTileSource({
                format: new MVT(),
                url: "http://localhost:10001/tile/reqstream?z={z}&x={x}&y={y}.pbf",
            }),
            style: (evt) => {
                let type = evt.properties_.ptype;
                let style = null;
                switch (type) {
                    case 1:
                        style = styleList[0];
                        break;
                    case 2:
                        style = styleList[1];
                        break;
                    case 3:
                        style = styleList[2];
                        break;
                    case 4:
                        style = styleList[3];
                        break;
                    case 5:
                        style = styleList[4];
                        break;
                    case 6:
                        style = styleList[5];
                        break;
                    case 7:
                        style = styleList[6];
                        break;
                    case 8:
                        style = styleList[7];
                        break;
                    case 9:
                        style = styleList[8];
                        break;
                    case 10:
                        style = styleList[9];
                        break;
                }
                return style;
            },
        });

显示

在这里插入图片描述

走马看黄花
关注 关注
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
GIS 矢量切片(Vector Tile)-地图定制化的时代已经悄悄来临
研究与专注
12-09 3万+
前言 切片技术的简单介绍,以及传统栅格图片切片的不足 现在最流行的地图底图技术是栅格切片底图,它们本质上是将空间数据分别渲染为不同缩放级别的地图图片,然后将各个级别的图片按照一定规则切分,按照一定的 “规则组织”,存储到硬盘或数据库中,构成一幅完整的地图。 图1 切片概念图相对于其他技术,切片地图有其优越性,例如有效减少了传输数据体积,多级缩放等。然而,栅格地图也有一些短处,缺乏实时性,数据完
PostGIS-Dynamic-Vector-Tile:Node + PostGIS 动态矢量切片服务(Node + PostGIS dynamic vector tile service)
05-09
PostGIS-Dynamic-Vector-Tile Node + PostGIS 动态矢量切片服务 | Node + PostGIS dynamic vector tile service 基于 Node + PostGIS 实现地图数据的动态矢量切片服务。 项目目录结构如下: |-- bin |-- www |-- model |-- pgConfig.js // 数据库配置文件 |-- spatial.js // 矢量切片业务逻辑 |-- public |-- images |-- javascripts |-- stylesheets |-- routes |-- index.js // 路由 |-- views |-- error.pug |-- index.pug |-- layout.pug |
矢量数据的一种分层动态组织方法
10-31
提出矢量数据分层组织的一种动态结构,在该结构中,单点、单字符或符号作为基元,以属性串组织基元,并分层叠置。采用区别于链式结构的动态通用串结构及c语言予以实现
基于PG与PostGIS搭建实时矢量瓦片服务
热门推荐
小刘的博客
05-31 1万+
基于PG与PostGIS搭建实时矢量切片服务矢量切片(MVT)什么是MVT矢量切片优势实时矢量切片为什么要有实时矢量切片PostGIS中矢量切片相关函数实战写在最后 在PG相关分享上已经分享过两次关于PG与PostGIS做实时矢量切片这块的内容了。这次写几篇博客来分享这块的知识。 矢量切片(MVT) 本文中提到的矢量切片为Mapbox Vector Tile格式,简称MVT。 什么是MVT 矢量切片优势 实时矢量切片 为什么要有实时矢量切片 PostGIS中矢量切片相关函数 实战 写在最后 .
Python基础学习之数据切片
最新发布
qq_45212655的博客
04-20 730
数据切片介绍: 切片的基本语法是data[start:stop:step],其中: start 是切片开始的索引(包括该索引处的元素)。 stop 是切片结束的索引(不包括该索引处的元素)。 step 是切片的步长,决定了每次移动多少个元素。 示例 numbers = [10, 20, 30, 40, 50, 60, 70] subsequence = numbers[1:5] print(subsequence) # 输出: [20, 30, 40, 50]
矢量切片简介及前端加载
Mapmost的博客
03-13 975
一文读懂在WebGIS系统中的切片服务
GIS动态矢量切片(MVT——MapBox Vector Tile)
Birds-Frags's Blog
04-01 8093
GIS动态矢量切片 前言 有关矢量切片以及MVT(MapBox Vector Tile)自行搜索了解,不再赘述。 接口格式 http://domain:port/map/vector/tile/{z}/{x}/{y},其中z代表缩放层级,x、y代表当前行列号 一、方法 采用postgis的函数ST_AsMVT、ST_AsMVTGeom、ST_TileEnvelope函数,实现此功能。 简单讲 ST_TileEnvelope 函数用于计算行列并返回对应的矩形范围,ST_AsMVTGeom返回图层中对应行
js数组 数据量大进行切片重组
全易
08-11 189
比如10个为一段
快速而轻量级的 PostGIS 矢量切片服务器
06-28
马丁Martin 是一款适用于大型数据库的PostGIS矢量切片服务器。Martin 是使用Actix Web 框架用Rust编写的。要求安装用法应用程序接口与 Mapbox GL JS 一起使用与传单一起使用与deck.gl 一起使用表源表源列表表源 TileJSON表源瓷砖函数源函数源列表函数源 TileJSON函数源磁贴命令行界面环境变量配置文件与 Docker 一起使用与 Docker Compose 一起使用与 Nginx 一起使用从源头构建调试发展要求Martin 需要 PostGIS >= 2.4.0。安装您可以从Github 发布页面下载 martin。平台 下载(最新) Linux 64 位 苹果系统 64 位 视窗 64 位 如果您使用的是 macOS 和Homebrew ,则可以使用 Homebrew tap 安装 martin。brew tap urbica/tap brew install martin你也可以使用官方的 Docker 镜像docker run -p 3000:3000 -e DATABASE_URL=postgres://[email pro
矢量切片综述2
GIS串串香
12-21 3978
简述本文翻译自Esri的博客,博客中对Esri矢量切片计划进行了简介,从这篇博客中我们也可以看出Esri对于矢量切片的态度是积极的。正文在Esri的国际用户大会上,公开了准备在ArcGIS平台上引入矢量切片地图的计划。我们的web端、移动端和online平台共同努力提供丰富的、可交互的以及自定义的地图,通过最新的webGIS技术。点击我们的矢量切片基础底图和一个动态样式的例子。为什么选择矢量切片数字
网络地理信息系统中空间矢量数据自动采集方法
01-13
传统的采集方法在采集...为检测方法效果,与传统方法进行实验对比,结果表明,研究的采集方法不需要人工操作,就可以自动完成网络地理信息中空间矢量数据的采集,采集速度快、效率高,具有很强的操作意义,值得推广。
2019年最新全国行政区划省市区县级别矢量数据.shp格式)
03-11
2019年最新的全国行政区划省市区县级别,矢量数据(shp格式)。已将2019年变更的行政区划进行更新,方便大家下载使用。数据属性齐全,属性表中数据的名称均有,属性名称没有乱码。亲测可以使用。
全球海岸线矢量shape数据
06-02
全球海岸线矢量shape数据全球海岸线矢量shape数据全球海岸线矢量shape数据全球海岸线矢量shape数据全球海岸线矢量shape数据全球海岸线矢量shape数据全球海岸线矢量shape数据全球海岸线矢量shape数据全球海岸线矢量...
使用pandas对矢量化数据进行替换处理的方法
01-20
使用pandas处理向量化的数据,进行数据的替换时不仅仅能够进行字符串的替换也能够处理数字。 做简单的示例如下: In [4]: data = Series(range(5)) In [5]: data Out[5]: 0 0 1 1 2 2 3 3 4 4 dtype: int64 In ...
前端如何处理大数据
A_lamp的博客
07-22 4146
前端优化
Postgis动态矢量瓦片前后端部署指南
weixin_57664381的博客
12-25 2421
webgis最近随着智慧城市、数字孪生等项目大火,成为当下非常热门的技术。mapbox提出的矢量瓦片技术,解决的B/S端在面对大体量gis数据时的前端的渲染压力。使得前端地图在面对百万级的数据量依旧游刃有余,甚至比在C端上的浏览还要丝滑。动态矢量瓦片技术,解决了矢量存储在数据库中的实时动态更新,以及不再需要使用离线工具对矢量进行本地切片发布的问题
新一代切片技术:矢量切片!你会做吗?
中科GIS地理信息培训
05-24 432
被组织到矢量切片的图层(比如道路、水、区域),每一层都有包含几何图形和可变属性的独立要素(例如姓名、类型等等)。通俗的说,就是将矢量数据以建立金字塔的方式,像栅格切片那样分割成一个一个描述性文件,以GeoJson格式或者以pbf等自定义格式组织,然后在前端根据显示需要按需请求不同的矢量瓦片数据进行Web绘图。不同于栅格切片矢量切片能够适应显示设备的分辨率,并可以改变样式以用于多种用途。同一套数据的展示在不同的需求下可能需要不同的样式(例如,白天和夜间模式),对于传统栅格切片需要重新进行切片
postgis mvt矢量切片 django drf mapboxgl
LEILEI18A的博客
08-02 1928
postgis mvt矢量切片 django drf mapboxgl
全国行政区划省市区县级别(矢量数据.shp格式)
08-18
全国行政区划省市区县级别矢量数据通常以.shp(shapefile)格式提供。这种格式是一种矢量数据存储的标准文件格式,可用于地理信息系统(GIS)软件中进行数据分析和可视化处理。 全国行政区划矢量数据按照不同行政级别可以分为省、市、区、县四个层级。省级行政区划是中国行政区划的最高级别,全国共有34个省级行政区,包括23个省、5个自治区、4个直辖市和2个特别行政区。 在省级行政区下,市级行政区划隶属于省级行政区,中国共有333个市级行政区,包括市辖区和县级城市。市辖区通常是直辖市的行政区划单位,如北京市、上海市等。县级城市是指不隶属于任何市级行政单位的城市,全国共有296个县级城市。 在市级行政区下,区县级行政区划是最细粒度的行政单位。全国共有2850个区县级行政区,大多数是县、市辖区和自治县,也包括一些特殊行政区划单位,如县级市。 全国行政区划省市区县级别矢量数据的.shp文件通常包含了各个行政区划的边界线、地理坐标和属性信息等。这些数据可以用于制作地图、进行区域分析、统计人口等各种地理信息分析和空间决策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

最新评论

  • 导航卫星系统实时可视化平台开发

    走马看黄花: 没了,笔记本硬盘坏了,全没了表情包表情包表情包

  • 导航卫星系统实时可视化平台开发

    A.my: 你好,这个源码可供学习吗

  • 导航卫星系统实时可视化平台开发

    走马看黄花: 源码笔记本硬盘坏了,数据代码全没了表情包表情包表情包,数据来源是国外的一个gnss数据中心上定时获取的

  • 导航卫星系统实时可视化平台开发

    weixin_44760517: 你好,有部分源码学习吗,想根据这个做一个C#的版本,想问问具体的数据来源和参数来源

  • 百万级别矢量数据动态切片,这个方法很实用

    wenlc丶: Uncaught TypeError: Cannot read properties of undefined (reading 'ol_uid')

大家在看

  • 【python】python海底捞门店营业数据分析与可视化(数据集+源码+论文)【独一无二】
  • 实训项目代码开发环境搭建
  • 科学计算库Numpy库(2.数组之间的运算)
  • Postman接口测试工具详解
  • 诚寻创业技术合伙人

最新文章

  • Python 获取谷歌切片数据,在cesium上加载
  • 使用pyQt5和matplotlib绘制图表
  • Cesium 设置视角的两种方式
2022年8篇
2021年7篇
2020年6篇

目录

目录

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司坪地推广网站双龙网站搭建观澜企业网站建设丹竹头seo排名观澜百度竞价包年推广坂田网站推广系统坪山百度网站优化南澳网站设计坪地网站优化按天扣费沙井网络推广大浪网络广告推广平湖seo排名塘坑外贸网站设计福田百度网站优化排名布吉推广网站松岗企业网站建设大运企业网站改版荷坳关键词按天计费民治百搜词包双龙关键词排名大浪关键词按天收费坂田seo排名坪地阿里店铺运营龙华网站制作设计南联网站推广方案南联SEO按天收费同乐网络推广荷坳网站推广沙井阿里店铺托管观澜网站优化按天计费歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化