[Geoserver-users] Output dimension must be 2 or 3

Hello everybody,

after upgrading from geoserver 2.11 to geoserver 2.22, we have a few postgis layers that refuse to render in the preview.

Here is a simplified example, in postgis:

create table testhy(
geometry geometry constraint enforce_dims_the_geom check (st_ndims(geometry) = 4)
);

We get this exception:

Caused by: java.lang.IllegalArgumentException: Output dimension must be 2 or 3

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:291)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:270)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:240)

at org.geotools.data.postgis.PostGISPSDialect.setGeometryValue(PostGISPSDialect.java:253)

at org.geotools.jdbc.JDBCDataStore.setPreparedFilterValues(JDBCDataStore.java:3810)

at org.geotools.jdbc.JDBCDataStore.selectSQLPS(JDBCDataStore.java:3728)

at org.geotools.jdbc.JDBCFeatureSource.getReaderInternal(JDBCFeatureSource.java:609)

I browsed the code. geoserver gets dimension 4 based on a variant of this query (PostGISDialect.java):

SELECT * FROM GEOMETRY_COLUMNS WHERE coord_dimension not in (2,3);

but the query generated by geoserver to fetch the data is :

SELECT ST_AsBinary(ST_Force2D(“geometry”)) as “geometry” FROM “public”.“testhy” WHERE […]

Note the ST_Force2D that removes the Z and M dimension, so there are only 2 dimensions, not 4.

Hans Yperman

Department IT

image001.png

···

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be

We added support for dimensions and measures in that timeframe. It looks like your geometry is setup with 4 dimensions - which is not supported.

What is your coordinate reference system or SRID?

Is your data XYZM?

Jody

image001.png

···


Jody Garnett

Thanks for your help, Jody

The data is indeed XYZM, and the srid is 4326.

For reference: This is the full constraint on the column:

constraint enforce_dims_the_geom
check (st_ndims(the_geom) = 4)
constraint enforce_geotype_the_geom
check ((geometrytype(the_geom) = ‘MULTIPOLYGON’::text) OR (the_geom IS NULL))
constraint enforce_srid_the_geom
check (st_srid(the_geom) = 4326)

This is a small fragment of the data (note I get the crash even on an empty table):

image001.png

···
SELECT *st_astext*(the_geom) FROM the_relevant_table LIMIT 1

MULTIPOLYGON ZM (((  .. numbers ..)))

Hans

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be

From: Jody Garnett <jody.garnett@…84…>
Sent: maandag 5 december 2022 14:45
To: Hans Yperman <hans.yperman@…1715…>
Cc: Geoserver-users geoserver-users@lists.sourceforge.net
Subject: Re: [Geoserver-users] Output dimension must be 2 or 3

We added support for dimensions and measures in that timeframe. It looks like your geometry is setup with 4 dimensions - which is not supported.

What is your coordinate reference system or SRID?

Is your data XYZM?

Jody

On Mon, Dec 5, 2022 at 4:00 AM Hans Yperman <hans.yperman@…1715…> wrote:

Hello everybody,

after upgrading from geoserver 2.11 to geoserver 2.22, we have a few postgis layers that refuse to render in the preview.

Here is a simplified example, in postgis:

create table testhy(
geometry geometry constraint enforce_dims_the_geom check (st_ndims(geometry) = 4)
);

We get this exception:

Caused by: java.lang.IllegalArgumentException: Output dimension must be 2 or 3

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:291)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:270)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:240)

at org.geotools.data.postgis.PostGISPSDialect.setGeometryValue(PostGISPSDialect.java:253)

at org.geotools.jdbc.JDBCDataStore.setPreparedFilterValues(JDBCDataStore.java:3810)

at org.geotools.jdbc.JDBCDataStore.selectSQLPS(JDBCDataStore.java:3728)

at org.geotools.jdbc.JDBCFeatureSource.getReaderInternal(JDBCFeatureSource.java:609)

I browsed the code. geoserver gets dimension 4 based on a variant of this query (PostGISDialect.java):

SELECT * FROM GEOMETRY_COLUMNS WHERE coord_dimension not in (2,3);

but the query generated by geoserver to fetch the data is :

