如何使用“ST_AsMVTGeom”和“ST_AsMVT”

how to use `ST_AsMVTGeom` and `ST_AsMVT`

如下面的 table grid_cell_data 所示,我有 geometryOfCellRepresentativeToTreatmentgeometryOfCellRepresentativeToBuffer 列,它们包含几何图形。

我想申请 ST_AsMVTGeomST_AsMVT 如 PostGIS 文档中所述,ST_AsMVT 采用几何列。但是当我执行以下代码时:

SELECT ST_AsMVT(grid_cell_data.geometryOfCellRepresentativeToTreatment) 
AS geom
FROM grid_cell_data

我收到以下错误:

 pgis_asmvt_transfn: parameter row cannot be other than a rowtype
 

请告诉我如何使用 ST_AsMVTGeomST_AsMVT

这两个函数

图片:

countsum一样是聚合函数,第一个参数必须是复合类型。 (我想知道为什么PostGIS没有将参数声明为record。)

所以你应该这样称呼它,使用“整行引用”:

SELECT ST_AsMVT(grid_cell_data)
FROM grid_cell_data
[WHERE ...]
[GROUP BY ...]

函数 ST_AsMVT 需要一行包含几何图形,而不仅仅是几何图形。使用它的一种选择是 select CTEsubquery 中的记录,这样您就可以选择要使用 table 的哪些列,例如namegeometryOfCellRepresentativeToTreatment:

SELECT ST_AsMVT(g) FROM (
  SELECT name,geometryOfCellRepresentativeToTreatment
  FROM grid_cell_data) g;

或者如果您希望使用整个记录:

SELECT ST_AsMVT(grid_cell_data) 
FROM grid_cell_data

关于 ST_AsMVTGeom 您必须至少提供图块内容的几何形状和几何边界才能使其正常工作:

SELECT
 ST_AsText(
   ST_AsMVTGeom(
     geometryOfCellRepresentativeToTreatment,
     -- change to the envelope that suits your data set
     ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)))) 
FROM grid_cell_data;

或结合两种功能(参见documentation):

WITH j AS (
 SELECT
   ST_AsMVTGeom(
     geometryOfCellRepresentativeToTreatment,
     ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)))
 FROM grid_cell_data
)
SELECT ST_AsMVT(j.*) FROM j;

演示:db<>fiddle