PostGIS 原始查询 returns 空集 ST_AsMVT

PostGIS raw query returns empty set on ST_AsMVT

我正在尝试使用 django 生成动态 mvt tiles。我使用文档中给出的 sql 查询来生成图块。我根据我的要求更改了 z,x,y。

WITH mvtgeom AS
(
  SELECT ST_AsMVTGeom(feat_polygon.geom, ST_TileEnvelope(19, 369963, 215620)) AS geom, u_id
  FROM feat_polygon
  WHERE ST_Intersects(feat_polygon.geom, ST_TileEnvelope(19, 369963, 215620))
)
SELECT ST_AsMVT(mvtgeom.*)
FROM mvtgeom;

这给出了空结果。但是如果我只运行下面查询它returns结果:

  SELECT ST_AsMVTGeom(feat_polygon.geom, ST_TileEnvelope(19, 369963, 215620)) AS geom, u_id
  FROM feat_polygon

如果我尝试 运行 下面的查询再次 returns 空集。

WITH mvtgeom AS
(
  SELECT ST_AsMVTGeom(feat_polygon.geom, ST_TileEnvelope(19, 369963, 215620)) AS geom, u_id
  FROM feat_polygon
)
SELECT ST_AsMVT(mvtgeom.*)
FROM mvtgeom;

ST_AsMVTGeom 假设输入几何体被投影在 EPSG:3857 中;虽然它会很高兴 return 为(默认或自定义)范围内的任何坐标缩放几何,但它们将不适合传递给 ST_AsMVT.

ST_TileEnvelope

同样,ST_TileEnvelope return 是一个 多边形 投影在 EPSG:3857 中; 运行 ST_Intersects 使用任何其他 CRS 参考的几何检查将失败。

相反,将您的几何图形包装在 ST_Transform:

WITH mvtgeom AS
(
  SELECT u_id,
         ST_AsMVTGeom(
           ST_Transform(feat_polygon.geom, 3857),
           ST_TileEnvelope(19, 369963, 215620)
         ) AS geom
  FROM   feat_polygon
  WHERE  ST_Intersects(
           ST_Transform(feat_polygon.geom, 3857),
           ST_TileEnvelope(19, 369963, 215620)
         )
)
SELECT ST_AsMVT(mvtgeom.*,  feature_id_name => 'u_id')
FROM   mvtgeom
;

请注意,您可能希望在投影几何图形上创建功能索引,即

CREATE INDEX ON feat_polygon USING GIST ((ST_Transform(geom, 3857));

或重新投影 REINDEX table,即

ALTER TABLE feat_polygon
  ALTER COLUMN geom TYPE GEOMETRY(POLYGON, 3857)
    USING ST_Transform(geom, 3857)
;

在您的过滤器中使用索引。

迂腐的注解:您可能还想将主 CTE 移动到子查询中,同时将 ST_TileEnvelope 外包到 CTE 中,并使用 feat_polygon 外包 JOIN 以避免多次调用。


ST_AsMVT returns a BYTEA value that holds a protobuf (pbf) encoded Vector Tile: 你应该能够序列化二进制 protobuf使用

的响应正文
content_type="application/octet-stream"

并将其传递给任何可以根据 Vector Tile 规范解码 pbf 的映射框架。