SELECT ST_AsBinary(ST_Force2D(“geometry”)) as “geometry” FROM “public”.“testhy” WHERE […]

Note the ST_Force2D that removes the Z and M dimension, so there are only 2 dimensions, not 4.

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

If you want to request a feature or an improvement, also see this: https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer

Geoserver-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Jody Garnett

Hi,
looks like it’s happening as the code is preparing to write a geometry literal for a filter in a prepared statement…
and it does not work because the WKB writer for it does not know how to write geometries with 4 dimensions.
Maybe it would be ok to lower the geometry used for the filter to 2 or 3 dimensions but… not sure how PostGIS would
react to that.

Cheers
Andrea

image001.png

···

Regards,

Andrea Aime

==
GeoServer Professional Services from the experts!

Visit http://bit.ly/gs-services-us for more information.

Ing. Andrea Aime
@geowolf
Technical Lead

GeoSolutions Group
phone: +39 0584 962313

fax: +39 0584 1660272

mob: +39 339 8844549

https://www.geosolutionsgroup.com/

http://twitter.com/geosolutions_it


Con riferimento alla normativa sul trattamento dei dati personali (Reg. UE 2016/679 - Regolamento generale sulla protezione dei dati “GDPR”), si precisa che ogni circostanza inerente alla presente email (il suo contenuto, gli eventuali allegati, etc.) è un dato la cui conoscenza è riservata al/i solo/i destinatario/i indicati dallo scrivente. Se il messaggio Le è giunto per errore, è tenuta/o a cancellarlo, ogni altra operazione è illecita. Le sarei comunque grato se potesse darmene notizia.

This email is intended only for the person or entity to which it is addressed and may contain information that is privileged, confidential or otherwise protected from disclosure. We remind that - as provided by European Regulation 2016/679 “GDPR” - copying, dissemination or use of this e-mail or the information herein by anyone other than the intended recipient is prohibited. If you have received this email by mistake, please notify us immediately by telephone or e-mail

Hello Andrea & Geoserver team,

I’ve seen a somewhat related WMS rendering error with our Oracle and App-Shema service when we switched from 2D GDA94 to the 3D GDA2020 EPSG 7843.

06 023 22:23:41 ERROR [geoserver.ows] -

org.opengis.geometry.MismatchedDimensionException: Argument “GDA2020” has 3 dimensions, while 2 was expected.

at org.geotools.geometry.jts.ReferencedEnvelope.checkCoordinateReferenceSystemDimension(ReferencedEnvelope.java:316)

at org.geotools.geometry.jts.ReferencedEnvelope.(ReferencedEnvelope.java:278)

at org.geoserver.wms.GetMap.executeInternal(GetMap.java:230)

at org.geoserver.wms.GetMap.run(GetMap.java:203)

at org.geoserver.wms.GetMap.run(GetMap.java:113)

at org.geoserver.wms.DefaultWebMapService.getMap(DefaultWebMapService.java:250)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

Switching to the 2D GDA2020 EPSG 7844 code resolved the issue, so I never really looked into it much further.

A few things I observed at the time…

At first I thought it might be due to an issue interpreting the 3D ellipsoid axis values from the updated EPSG database work done in GeoServer v2.16, but then noticed app schema was having issues encoding the geometries in WFS.

This example oracle geometry MDSYS.SDO_GEOMETRY(3001, 7843, MDSYS.SDO_POINT_TYPE(132.1435042, -30.8517789, 78.487), NULL, NULL)

Encodes ok as WFS 1.1.0

gsmlp:shape

<gml:Point srsDimension=“3” srsName=http://www.opengis.net/def/crs/EPSG/0/7843>

gml:pos-30.8517789 132.1435042 78.487</gml:pos>

</gml:Point>

</gsmlp:shape>

But looks like this in WFS 2.0.0, just a XY (Looking at this now I realise there is no dimension or epsg info for 2.0.0, another bug?)

gsmlp:shapePOINT (-30.8517789 132.1435042)</gsmlp:shape>

