I would suggest calling it something other than GeoJSON since if it strays
too far from the spec clients will become confused.

Ian

On Tue, 13 Sept 2022 at 12:07, Carsten Klein <c.kl...@datagis.com> wrote:

> Hello everyone,
>
> I'd like to enhance WFS responses in JSON/JSONP format. In some of our
> Web GIS Applications, one may download up to several thousand Simple
> Features through WFS. Some Layers may have between 400 and 500 columns.
>
> Although JSON produces much smaller responses than XML/GML, such
> responses quickly have sizes between 60 and 120 MB (uncompressed).
>
> The idea is to remove some redundancy from the GeoJSON format, which
> provides a feature's attributes in a key/value map (JSON Object):
>
> {
>     "type":"FeatureCollection",
>     "features":[
>        {
>           "type":"Feature",
>           "id":"bugsites.3",
>           "geometry":{
>              "type":"Point",
>              "coordinates":[
>                 590529,
>                 4914625
>              ]
>           },
>           "geometry_name":"the_geom",
>           "properties":{
>              "cat":3,
>              "str1":"Beetle site"
>           }
>        },
>        {
>           "type":"Feature",
>           "id":"bugsites.4",
>           "geometry":{
>              "type":"Point",
>              "coordinates":[
>                 590546,
>                 4915353
>              ]
>           },
>           "geometry_name":"the_geom",
>           "properties":{
>              "cat":4,
>              "str1":"Beetle site"
>           }
>        }
>     ],
>     "totalFeatures":2,
>     "numberMatched":2,
>     "numberReturned":2,
>     "timeStamp":"2022-09-13T08:44:45.118Z",
>     "crs":{
>        "type":"name",
>        "properties":{
>           "name":"urn:ogc:def:crs:EPSG::26713"
>        }
>     }
> }
>
> Also, the "geometry_name" property is repeated for every feature returned.
>
> With lots of features and columns (the latter do not necessarily have
> short names), this repeated schema information can quickly become the
> dominating factor regarding the size of the response. (Of course, that
> also depends on the type and complexity of the geometry.)
>
> Likely the repeated "type":"Feature" could be omitted as well. It's just
> there in order to satisfy the GeoJSON specs. Maybe the "level of
> compaction" could be specified for a request.
>
> By including schema information only once in the FeatureCollection
> object, a more compact form of the JSON response may look like this:
>
> {
>     "type":"FeatureCollection",
>     "features":[
>        {
>           "type":"Feature",
>           "id":"bugsites.3",
>           "geometry":{
>              "type":"Point",
>              "coordinates":[
>                 590529,
>                 4914625
>              ]
>           },
>           "geometry_name":"the_geom",
>           "properties":[
>              3,
>              "Beetle site"
>           ]
>        },
>        {
>           "type":"Feature",
>           "id":"bugsites.4",
>           "geometry":{
>              "type":"Point",
>              "coordinates":[
>                 590546,
>                 4915353
>              ]
>           },
>           "properties":[
>              4,
>              "Beetle site"
>           ]
>        }
>     ],
>     "totalFeatures":2,
>     "numberMatched":2,
>     "numberReturned":2,
>     "timeStamp":"2022-09-13T08:44:45.118Z",
>     "crs":{
>        "type":"name",
>        "properties":{
>           "name":"urn:ogc:def:crs:EPSG::26713"
>        }
>     },
>     "schema":{
>        "geometry_name":"the_geom",
>        "properties":[
>           "cat",
>           "str1"
>        ]
>     }
> }
>
> Here, a new "schema" object in the root "FeatureCollection" object
> contains the name of the geometry field as well as the names of the
> other properties as an array. The "properties" object in the "Feature"
> objects have become arrays as well, containing the property values only.
>
> Both arrays are "parallel", that is:
>
> Key: "schema"."properties"[0]     => cat
> Val: features[N]."properties"[0]  => 3 or 4 (depending on N)
>
> Key: "schema"."properties"[1]     => str1
> Val: features[N]."properties"[1]  => Beetle site
>
> In the above example with only two short-named fields savings are almost
> zero. However, with requests getting some thousand features, each having
> 300+ fields, savings may be quite significant.
>
> The new compact format is not GeoJSON, of course. However, what
> GeoServer currently returns is already not really compatible with
> GeoJSON specs, which, for example, only permit EPGS:4326 coordinates. In
> any case, that format is likely much smaller for requests described above.
>
> On the wire, these responses are typically compressed (deflate, brotli
> etc.). However, compressing smaller amounts of data typically results in
> smaller compressed junks. Also, it is not only about transferring the
> data; the data must be created and compressed by GeoServer and must be
> decompressed and parsed in the client. After all, smaller junks of data
> seem to be less resource consuming than larger ones.
>
> I'd like to add this new compact format directly into GeoServer's core
> WFS JSON code:
>
> gs-wfs: org.geoserver.wfs.json.GeoJSONGetFeatureResponse
>
> More or less, only method encodeSimpleFeatures must be modified in order
> to implement this new compact JSON format.
>
> However, that method iterates over a list of FeatureCollection objects
> (argument List<FeatureCollection> resultsList). Could there be more than
> one FeatureCollection is the request returns simple features only?
> Shouldn't all simple features requested through WFS be of the same type?
> In other words, must I expect to deal with several distinct "schema"
> objects when requesting simple features? (don't think so)
>
> Since using this format, of course, is optional, I need a mechanism to
> tell the server whether to return compact JSON or not (and maybe the
> level of compaction it should use).
>
> One quite obvious option is to use vendor parameter "format_options".
> Here, a parameter like "json:compact" could trigger responding with
> compact JSON. This seems quite simple to implement.
>
> Another idea is to use different outputFormat MIME types or MIME types
> with additional parameters:
>
> application/json; type=compact; omitTypes=true
> text/javascript; type=compact
>
> Although distinguishing the format via the MIME type may be some more
> work to do, I do prefer this approach over the "format_options" way.
>
> What else do I have to consider?
>
> Many thanks in advance for your ideas on this :)
>
> Regards, Carsten
>
>
> _______________________________________________
> Geoserver-devel mailing list
> Geoserver-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/geoserver-devel
>


-- 
Ian Turton
_______________________________________________
Geoserver-devel mailing list
Geoserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-devel

Reply via email to