postgis mvt矢量切片 django drf mapboxgl

postgis mvt矢量切片 django drf mapboxgl

目录

0.前提

1.sql代码

[2.django drf后端服务代码](#2.django drf后端服务代码)

3.具体的应用(整体代码)

4.参考


0.前提

1\] 静态的矢量切片可以采用 tippecanoe 生成,nginx代理,这种数据是不更新的; \[2\] 动态的矢量切片,一般采用postgis生成。基本上矢量切片80%的厂商都采用postgis,确实好用!不谈商业的。 \[3\] postgis矢量切片使用到的函数:**[ST_AsMVT](https://postgis.net/docs/manual-3.0/ST_AsMVT.html "ST_AsMVT")、[ST_AsMVTGeom](https://postgis.net/docs/manual-3.0/ST_AsMVTGeom.html "ST_AsMVTGeom")、[ST_TileEnvelope](https://postgis.net/docs/manual-3.0/ST_TileEnvelope.html "ST_TileEnvelope")、[ST_Transform](https://postgis.net/docs/manual-3.0/ST_Transform.html "ST_Transform")、[ST_Intersects](https://postgis.net/docs/manual-3.0/ST_Intersects.html "ST_Intersects")、[ST_SRID](https://postgis.net/docs/manual-3.0/ST_SRID.html "ST_SRID")。(点击查看每个函数的介绍,都是官网文档,很详细)** \[4\] postgis api参考文档官网:[Official Manual \| PostGIS](https://postgis.net/documentation/manual/ "Official Manual | PostGIS"),有postgis3.0版本以上的,点击html,点击[8. PostGIS Reference](https://postgis.net/docs/manual-3.0/reference.html "8. PostGIS Reference"),即可查看矢量处理的函数。 ![](https://file.jishuzhan.net/article/1687077854279372802/b6d328c3aa6747149768fcaad229e7f1.png) \[5\] 矢量切片mvt,需要坐标为EPSG:3857,如果想用mvt这种开源的标准,就使用ST_Transform统一转换成这个坐标。然后入库的数据都设置成EPSG:4326。 ## 1.sql代码 \[1\] 获取表的字段名称:(zzz替换成传入的表名)【PS:不建议动态查询将1-2结合,不好】 select column_name from information_schema.columns where table_name='zzz'; \[2\] 动态获取矢量切片: (1.0.0)替换成传入的z,x,y参数,zzz替换成传入的表名,geom替换成geom几何对应的字段名称。 ```sql with mvtgeom as ( select ST_AsMVTGeom(ST_Transform(geom, 3857), ST_TileEnvelope(1,0,0)) as geom, gid from zzz, (select ST_SRID(geom) as srid from zzz where geom is not null limit 1) a where ST_Intersects(geom, ST_Transform(ST_TileEnvelope(1,0,0), srid)) ) select ST_AsMVT(mvtgeom.*, 'zzz', 4096, 'geom') as mvt from mvtgeom; ``` ## 2.django drf后端服务代码 基于APIView重写get函数,再注册到urls.py中 前端访问 ip/\`table_name\`/\`z\`/\`x\`/\`y\`,eg:http://127.0.0.1:8080/getmap/zzz/2/1/1 这样就可以接收矢量切片mvt了。 ```python from django.db import connection from rest_framework.views import APIView from rest_framework.response import Response class MapView(APIView): def get(self, request, table, z, x, y): print(table, z, x, y,) table_name = table #'zzz' # 将数据库的数据导出为geojson(建议不要太大,太大用 wms服务吧、或者mvt矢量切片) # sql = f"""select json_build_object('type', 'FeatureCollection', 'name', '{table_name}', 'features', json_agg(ST_ASGeoJSON(t.*)::json)) from {table_name} AS t """ # 获取表的字段名称 列表 # sql = f"""select column_name from information_schema.columns where table_name='{table_name}'""" # where后面是string 不应被转成对象变量 # 获取表的字段名称 字符串 # sql = f"""select array_to_string(array(select column_name from information_schema.columns where table_name='{table_name}' and column_name != 'geom'), ',');""" # 动态矢量切片mvt gid字段也可替换成前端传入的字段 geom_name = 'geom' sql = f"""with mvtgeom as ( select ST_AsMVTGeom(ST_Transform({geom_name}, 3857), ST_TileEnvelope({z},{x},{y})) as geom, gid from {table_name}, (select ST_SRID({geom_name}) as srid from {table_name} where {geom_name} is not null limit 1) a where ST_Intersects({geom_name}, ST_Transform(ST_TileEnvelope({z},{x},{y}), srid)) ) select ST_AsMVT(mvtgeom.*, '{table_name}', 4096, 'geom') as mvt from mvtgeom;""" print(sql) with connection.cursor() as cursor: cursor.execute(sql) results = cursor.fetchall() return Response(results) ``` ## 3.具体的应用(整体代码) TODO \[1\] shp、geojson前端上传,后端对数据进行校验(校验坐标系-强制4326、等),然后再采用后端代码将shp、geojson导入postgres数据库中。 \[2\] jwt、permission等 \[3\] 前端如何加jwt等信息 请求数据 ## 4.参考 \[1\] 参考了这个项目的sql代码(比国内很多博客写的强太多,如果不考虑权限等,就是部署个后端、数据库,手动导入shp数据,那么直接用这个开源项目即可,前端采用mapboxgl类似的开源库加载,api访问部署后的**localhost:3000即可查看** ):[https://github.com/tobinbradley/dirt-simple-postgis-http-api/blob/master/routes/mvt.js](https://github.com/tobinbradley/dirt-simple-postgis-http-api/blob/master/routes/mvt.js "https://github.com/tobinbradley/dirt-simple-postgis-http-api/blob/master/routes/mvt.js")

相关推荐
IT策士6 小时前
Django 从 0 到 1 打造完整电商平台:Admin 后台管理与数据初始化
数据库·django·sqlite
Languorous.8 小时前
Linux 登录用户、主机名、提示符详解(新手不迷路)
linux·数据库·postgresql
IT策士9 小时前
Django 从 0 到 1 打造完整电商平台:Django 模型进阶与数据迁移
python·django·sqlite
张~颜11 小时前
PostgreSQL复制槽
数据库·postgresql
l1t13 小时前
DeepSeek总结的PostgreSQL 19 Beta 的四个特性
数据库·postgresql
丷丩13 小时前
01. 开篇:为什么我们需要轻量级 MVT 服务?
typescript·gis·mvt·geoai
IT策士1 天前
Django 从 0 到 1 打造完整电商平台:为什么用 Django 做电商?
后端·python·django
l1t1 天前
DeepSeek总结的从 Crunchy PGO 迁移到使用 CloudNativePG 管理的 PostgreSQL 18
数据库·postgresql
zzzzzz3101 天前
VGGT-Ω 深度解读:用 30% 显存训练 15 倍数据,牛津&Meta 的 3D 视觉大一统之路
django
gerrywhu1 天前
PostGIS实现栅格数据合并—影像拼接、镶嵌【ST_Union】
postgis·栅格数据分析·影像镶嵌·栅格合并·st_union·影像拼接