小编Mar*_*ode的帖子

如何在 Django ORM 中使用 PostGIS 聚合函数 ST_AsMVT

问题

我想使用 ORM 在 Django 中创建一个 Mapbox 矢量瓦片 (MVT)。在 SQL(PostgreSQL、PostGIS)中,对于缩放=8、x=137、y=83 的图块,SQL 查询如下所示:

SELECT ST_AsMVT(tile)
FROM (SELECT id, ST_AsMVTGeom(geometry, ST_TileEnvelope(8, 137, 83)) AS "mvt_geom"
      FROM geomodel
      WHERE ST_Intersects(geometry, ST_TileEnvelope(8, 137, 83))
     ) AS tile;
Run Code Online (Sandbox Code Playgroud)

ST_AsMVT聚合所有行,输出是bytea可以作为响应发送的二进制字段 ( )。

由于 GeoDjango 不包含特定的 PostGIS 函数,我为它们创建了自定义函数:

class TileEnvelope(Func):
    function = "ST_TileEnvelope"
    arity = 3
    output_field = models.GeometryField()


class AsMVTGeom(GeoFunc):
    function = "ST_AsMVTGeom"
    arity = 2
    output_field = models.GeometryField()
Run Code Online (Sandbox Code Playgroud)

我设法创建了内部子查询并且它有效:

tile_envelope = TileEnvelope(8, 137, 83)
tile_geometries = GeoModel.objects.filter(geometry__intersects=tile_envelope)
tile_geometries_mvt = tile_geometries.annotate(mvt_geom=AsMVTGeom("geometry", tile_envelope))
tile_geometries_mvt …
Run Code Online (Sandbox Code Playgroud)

python django postgresql postgis vector-tiles

5
推荐指数
1
解决办法
615
查看次数

标签 统计

django ×1

postgis ×1

postgresql ×1

python ×1

vector-tiles ×1