我想使用 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)