And to further complicate things, I did have some missing elevations, so some geoms had a null Z - ie MDSYS.SDO_GEOMETRY(3001, 7843, MDSYS.SDO_POINT_TYPE(128.9389034, -26.0539556, NULL), NULL, NULL)

And they were encoding to NaN

gsmlp:shape

<gml:Point srsDimension=“1” srsName=http://www.opengis.net/def/crs/EPSG/0/7843>

gml:posNaN NaN</gml:pos>

</gml:Point>

</gsmlp:shape>

&

gsmlp:shapePOINT (NaN NaN)</gsmlp:shape>

If app schema was able to handle the odd null elevation, I’m not sure that the null is allowed in GML, so in the end I just reverted back to 2D points using EPSG 7844 and all works ok with just the XY.

Not sure if this helps with Hans’ issue though.

Kind regards,

Ursula

image001.png

···

From: Andrea Aime <andrea.aime@…10949…>
Sent: Tuesday, 6 December 2022 7:14 PM
To: Hans Yperman <hans.yperman@…1715…>
Cc: Geoserver-users geoserver-users@lists.sourceforge.net
Subject: Re: [Geoserver-users] Output dimension must be 2 or 3

Hi,

looks like it’s happening as the code is preparing to write a geometry literal for a filter in a prepared statement…

and it does not work because the WKB writer for it does not know how to write geometries with 4 dimensions.

Maybe it would be ok to lower the geometry used for the filter to 2 or 3 dimensions but… not sure how PostGIS would

react to that.

Cheers

Andrea

On Mon, Dec 5, 2022 at 1:57 PM Hans Yperman <hans.yperman@…1715…> wrote:

Hello everybody,

after upgrading from geoserver 2.11 to geoserver 2.22, we have a few postgis layers that refuse to render in the preview.

Here is a simplified example, in postgis:

create table testhy(
geometry geometry constraint enforce_dims_the_geom check (st_ndims(geometry) = 4)
);

We get this exception:

Caused by: java.lang.IllegalArgumentException: Output dimension must be 2 or 3

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:291)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:270)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:240)

at org.geotools.data.postgis.PostGISPSDialect.setGeometryValue(PostGISPSDialect.java:253)

at org.geotools.jdbc.JDBCDataStore.setPreparedFilterValues(JDBCDataStore.java:3810)

at org.geotools.jdbc.JDBCDataStore.selectSQLPS(JDBCDataStore.java:3728)

at org.geotools.jdbc.JDBCFeatureSource.getReaderInternal(JDBCFeatureSource.java:609)

I browsed the code. geoserver gets dimension 4 based on a variant of this query (PostGISDialect.java):

SELECT * FROM GEOMETRY_COLUMNS WHERE coord_dimension not in (2,3);

but the query generated by geoserver to fetch the data is :

SELECT ST_AsBinary(ST_Force2D(“geometry”)) as “geometry” FROM “public”.“testhy” WHERE […]

Note the ST_Force2D that removes the Z and M dimension, so there are only 2 dimensions, not 4.

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

If you want to request a feature or an improvement, also see this: https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer

Geoserver-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Regards,

Andrea Aime

==
GeoServer Professional Services from the experts!

Visit http://bit.ly/gs-services-us for more information.

Ing. Andrea Aime
@geowolf
Technical Lead

GeoSolutions Group
phone: +39 0584 962313

fax: +39 0584 1660272

mob: +39 339 8844549

https://www.geosolutionsgroup.com/

http://twitter.com/geosolutions_it


Con riferimento alla normativa sul trattamento dei dati personali (Reg. UE 2016/679 - Regolamento generale sulla protezione dei dati “GDPR”), si precisa che ogni circostanza inerente alla presente email (il suo contenuto, gli eventuali allegati, etc.) è un dato la cui conoscenza è riservata al/i solo/i destinatario/i indicati dallo scrivente. Se il messaggio Le è giunto per errore, è tenuta/o a cancellarlo, ogni altra operazione è illecita. Le sarei comunque grato se potesse darmene notizia.

This email is intended only for the person or entity to which it is addressed and may contain information that is privileged, confidential or otherwise protected from disclosure. We remind that - as provided by European Regulation 2016/679 “GDPR” - copying, dissemination or use of this e-mail or the information herein by anyone other than the intended recipient is prohibited. If you have received this email by mistake, please notify us immediately by telephone or e-mail

