Django PostGIS原始查询在ST_AsMVT上返回空集
我正在尝试使用django生成动态mvt图块。我使用文档中给出的sql查询来生成平铺。我根据我的要求更改了z、x、yDjango PostGIS原始查询在ST_AsMVT上返回空集,django,postgresql,postgis,Django,Postgresql,Postgis,我正在尝试使用django生成动态mvt图块。我使用文档中给出的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,
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;
这给出了空的结果。但如果我只运行以下查询,它将返回结果:
SELECT ST_AsMVTGeom(feat_polygon.geom, ST_TileEnvelope(19, 369963, 215620)) AS geom, u_id
FROM feat_polygon
如果我尝试运行下面的查询,它将再次返回空集
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_asmvtgome
假设输入几何体投影到EPSG:3857;虽然它将愉快地返回(默认或自定义)边界内任何坐标的缩放几何体,但它们将不适合传递给ST_AsMVT
的ST_TileEnvelope
同样,ST_TileEnvelope
返回在EPSG:3857中投影的多边形;对具有任何其他CRS参考的几何图形运行ST_相交
检查将失败
取而代之的是,在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));
或重新投影并重新索引表,即
ALTER TABLE feat_polygon
ALTER COLUMN geom TYPE GEOMETRY(POLYGON, 3857)
USING ST_Transform(geom, 3857)
;
使用过滤器中的索引
迂腐的注释:您可能还希望将主CTE移动到子查询中,同时将ST\u TileDevelop
外包到CTE中,并使用feat\u polygon
连接,以避免多次调用
ST_AsMVT
返回一个BYTEA
值,该值保存一个已编码的:您应该能够使用
content_type="application/octet-stream"
并将其传递给任何可以根据矢量平铺规范解码pbf的映射框架。您的查询的输出到底是什么ST_asmvtgome
返回BYTEA
中的protobuf编码向量块。请注意,ST_AsMVTGeom
假设您的输入几何体投影到EPSG:3857中,如果不是这样,ST_AsMVTGeom
将返回一个缩放几何体,当传递到ST_AsMVT
时,该几何体不适合信封。同样,ST_TileEnvelope
将返回EPSG:3857中的多边形,因此ST_Intersects
仅在初始几何体也被投影时才起作用。在查询中的任何地方尝试使用ST_变换(feat_polygon.geom,3857)
。它显示空列表。我的geom是4326。所以,我使用了ST_变换,它开始返回我认为有效的内存位置。但如何将其作为响应返回,因为它显示“utf-8”编解码器无法解码位置0处的字节0x99:无效的起始字节@geozelotThanks,它像一个charm@ArshDoda很高兴它起作用了!如果解决了你的问题,请考虑接受答案。此外,您可能希望加入以GIS为中心的主题。