Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django PostGIS原始查询在ST_AsMVT上返回空集_Django_Postgresql_Postgis - Fatal编程技术网

Django PostGIS原始查询在ST_AsMVT上返回空集

Django 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,

我正在尝试使用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, 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为中心的主题。