postgis mvt矢量切片 django drf mapboxgl

postgis mvt矢量切片 django drf mapboxgl

目录

0.前提

1.sql代码

2.django drf后端服务代码

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

4.参考


0.前提

        [1] 静态的矢量切片可以采用 tippecanoe 生成,nginx代理,这种数据是不更新的;

        [2] 动态的矢量切片,一般采用postgis生成。基本上矢量切片80%的厂商都采用postgis,确实好用!不谈商业的。

        [3] postgis矢量切片使用到的函数:ST_AsMVTST_AsMVTGeomST_TileEnvelopeST_TransformST_IntersectsST_SRID。(点击查看每个函数的介绍,都是官网文档,很详细)

        [4] postgis api参考文档官网:Official Manual | PostGIS,有postgis3.0版本以上的,点击html,点击8. PostGIS Reference,即可查看矢量处理的函数。        

        [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几何对应的字段名称。       

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了。

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GDAL(Geospatial Data Abstraction Library)是一个开源库,可用于处理地理空间数据。而Mapbox Vector Tiles(MVT)是一种用于高效渲染和交互式使用的矢量切片格式。下面是关于如何使用GDAL生成Mapbox Vector Tiles矢量切片的简要步骤。 首先,确保你已经安装了GDAL,并且可以在命令行中运行相关命令。 1. 将你的矢量数据转换为PGS(PostGIS)格式,这是一个常用的空间数据库。 例如,可以使用ogr2ogr命令将Shapefile数据转换为PGS格式: ``` ogr2ogr -f PostgreSQL PG:"dbname=your_db user=your_user" your_data.shp ``` 2. 创建一个新的数据库表,用来存储切片数据。 ``` psql -d your_db -U your_user -c "CREATE TABLE your_table AS SELECT * FROM your_data" ``` 3. 利用GDAL的ogr2ogr命令将数据导出为MVT格式。 ``` ogr2ogr -f MVT your_output.mbtiles PG:"dbname=your_db user=your_user" -sql "SELECT * FROM your_table" -dsco FORMAT=MVT ``` 4. 完成上述步骤后,你将得到一个包含Mapbox Vector Tiles的MBTiles文件(your_output.mbtiles),其中包含了你的矢量数据切片。 使用GDAL生成Mapbox Vector Tiles矢量切片的思路是将矢量数据先转换为PGS格式的空间数据库,然后导出为MVT格式。通过这种方式,你可以使用GDAL的强大功能来处理和转换地理空间数据,并方便地生成适用于Mapbox矢量切片。 ### 回答2: GDAL是一个开源的地理数据抽象库,它可以处理和转换各种地理空间数据格式。为了生成Mapbox矢量切片,我们可以使用GDAL的一些工具和功能。 首先,我们需要确保已经安装了GDAL库和相关的依赖项。然后,我们可以使用GDAL的命令行工具或API来执行下面的步骤。 1. 准备数据:将原始矢量数据准备好,可以是常见的矢量数据格式,如Shapefile、GeoJSON或GPKG等。 2. 转换到GeoPackage格式:使用gdal_translate命令将原始数据转换为GeoPackage格式(如果原始数据不是GeoPackage格式)。例如,可以使用以下命令: ```shell gdal_translate -f GPKG input.shp output.gpkg ``` 3. 切片生成:使用gdal2tiles.py或gdal2mbtiles.py命令生成Mapbox矢量切片。这两个命令可以将栅格数据或矢量数据转换为切片。在这种情况下,我们使用gdal2mbtiles.py来生成矢量切片。例如,可以使用以下命令: ```shell gdal2mbtiles.py -l layer_name input.gpkg output.mbtiles ``` 这将生成一个包含矢量切片的MBTiles文件。 4. 导入到Mapbox Studio:将生成的MBTiles文件导入到Mapbox Studio中,以便进一步处理和发布。在Mapbox Studio中,可以编辑样式、添加图层等。 通过以上步骤,我们可以使用GDAL转换和生成Mapbox矢量切片。GDAL提供了很多功能和选项,使得在处理地理空间数据时非常灵活和强大。 ### 回答3: GDAL是一个开源的地理数据抽象库,支持各种格式的地理数据读取、写入和转换。要使用GDAL生成Mapbox Vector Tiles(MVT矢量切片,需要安装GDAL软件包并了解如何使用其命令行工具。 首先,确保安装了最新版本的GDAL库。你可以从GDAL官方网站上下载并安装适合你操作系统的版本。 在安装完成后,使用命令行工具进入你的地理数据存储路径。然后,运行以下命令来生成MVT矢量切片: ``` ogr2ogr -f MVT output_directory input_data.geojson ``` 上述命令中,`output_directory`是你希望生成矢量切片的输出目录,`input_data.geojson`是你的输入地理数据文件的路径。请确保输入数据文件是GeoJSON格式。 运行上述命令后,GDAL会将输入的地理数据文件转换为MVT格式的矢量切片,并将其保存到指定的输出目录中。 需要注意的是,GDAL的`ogr2ogr`工具提供了多种选项和参数,可用于自定义矢量切片的生成过程。你可以查看GDAL的文档以了解更多详细信息,并根据你的需求进行调整。 总结起来,要用GDAL生成Mapbox Vector Tiles矢量切片,需要安装GDAL库并使用`ogr2ogr`命令行工具进行转换操作。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值