Interesting, well that may be your issue? 4326 is a two-dimensional SRS, please make use of a three dimensional SRS.

What does the SRID number say in PostGIS? It should be baked into each geometry (and should not work if if set to 4326). I guess it could be that you have a two dimensional XY geometry, with two measures depends how you have encoded it.

image001.png

···


Jody Garnett

Hi,

I just found out all the M values are identical, and some huge negative value (-1.797693134862316e+308) which seems to be the lowest value that fits in a Double . So I’ll ask the business if I am allowed to just drop the M coordinate.

I don’t know enough GIS to answer this question: What does the SRID number say in PostGIS?

I don’t see anything SRID-ish in ST_ASTEXT, it’s just MULTIPOLYGON ZM (((numbers))) with numbers a list of 4 values , comma, 4 values, comma, … But the last constraint says check (st_srid(the_geom) = 4326) and I verified it complains if I try to violate it.

Oh well, feel free to drop the question as the M values are probably invalid. Thanks for your help.

Hans Yperman

Department IT

image001.png

···

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be

From: Jody Garnett <jody.garnett@…84…>
Sent: dinsdag 6 december 2022 17:34
To: Hans Yperman <hans.yperman@…1715…>
Cc: Geoserver-users geoserver-users@lists.sourceforge.net
Subject: Re: [Geoserver-users] Output dimension must be 2 or 3

Interesting, well that may be your issue? 4326 is a two-dimensional SRS, please make use of a three dimensional SRS.

What does the SRID number say in PostGIS? It should be baked into each geometry (and should not work if if set to 4326). I guess it could be that you have a two dimensional XY geometry, with two measures depends how you have encoded it.

-=

Jody

On Tue, Dec 6, 2022 at 12:35 AM Hans Yperman <hans.yperman@…1715…> wrote:

Thanks for your help, Jody

The data is indeed XYZM, and the srid is 4326.

For reference: This is the full constraint on the column:

constraint enforce_dims_the_geom
check (st_ndims(the_geom) = 4)
constraint enforce_geotype_the_geom
check ((geometrytype(the_geom) = ‘MULTIPOLYGON’::text) OR (the_geom IS NULL))
constraint enforce_srid_the_geom
check (st_srid(the_geom) = 4326)

This is a small fragment of the data (note I get the crash even on an empty table):

SELECT *st_astext*(the_geom) FROM the_relevant_table LIMIT 1
 
MULTIPOLYGON ZM (((  .. numbers ..)))

Hans

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be

From: Jody Garnett <jody.garnett@…84…>
Sent: maandag 5 december 2022 14:45
To: Hans Yperman <hans.yperman@…1715…>
Cc: Geoserver-users <geoserver-users@lists.sourceforge.net>
Subject: Re: [Geoserver-users] Output dimension must be 2 or 3

We added support for dimensions and measures in that timeframe. It looks like your geometry is setup with 4 dimensions - which is not supported.

What is your coordinate reference system or SRID?

Is your data XYZM?

Jody

On Mon, Dec 5, 2022 at 4:00 AM Hans Yperman <hans.yperman@…1715…> wrote:

Hello everybody,

after upgrading from geoserver 2.11 to geoserver 2.22, we have a few postgis layers that refuse to render in the preview.

Here is a simplified example, in postgis:

create table testhy(
geometry geometry constraint enforce_dims_the_geom check (st_ndims(geometry) = 4)
);

We get this exception:

Caused by: java.lang.IllegalArgumentException: Output dimension must be 2 or 3

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:291)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:270)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:240)

at org.geotools.data.postgis.PostGISPSDialect.setGeometryValue(PostGISPSDialect.java:253)

at org.geotools.jdbc.JDBCDataStore.setPreparedFilterValues(JDBCDataStore.java:3810)

at org.geotools.jdbc.JDBCDataStore.selectSQLPS(JDBCDataStore.java:3728)

at org.geotools.jdbc.JDBCFeatureSource.getReaderInternal(JDBCFeatureSource.java:609)

