Sorry hit send too soon! I would also prefer it if it was an extension rather than part of the core GeoServer.
Ian On Tue, 13 Sept 2022 at 12:52, Ian Turton <ijtur...@gmail.com> wrote: > 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 > -- Ian Turton
_______________________________________________ Geoserver-devel mailing list Geoserver-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/geoserver-devel