As shown in the below table grid_cell_data, I have geometryOfCellRepresentativeToTreatment and geometryOfCellRepresentativeToBuffer columns, and they contain geometries.
I want to apply both of ST_AsMVTGeom and ST_AsMVT
as stated in the PostGIS documentation, ST_AsMVT takes a geometry column. but when I execute the following code:
SELECT ST_AsMVT(grid_cell_data.geometryOfCellRepresentativeToTreatment)
AS geom
FROM grid_cell_data
I get the following error:
pgis_asmvt_transfn: parameter row cannot be other than a rowtype
please let me know how to use both of functions ST_AsMVTGeom and ST_AsMVT
image:

CodePudding user response:
The function ST_AsMVT expects a row containing a geometry, not simply a geometry. One option to use it is to select the records in a CTE or subquery, so that you can chose which columns of your table are going to be used, e.g. name and geometryOfCellRepresentativeToTreatment:
SELECT ST_AsMVT(g) FROM (
SELECT name,geometryOfCellRepresentativeToTreatment
FROM grid_cell_data) g;
Or if you wish to use the whole record:
SELECT ST_AsMVT(grid_cell_data)
FROM grid_cell_data
Regarding ST_AsMVTGeom you must provide at least a geometry and a the geometric bounds of the tile contents to make it work:
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;
Or combining both functions (see 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;
Demo: db<>fiddle
CodePudding user response:
It is an aggregate function like count or sum, and the first argument must be a composite type. (I wonder why PostGIS didn't declare the parameter as record.)
So you are expected call it like this, using a “whole-row reference”:
SELECT ST_AsMVT(grid_cell_data)
FROM grid_cell_data
[WHERE ...]
[GROUP BY ...]