I browsed the code. geoserver gets dimension 4 based on a variant of this query (PostGISDialect.java):

SELECT * FROM GEOMETRY_COLUMNS WHERE coord_dimension not in (2,3);

but the query generated by geoserver to fetch the data is :

SELECT ST_AsBinary(ST_Force2D(“geometry”)) as “geometry” FROM “public”.“testhy” WHERE […]

Note the ST_Force2D that removes the Z and M dimension, so there are only 2 dimensions, not 4.

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

If you want to request a feature or an improvement, also see this: https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer

Geoserver-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Jody Garnett

Jody Garnett

Was the data originally (or at some point in its journey) a shapefile - -1.797693134862316e+308 looks like the sentinel used by Shapefiles for NaN in M values.

Ian

image001.png

···

Ian Turton

I can only speculate about the sources of all our data. But I dropped the M values, so this is resolved.

Note that I can reproduce the problem with an empty table:

create table testhy(
geometry geometry constraint enforce_dims_the_geom check (st_ndims(geometry) = 4)
);

Thanks for all your help. I really should spend some time to learn postgis and geoserver (and basic mapping theory) soon. Oh well, I’ll ask my wife for a good book on the topic for christmas.

Hans Yperman

Department IT

image001.png

···

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be

From: Ian Turton <ijturton@…84…>
Sent: woensdag 7 december 2022 9:40
To: Hans Yperman <hans.yperman@…1715…>
Cc: Jody Garnett <jody.garnett@…84…>; Geoserver-users geoserver-users@lists.sourceforge.net
Subject: Re: [Geoserver-users] Output dimension must be 2 or 3

Was the data originally (or at some point in its journey) a shapefile - -1.797693134862316e+308 looks like the sentinel used by Shapefiles for NaN in M values.

Ian

On Tue, 6 Dec 2022 at 20:32, Hans Yperman <hans.yperman@…1715…> wrote:

Hi,

I just found out all the M values are identical, and some huge negative value (-1.797693134862316e+308) which seems to be the lowest value that fits in a Double . So I’ll ask the business if I am allowed to just drop the M coordinate.

I don’t know enough GIS to answer this question: What does the SRID number say in PostGIS?

I don’t see anything SRID-ish in ST_ASTEXT, it’s just MULTIPOLYGON ZM (((numbers))) with numbers a list of 4 values , comma, 4 values, comma, … But the last constraint says check (st_srid(the_geom) = 4326) and I verified it complains if I try to violate it.

Oh well, feel free to drop the question as the M values are probably invalid. Thanks for your help.

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be

From: Jody Garnett <jody.garnett@…84…>
Sent: dinsdag 6 december 2022 17:34
To: Hans Yperman <hans.yperman@…1715…>
Cc: Geoserver-users <geoserver-users@lists.sourceforge.net>
Subject: Re: [Geoserver-users] Output dimension must be 2 or 3

Interesting, well that may be your issue? 4326 is a two-dimensional SRS, please make use of a three dimensional SRS.

What does the SRID number say in PostGIS? It should be baked into each geometry (and should not work if if set to 4326). I guess it could be that you have a two dimensional XY geometry, with two measures depends how you have encoded it.

-=

Jody

On Tue, Dec 6, 2022 at 12:35 AM Hans Yperman <hans.yperman@…1715…> wrote:

Thanks for your help, Jody

The data is indeed XYZM, and the srid is 4326.

For reference: This is the full constraint on the column:

constraint enforce_dims_the_geom
check (st_ndims(the_geom) = 4)
constraint enforce_geotype_the_geom
check ((geometrytype(the_geom) = ‘MULTIPOLYGON’::text) OR (the_geom IS NULL))
constraint enforce_srid_the_geom
check (st_srid(the_geom) = 4326)

This is a small fragment of the data (note I get the crash even on an empty table):

SELECT *st_astext*(the_geom) FROM the_relevant_table LIMIT 1
 
MULTIPOLYGON ZM (((  .. numbers ..)))

Hans

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be

From: Jody Garnett <jody.garnett@…84…>
Sent: maandag 5 december 2022 14:45
To: Hans Yperman <hans.yperman@…1715…>
Cc: Geoserver-users <geoserver-users@lists.sourceforge.net>
Subject: Re: [Geoserver-users] Output dimension must be 2 or 3

