PostgreSQL + NodeJS 实现矢量瓦片服务
目录1.数据准备2.NodeJS 实现1瓦片范围计算2根据x,y,获取瓦片3.前端调用1leaflet 调用2mapbox 调用1.数据准备2.NodeJS 实现1瓦片范围计算class CalculateVectorTile { /** * 瓦片获得范围 * **/ tile2boundingBox(x, y, zoom) { let bb {}; bb.maxY this.tile2lat(y, zoom); bb.minY this.tile2lat(y 1, zoom); bb.minX this.tile2lon(x, zoom); bb.maxX this.tile2lon(x 1, zoom); return bb; } /** * 瓦片转换经度 * **/ tile2lon(x, z) { return (x / Math.pow(2.0, z)) * 360.0 - 180; } /** *瓦片转换纬度 * param y * param z * return */ tile2lat(y, z) { let n Math.PI - (2.0 * Math.PI * y) / Math.pow(2.0, z); return (180 * Math.atan(Math.sinh(n))) / Math.PI; } } module.exports CalculateVectorTile;2根据x,y,z获取瓦片function getTiles(x, y, z) { let bb calculateVectorTile.tile2boundingBox(x, y, z); return new Promise((resolve, reject) { pgConnection.connect(function (err, connection) { if (err) { reject(err); } else { let sql SELECT ST_AsMVT (tile, points) tile FROM (SELECT st_asmvtgeom (t.geom, st_makeenvelope (${bb.minX},${bb.minY},${bb.maxX},${bb.maxY},4326),4326,0, TRUE ) AS geom FROM public.${tableName} t ) AS tile WHERE tile.geom IS NOT NULL ; connection.query(sql, (err, rows) { if (err) { reject(err); } else { resolve(rows); } // 结束会话 connection.release(); }); } }); }); } /** * 获取瓦片 */ router.get(/getTiles, async (req, res) { const { x, y, z } req.query; let points []; points await getTiles(x * 1, y * 1, z * 1); res.send(points.rows[0].tile); });3.前端调用1leaflet 调用!DOCTYPE html html langen head meta charsetUTF-8 / meta http-equivX-UA-Compatible contentIEedge / meta nameviewport contentwidthdevice-width, initial-scale1.0 / titleleafletTile/title link relstylesheet hrefhttps://unpkg.com/leaflet1.7.1/dist/leaflet.css / script srchttps://unpkg.com/leaflet1.7.1/dist/leaflet.js/script script srchttps://unpkg.com/leaflet.vectorgridlatest/dist/Leaflet.VectorGrid.js/script style body { margin: 0; padding: 0; } #map { position: absolute; top: 0; bottom: 0; width: 100%; } /style /head body div idmap/div script let map L.map(map, { preferCanvas: true, renderer: L.canvas({ padding: 0.1 }), }).setView([30.52086429364361, 119.84249877929689], 6); // 添加背景图层 L.tileLayer(https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png, { attribution: copy; a hrefhttps://www.openstreetmap.org/copyrightOpenStreetMap/a contributors, }).addTo(map); const vectorGridLayer (url, options) { let layerOptions options || {}; let vectorTileLayerStyles {}; layerOptions.renderFactory layerOptions.renderFactory ? layerOptions.renderFactory : L.canvas.tile; vectorTileLayerStyles[layerOptions.layerName] options.vectorTileLayerStyles; layerOptions.vectorTileLayerStyles vectorTileLayerStyles; let layer L.vectorGrid.protobuf(url, layerOptions); return { layer: layer, }; }; function getVectorTileLayer() { let url http://localhost:8888/tiles/getTiles?x{x}y{y}z{z}; let localVectorTileOptions { renderFactory: L.canvas.tile, layerName: points, vectorTileLayerStyles: function (feature, zoom) { let weight 0; return { weight: 1, color: #10fd00, fillColor: #10fd00, fillOpacity: 1, radius: 1, }; }, }; let vectorLayer vectorGridLayer(url, localVectorTileOptions); return vectorLayer; } let vectorTileLayer getVectorTileLayer(); map.addLayer(vectorTileLayer.layer); /script /body /html效果2mapbox 调用!DOCTYPE html html head meta charsetutf-8 / titleAdd a third party vector tile source/title meta nameviewport contentinitial-scale1,maximum-scale1,user-scalableno / script src../js/mapbox-gl-v2.3.0.js/script link href../js/mapbox-gl-v2.3.0.css relstylesheet / style body { margin: 0; padding: 0; } #map { position: absolute; top: 0; bottom: 0; width: 100%; } /style /head body div idmap/div script mapboxgl.accessToken pk...; var tileset mapbox.streets; var map new mapboxgl.Map({ container: map, zoom: 6, center: [119.898625809072612, 29.106708155556731], style: mapbox://styles/mapbox/light-v9, hash: false, }); map.on(load, function loaded() { map.addSource(custom-go-vector-tile-source, { type: vector, tiles: [http://localhost:8888/tiles/getTiles?x{x}y{y}z{z}], }); map.addLayer({ id: custom-go-vector-tile-layer, type: circle, source: custom-go-vector-tile-source, source-layer: points, paint: { circle-radius: 2, circle-color: #10fd00, circle-opacity: 1, }, }); }); /script /body /html效果

相关新闻

呆啵宠物:5分钟快速上手,打造你的专属桌面伙伴终极指南

呆啵宠物:5分钟快速上手,打造你的专属桌面伙伴终极指南

呆啵宠物:5分钟快速上手,打造你的专属桌面伙伴终极指南 【免费下载链接】DyberPet Desktop Cyber Pet Framework based on PySide6 项目地址: https://gitcode.com/GitHub_Trending/dy/DyberPet 你是否厌倦了单调的桌面环境?是否渴望一…

2026/7/15 13:58:33阅读更多 →
BP神经网络预测matlab代码讲解与实现步骤

BP神经网络预测matlab代码讲解与实现步骤

文章目录1. BP神经网络的简介和结构参数1.1 BP神经网络的结构组成1.2 BP神经网络训练界面的参数解读2. 实现BP网络预测的步骤3. matlab代码编写4. BP代码运行结果4.1 预测值和真实值的误差计算(MAE、MSE、MRSE)4.2 BP网络训练的性能分析图像5. 结语6. BP…

2026/7/15 13:58:33阅读更多 →
如何快速上手 Prisma DBML Generator:从 Prisma Schema 到 ER 图的完整指南

如何快速上手 Prisma DBML Generator:从 Prisma Schema 到 ER 图的完整指南

如何快速上手 Prisma DBML Generator:从 Prisma Schema 到 ER 图的完整指南 【免费下载链接】prisma-dbml-generator Prisma DBML Generator 项目地址: https://gitcode.com/gh_mirrors/pr/prisma-dbml-generator 想要将你的 Prisma Schema 快速转换为直观的…

2026/7/15 13:58:33阅读更多 →
募资295亿,估值2-4万亿!长鑫科技上市,“造富”员工却引加班争议

募资295亿,估值2-4万亿!长鑫科技上市,“造富”员工却引加班争议

295亿募资,长鑫科技开启科创板申购 7月16日,长鑫科技将正式开启科创板新股申购,此次计划募资295亿元,是今年A股募资规模最大、科创板历史第二大IPO项目,仅次于中芯国际。市场对其估值预期在2万亿到3万亿元,…

2026/7/15 15:04:13阅读更多 →
从单体到微服务的演进:Java外卖霸王餐系统的服务拆分边界与通信协议选型

从单体到微服务的演进:Java外卖霸王餐系统的服务拆分边界与通信协议选型

从单体到微服务的演进:Java外卖霸王餐系统的服务拆分边界与通信协议选型 当外卖霸王餐CPS(Cost Per Sale)业务从日订单量几百增长到数万时,最初那个“小而美”的单体Java应用往往会迅速演变成难以维护的“巨石”。代码耦合、数据库…

2026/7/15 15:04:13阅读更多 →
android-性能-分析

android-性能-分析

以下是Android性能分析的完整指南,涵盖核心工具、优化方向及实操方法,适用于2025年开发环境: ⚙️ 一、性能分析工具分类 1. 官方工具链 工具用途关键能力版本适配Android Profiler实时监测CPU/内存/网络/能耗火焰图分析、内存泄漏检测&…

2026/7/15 15:04:13阅读更多 →
Java开发中对外卖API接口超时时间的动态配置与自适应调整机制实现

Java开发中对外卖API接口超时时间的动态配置与自适应调整机制实现

Java开发中对外卖API接口超时时间的动态配置与自适应调整机制实现 在对接外卖CPS(Cost Per Sale)业务时,API调用的稳定性直接决定了订单转化率与佣金结算的准确性。其中,HTTP请求的超时时间配置是一个看似简单却极易引发线上故障的…

2026/7/15 15:04:13阅读更多 →
Dism++:Windows系统终极优化工具免费开源指南

Dism++:Windows系统终极优化工具免费开源指南

Dism:Windows系统终极优化工具免费开源指南 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language 还在为Windows系统越来越慢而烦恼吗?Dism正是…

2026/7/15 15:04:13阅读更多 →
CANN/asc-devkit TPipe重置函数

CANN/asc-devkit TPipe重置函数

Reset 产品支持情况产品 是否支持 Ascend 950PR/Ascend 950DT √ Atlas A3 训练系列产品/Atlas A3 推理系列产品 √ Atlas A2 训练系列产品/Atlas A2 推理系列产品 √ Atlas 200I/500 A2 推理产品 √ Atlas 推理系列产品AI Core √ Atlas 推理系列产品Vector Core x Atlas 训练…

2026/7/15 14:59:13阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/15 6:42:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/15 6:12:45阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/15 10:54:00阅读更多 →
AI框架决定企业AI能走多远

AI框架决定企业AI能走多远

企业AI建设的第一性原理 企业搞AI,最关键的决定是什么?不是选哪家大模型,不是先做哪个场景,不是招多少AI人才——而是选哪个AI开发框架。 为什么?因为框架决定了企业AI能力的"天花板"。选对了框架&#xff0…

2026/7/15 0:01:30阅读更多 →
Java企业为什么需要AI框架

Java企业为什么需要AI框架

Java企业在AI时代的尴尬处境 Java是全球企业级应用开发的主流语言——全球超过一半的企业系统跑在Java上。但在AI浪潮面前,很多Java企业感到尴尬:大模型的接口是各种语言的,AI开发社区以其他语言为主流,似乎Java在AI时代"掉队…

2026/7/15 0:01:30阅读更多 →
CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

1. 项目概述:为什么需要关注CC3230x的SD主机、定时器与低功耗?在物联网和嵌入式设备开发领域,我们常常面临一个核心矛盾:设备需要具备强大的连接能力、可靠的数据存储和实时控制功能,同时又必须严格控制功耗以延长电池…

2026/7/15 0:01:30阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/14 15:07:30阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/15 8:52:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/15 14:06:23阅读更多 →