[mapserver-users] WFS bbox/intersect etc query from custom projection to EPSG:4326

Sander Pukk sander.pukk at gmail.com
Wed Nov 24 05:01:42 PST 2021


Hi there!

We have been running into an issue with WFS, EPSG:4326 and a filter (namely
bbox) query.
We have been using MapServer for years and the current version we have is
7.6.4.
WMS and WFS are both enabled and WFS is configured for gml and geojson.

Our MapServer's main output is in EPSG:3301 projection and most of our
clients use it like that.
The bbox OGC WFS filters work in that projection and another more "robust"
approach by limiting bbox into a 20x20 pixel square in the request.

Our MapServer can also function in the regular 4326 and 3857 in WMS and WFS.
But one of our clients is doing their things in 4326 and we noticed an
issue when querying WFS with a bbox/intersect filter in that projection.


*Main problem:*Trying to reverse geocode from WFS service (capable of 3301,
4326 and 3857) where underlying data is in EPSG:3301 and request comes in
4326.
The response should be in 4326, but the transformation does not work.
(Obvious from the database SQL).
Everything works in EPSG:3301.

I have obscured some URL and Layer names.
Our map file with a sample layer looks like this:
MAP

  LEGEND
    LABEL
      TYPE truetype
      FONT "Arial"
      SIZE 10
      POSITION AUTO
    END
  END

  NAME           "<%NAME%>_keskkond"
  STATUS         ON
  EXTENT         <%= node['mapserver']['extent'] %>
  FONTSET        "<%= URL %>/fonts/current/fonts.list"
  IMAGETYPE      "png"
  DEFRESOLUTION 96
  RESOLUTION    96
  CONFIG "MS_ERRORFILE" "infolayer.log"
  DEBUG 0
  MAXSIZE 10000
  OUTPUTFORMAT
    NAME "png"
    DRIVER AGG/PNG
    MIMETYPE "image/png"
    IMAGEMODE RGB
    EXTENSION "png"
    FORMATOPTION "QUANTIZE_FORCE=on"
  END

  OUTPUTFORMAT
    NAME "geojson"
    DRIVER "OGR/GEOJSON"
    MIMETYPE "application/json; subtype=geojson; charset=utf-8"
    FORMATOPTION "STORAGE=filesystem"
    FORMATOPTION "FORM=SIMPLE"
  END

  WEB
      METADATA
        "wfs_title"                     "infolayer"
        "wfs_enable_request"            "*"
        "wfs_encoding"                  "UTF-8"
        "wms_title"                     "infolayer"
        "wms_encoding"                  "UTF-8"
        "wms_onlineresource"
 "/mapserv?map=/app/gis/infokihid/infolayer.map&"
        "wfs_onlineresource"
 "/mapserv?map=/app/gis/infokihid/infolayer.map&"
        "ows_srs"                       "EPSG:3301 EPSG:3857 EPSG:4326"
        "ows_enable_request"            "*"
        "wfs_getfeature_formatlist"     "gml,geojson"
        "wms_feature_info_mime_type"    "application/json,application/json;
subtype=geojson,application/vnd.ogc.gml,text/plain"
      END
  END

  PROJECTION
      "init=epsg:3301"
  END

LAYER
  TEMPLATE "dummy"
    NAME "omavalitsus"
    STATUS off
    TYPE polygon
    CONNECTIONTYPE   POSTGIS
    INCLUDE "postgis.inc"
    DATA "geom from omavalitsus using unique gid using srid=3301"
    LABELITEM           "nimetus"
    TYPE                polygon
    MAXSCALEDENOM       2000000

    METADATA
        "gml_msGeometry_type"   "polygon"
        "wfs_title"             "omavalitsus"
        "wms_title"             "omavalitsus"
        "wfs_srs"               "EPSG:3301"
        "wms_srs"               "EPSG:3301"
        "wms_extent"            "355000 6360000 754000 6660000"
        "gml_include_items"     "all"
        "ows_include_items"     "all"
        "wfs_srs"               "EPSG:3301"
        "gml_featureid" "id"
        "ows_featureid" "id"
    END

    CLASS
        NAME omavalitsus
        STYLE
            COLOR   234 123 43
            OPACITY 15
        END
        STYLE
            WIDTH 2
            OUTLINECOLOR 80 80 80
            OPACITY 15
        END
    END
END


If we do a query without a bbox and want all the features, it works.

Example:
https://URL/mapserv?map=/app/gis/infokihid/infolayers_other.map&service=WFS&request=GetFeature&version=1.1.0&typename={{LAYER}}&outputformat=gml3&srsName=EPSG:4326

WFS version 1.3.0 and 2.0.0
But if we add a bbox in OGC filter format or bbox, then it does not work
anymore:

Example:

https://URL/mapserv?map=/app/gis/infokihid/infolayers_other.map&service=WFS&request=GetFeature&version=1.1.0&typename={{LAYER}}&outputformat=gml3&srsName=EPSG:4326&bbox=24.753586,59.29725,24.773586,59.31725,urn:x-ogc:def:crs:EPSG:4326

OR OGC

https://URL/mapserv?map=/app/gis/infokihid/infolayers_other.map&SERVICE=WFS&Version=2.0.0&REQUEST=GetFeature&typeNames={{LAYER}}&Filter=<Filter><contains><PropertyName>Geometry</PropertyName><gml:Point
srsName="urn:ogc:def:crs:EPSG::4326"><gml:coordinates>25.035308,59.32675</gml:coordinates></gml:Point></contains></Filter>


Some documentation hints that OGC filter needs to be in the same SRID as
the underlying data so I guess that shouldn't be working.

SQL form the database where you can see the geom query part where
transformation of geom contains/intersect etc happens, is is wrong:

select <<FIELDS>>,ST_AsBinary(("geom"),'NDR') as geom,"gid"::text from
(select * from LAYER where kehtiv_alates < now() and (kehtiv_kuni >
now() OR kehtiv_kuni is null)) as subquery where ("geom" &&
ST_GeomFromText('POLYGON((296500 6249000,296500 6761000,808500
6761000,808500 6249000,296500 6249000))',3301)) AND
ST_Distance("geom", ST_GeomFromText('POLYGON((296500 6249000,296500
6761000,808500 6761000,808500 6249000,296500 6249000))',3301)) = 0 and
(st_contains(geom,ST_GeomFromText('POINT (25.0353080000000006
59.3267499999999970)',3301)) = TRUE)


The contains should be:

(st_contains(geom,ST_TRANSFORM(ST_GeomFromText('POINT
(25.0353080000000006 59.3267499999999970)',4326),3301))


One way to get a result is using WFS 1.0.0. It returns the result in
EPSG:3301 but is correct.

https://URL/mapserv?map=/app/gis/infokihid/infolayers_other.map&service=WFS&request=GetFeature&version=1.0.0&typename={{LAYER}}&outputformat=gml3&srsName=EPSG:4326&bbox=24.753586,59.29725,24.773586,59.31725,urn:x-ogc:def:crs:EPSG:4326

I have tried different OGC filters, but they all act the same when trying
to do stuff in EPSG:4326.
Tried different WFS versions, coordinate order in OGC filter/manual bbox
etc.
Even with the OGC filter being in EPSG:3301, but request in srs 4326.
Have not yet managed to get it.

So my questions are:

   1. Is there something wrong in our MAP/LAYER files? Do we need to change
   or add something?
   2. Could/Should it be possible to do what we are trying to do, when the
   main projection is something different then all the request parameters?


Cheers,
Sander
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/mapserver-users/attachments/20211124/9a8f68e1/attachment.htm>


More information about the MapServer-users mailing list