We added support for dimensions and measures in that timeframe. It looks like your geometry is setup with 4 dimensions - which is not supported.

What is your coordinate reference system or SRID?

Is your data XYZM?

Jody

On Mon, Dec 5, 2022 at 4:00 AM Hans Yperman <hans.yperman@…1715…> wrote:

Hello everybody,

after upgrading from geoserver 2.11 to geoserver 2.22, we have a few postgis layers that refuse to render in the preview.

Here is a simplified example, in postgis:

create table testhy(
geometry geometry constraint enforce_dims_the_geom check (st_ndims(geometry) = 4)
);

We get this exception:

Caused by: java.lang.IllegalArgumentException: Output dimension must be 2 or 3

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:291)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:270)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:240)

at org.geotools.data.postgis.PostGISPSDialect.setGeometryValue(PostGISPSDialect.java:253)

at org.geotools.jdbc.JDBCDataStore.setPreparedFilterValues(JDBCDataStore.java:3810)

at org.geotools.jdbc.JDBCDataStore.selectSQLPS(JDBCDataStore.java:3728)

at org.geotools.jdbc.JDBCFeatureSource.getReaderInternal(JDBCFeatureSource.java:609)

I browsed the code. geoserver gets dimension 4 based on a variant of this query (PostGISDialect.java):

SELECT * FROM GEOMETRY_COLUMNS WHERE coord_dimension not in (2,3);

but the query generated by geoserver to fetch the data is :

SELECT ST_AsBinary(ST_Force2D(“geometry”)) as “geometry” FROM “public”.“testhy” WHERE […]

Note the ST_Force2D that removes the Z and M dimension, so there are only 2 dimensions, not 4.

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

If you want to request a feature or an improvement, also see this: https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer

Geoserver-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Jody Garnett

Jody Garnett


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

If you want to request a feature or an improvement, also see this: https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer

Geoserver-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Ian Turton

Have you tried specifying a “more 3D” EPSG code than 4326, e.g. EPSG:4979, cf. https://gis.stackexchange.com/questions/264466/epsg-code-for-a-3d-crs-based-on-wgs84?

image001.png

···

From: Hans Yperman <hans.yperman@…1715…>
Sent: Wednesday, 7 December 2022 10.05
To: Ian Turton <ijturton@…84…>
Cc: Geoserver-users geoserver-users@lists.sourceforge.net
Subject: Re: [Geoserver-users] Output dimension must be 2 or 3

I can only speculate about the sources of all our data. But I dropped the M values, so this is resolved.

Note that I can reproduce the problem with an empty table:

create table testhy(
geometry geometry constraint enforce_dims_the_geom check (st_ndims(geometry) = 4)
);

Thanks for all your help. I really should spend some time to learn postgis and geoserver (and basic mapping theory) soon. Oh well, I’ll ask my wife for a good book on the topic for christmas.

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be

From: Ian Turton <ijturton@…84…>
Sent: woensdag 7 december 2022 9:40
To: Hans Yperman <hans.yperman@…1715…>
Cc: Jody Garnett <jody.garnett@…84…>; Geoserver-users <geoserver-users@lists.sourceforge.net>
Subject: Re: [Geoserver-users] Output dimension must be 2 or 3

Was the data originally (or at some point in its journey) a shapefile - -1.797693134862316e+308 looks like the sentinel used by Shapefiles for NaN in M values.

Ian

On Tue, 6 Dec 2022 at 20:32, Hans Yperman <hans.yperman@…1715…> wrote:

Hi,

I just found out all the M values are identical, and some huge negative value (-1.797693134862316e+308) which seems to be the lowest value that fits in a Double . So I’ll ask the business if I am allowed to just drop the M coordinate.

I don’t know enough GIS to answer this question: What does the SRID number say in PostGIS?

I don’t see anything SRID-ish in ST_ASTEXT, it’s just MULTIPOLYGON ZM (((numbers))) with numbers a list of 4 values , comma, 4 values, comma, … But the last constraint says check (st_srid(the_geom) = 4326) and I verified it complains if I try to violate it.

Oh well, feel free to drop the question as the M values are probably invalid. Thanks for your help.

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be

From: Jody Garnett <jody.garnett@…84…>
Sent: dinsdag 6 december 2022 17:34
To: Hans Yperman <hans.yperman@…1715…>
Cc: Geoserver-users <geoserver-users@lists.sourceforge.net>
Subject: Re: [Geoserver-users] Output dimension must be 2 or 3

Interesting, well that may be your issue? 4326 is a two-dimensional SRS, please make use of a three dimensional SRS.

What does the SRID number say in PostGIS? It should be baked into each geometry (and should not work if if set to 4326). I guess it could be that you have a two dimensional XY geometry, with two measures depends how you have encoded it.

-=

Jody

On Tue, Dec 6, 2022 at 12:35 AM Hans Yperman <hans.yperman@…1715…> wrote:

Thanks for your help, Jody

The data is indeed XYZM, and the srid is 4326.

For reference: This is the full constraint on the column:

constraint enforce_dims_the_geom
check (st_ndims(the_geom) = 4)
constraint enforce_geotype_the_geom
check ((geometrytype(the_geom) = ‘MULTIPOLYGON’::text) OR (the_geom IS NULL))
constraint enforce_srid_the_geom
check (st_srid(the_geom) = 4326)

This is a small fragment of the data (note I get the crash even on an empty table):

SELECT *st_astext*(the_geom) FROM the_relevant_table LIMIT 1
 
MULTIPOLYGON ZM (((  .. numbers ..)))

Hans

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be

From: Jody Garnett <jody.garnett@…84…>
Sent: maandag 5 december 2022 14:45
To: Hans Yperman <hans.yperman@…1715…>
Cc: Geoserver-users <geoserver-users@lists.sourceforge.net>
Subject: Re: [Geoserver-users] Output dimension must be 2 or 3

We added support for dimensions and measures in that timeframe. It looks like your geometry is setup with 4 dimensions - which is not supported.

What is your coordinate reference system or SRID?

Is your data XYZM?

Jody

On Mon, Dec 5, 2022 at 4:00 AM Hans Yperman <hans.yperman@…1715…> wrote:

Hello everybody,

after upgrading from geoserver 2.11 to geoserver 2.22, we have a few postgis layers that refuse to render in the preview.

Here is a simplified example, in postgis:

create table testhy(
geometry geometry constraint enforce_dims_the_geom check (st_ndims(geometry) = 4)
);

We get this exception:

Caused by: java.lang.IllegalArgumentException: Output dimension must be 2 or 3

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:291)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:270)

at org.locationtech.jts.io.WKBWriter.(WKBWriter.java:240)

at org.geotools.data.postgis.PostGISPSDialect.setGeometryValue(PostGISPSDialect.java:253)

at org.geotools.jdbc.JDBCDataStore.setPreparedFilterValues(JDBCDataStore.java:3810)

at org.geotools.jdbc.JDBCDataStore.selectSQLPS(JDBCDataStore.java:3728)

at org.geotools.jdbc.JDBCFeatureSource.getReaderInternal(JDBCFeatureSource.java:609)

I browsed the code. geoserver gets dimension 4 based on a variant of this query (PostGISDialect.java):

SELECT * FROM GEOMETRY_COLUMNS WHERE coord_dimension not in (2,3);

but the query generated by geoserver to fetch the data is :

SELECT ST_AsBinary(ST_Force2D(“geometry”)) as “geometry” FROM “public”.“testhy” WHERE […]

Note the ST_Force2D that removes the Z and M dimension, so there are only 2 dimensions, not 4.

Hans Yperman

Department IT

Vlaams Instituut voor de Zee vzw

InnovOcean Campus, Jacobsenstraat 1

8400 Oostende, België

:phone:+32 (0) 59 33 61 13

:e-mail: hans.yperman@…1715…

www.vliz.be


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

If you want to request a feature or an improvement, also see this: https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer

Geoserver-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Jody Garnett

Jody Garnett


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

If you want to request a feature or an improvement, also see this: https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer

Geoserver-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Ian Turton