Changelog¶
2026-05-19 (2.4.0)¶
Support for Django 6.0.
2026-02-04 (2.3.1)¶
Add workflow for automated release.
2026-01-12 (2.3.0)¶
Add support for python 3.14 and Django 5.2
Drop support for Django 5.1
2025-12-04 (2.2.2)¶
Fix output format matching to allow
application/json; subtype=geojson; charset=utf-8
2025-10-14 (2.2.1)¶
Add outputFormat to GetFeature operation to support ArcGISOnline
2025-09-18 (2.2.0)¶
Drop support for python 3.9 and Django 3.2
2025-09-17 (2.1.4)¶
Remove reference to bootstrap.min.css.map file
2025-09-16 (2.1.3)¶
Add missing bootstrap.min.css.map file
2025-09-10 (2.1.2)¶
Stop using CDN for bootstrap stylesheet, instead use a static local file. This in order for the server to work in an airgapped environment (PR#72).
2025-06-06 (2.1.1)¶
Fixed using legacy longitude/latitude rendering for
EPSG:4326and:http://www.opengis.net/gml/srs/epsg.xml#xxxxSRS names.Improved styling for the default HTML page.
This increases interoperability with web-based clients and legacy libraries. GeoServer applies the same heuristic.
Clients that use the official OGC notations such as urn:ogc:def:crs:EPSG::4326 and http://www.opengis.net/def/crs/epsg/0/4326
are not affected. If needed, this behavior can be disabled using GISSERVER_FORCE_XY_EPSG_4326=False and GISSERVER_FORCE_XY_OLD_CRS=False.
2025-05-29 (2.1)¶
Added support for
ArrayFieldfield in CSV exports.Added support for
models.DurationFieldfor features.Added proper axis ordering handling.
Changed built-in fes functions to match current GeoServer signatures.
Improved error handling for invalid filter input (also fixes 500 errors).
Improved error handling for database query errors during rendering.
Improved error messages for unexpected tags in the XML body.
Improved error handling for fes 1.0 arithmetic operators (e.g. typing:
date > 2020-01-01in QGis).Improved HTML index page, make it easier to override and restyle.
Improved documentation, added API documentation.
Fixed axis ordering handling for
EPSG:4326and other longitude/latitude CRS definitions.Fixed comparing to
NULLwhen date/time input is invalid.Fixed filter comparisons for
<,<=,>,>=when using a reversed “value < property” ordering.Fixed crash when receiving WFS 1.0 POST requests.
Fixed building readthedocs.
2025-04-28 (2.0)¶
Added support for XML POST requests.
Added support for geometry elements on child nodes.
Added support for Django 5
GeneratedFieldfields as geometry field.Added
WFSView.check_permissions()API to simplify permission checking.Added
WFSView.xml_namespace_aliasesattribute to configure custom namespace prefixes.Added example app and docker-compose setup for testing.
Added
GISSERVER_EXTRA_OUTPUT_FORMATSsetting to define additional output formats.Added
GISSERVER_GET_FEATURE_OUTPUT_FORMATSsetting to override the default output formats.Added
CRS84andWEB_MERCATORconstants ingisserver.geometries.Improved debugging by adding debug-level logging and better error messages.
Improved font styling somewhat for browsable HTML pages.
Fixed XML namespace support (e.g. handling
<ValueReference>ns0:tagname</ValueReference>).Fixed bugs found by CITE compliance testing:
Support
<fes:PropertyIsLike>for array elements.Support
<fes:PropertyIsNil>for geometry elements.Support
resulttype=hitswithcountarguments.
Fixed
ArrayFielddetection whendjango.contrib.postgresis not inINSTALLED_APPS.Fixed
main_geometry_elementdetection.Fixed swapped X/Y coordinates for systems that use a different axis-ordering (e.g. EPSG:3879 for Finland).
Fixed GeoJSON CRS value to be
CRS84(urn:ogc:def:crs:OGC::CRS84) instead of WGS84 (urn:ogc:def:crs:EPSG::4326).Fixed applying the
CRS.backendwhen the client requests a custom coordinate system usingsrsName.Fixed rendering JSON exceptions during streaming errors.
Fixed internal XML Schema; use proper model CamelCasing for class names (doesn’t affect requests).
Fixed internal XML schema; remove unneeded inheritance from
gml:AbstractFeatureTypefor nested elements.Fixed CI testing.
Confirmed support for Python 3.13.
This release has a lot of API changes, renamed and moved classes, which was needed to implement POST support and XML namespace handling.
This won’t affect most projects as they use the basic FeatureType functionality.
For implementations that have taken full advantage of our architecture,
the notable API changes are:
Configuration:
WFSOperation.output_formatsstill works, butget_output_formats()is preferred.WFSOperation.parametersis replaced byget_parameters()and only lists parameters that need to be mentioned inGetCapabilities.The
Parameterclass only exposes choices, parsing happens ingisserver.parsers.wfs20now.FeatureType.xml_namespacenow defines which namespace the feature exists in (defaults toWFSView.xml_namespace).
Overiding and extending queries:
FeatureType.get_extent()was replaced withGmlBoundedByElement.get_value().gisserver.operations: renamedWFSMethod->WFSOperation.gisserver.extensions.functionsnow tracks filter function registration.gisserver.extensions.queriesnow tracks stored query registration.The
StoredQuerybase class is nowStoredQueryImplementationproviding abuild_query()method.The internal
CompiledQuerymoved togisserver.parsers.queryand receives afeature_typesarray now with a single element. (This change reflects the WFS spec and allowing to potentially implement JOIN queries later).
Request parsing:
WFSView.ows_requestandrequest.ows_requestboth provide access to the parsed WFS request.WFSOperation.parser_classallows to define a custom parser for a additional WFS operations.The WFS request parsing moved to
gisserver.parsers.wfs20, which builds an Abstract Syntax Tree (AST) of the XML request.The GET request (KVP format) parsing is now a special-case of the XML-based parsing classes.
Output formats:
gisserver.outputno longer exposes the auto-switching DB/non-DB rendering aliases, asget_output_formats()can do that easier.OutputRendereronly provides the basic XML aliasing, a newCollectionOutputRendererbase class provides the collection logic.OutputRenderer.xml_namespacesallows defining XML namespace aliases that construct defaultxmlnsattributes.All rendering parameters (e.g. output CRS) moved to the
FeatureProjectionlogic.The
decorate_queryset()logic is no longer a classmethod.
Internal XSD schema elements:
XML tag parsing is reworked for simplicity and namespace handling.
Namespace aliases/prefixes are removed entirely, and resolved during rendering.
FeatureType.xml_namenow returns the full XML name, not the QName.XsdTypesuse fully qualified XML names, not the QName.XsdElement.xml_namenow returns the full XML name, not the QName.XsdElement.is_geometrywas unneeded, useXsdElement.type.is_geometrynow.XsdElement.orm_pathpoints to the absolute path, andXsdElement.local_orm_pathto the relative path.
2024-11-25 (1.5.0)¶
Added
PROPERTYNAMEsupportAdded rendering of
<wfs:truncatedResponse>when errors happen during output streaming.Fixed accessing a feature with 3 geometry fields (fixed our PostgreSQL
ST_Unionsyntax).Make sure Django 4.1+ won’t do double prefetches on relations that we prefetch.
Hide the erroneous output formats in
GetCapabilitiesthat are supported for FME.Bump requirements to non-vulnerable versions (of lxml and orjson).
Improved documentation.
Cleaned up code, removing some internal methods.
Cleaned up leftover Python 3.7 compat code.
2024-08-29 (1.4.1)¶
Fix 500 error when
model_attributepoints to a dotted-path. PR thanks to sposs.Updated pre-commit configuration and test matrix.
2024-07-01 (1.4.0)¶
Added
GISSERVER_COUNT_NUMBER_MATCHEDsetting to allow disabling “numberReturned” counting. This will avoid an expensive PostgreSQL COUNT query, speeding up returning large sets.Added basic support for array fields in
GetPropertyValue.Optimized GML rendering performance (around 15-20% faster on large datasets).
Optimized overall rendering performance, which improved GeoJSON/CSV output too.
Developers: updated pre-commit hooks
Cleaned up leftover Python 3.7 compat code.
2023-06-08 (1.3.0)¶
Django 5 support added.
Contributors¶
We would like to thank the following contributors for their work on this release.
2023-06-08 (1.2.7)¶
WFS endpoints now accept a GML version number in their OUTPUTFORMAT.
2023-06-07 (1.2.6)¶
Workaround for FME doing a DescribeFeatureType with the wrong outputformat.
Dropped support for Django versions < 3.2 and Python < 3.9.
Minor optimizations.
2023-01-11 (1.2.5)¶
CRS parsing no longer raises SyntaxErrors.
2022-11-01 (1.2.4)¶
Fixed type assertion when
django.contrib.postgreswas not installed.
2022-09-07 (1.2.3)¶
Added “geojson” as output format alias in
GetCapabilitiesfor ESRI ArcGIS online.
2022-07-28 (1.2.2)¶
Optimized response writing, buffering provement gave ~12-15% speedup.
Optimized GML response, reduced response size by ~9% by removing whitespace.
2022-04-13 (1.2.1)¶
Fixed regression for auto-correcting xmlns for
<Filter>tags that have leading whitespace.Fixed weird crashes when geometry field is not provided.
Simplify
FeatureType.geometry_fieldlogic.
2022-04-11 (1.2)¶
Added support for
maxOccurs=unboundedelements (M2M, reverse foreign key, array fields).Added support for filtering on M2M, reverse foreign key and array fields.
Added
field(..., xsd_class=...)parameter to simplify overridingFeatureField.xsd_element_class.Added
xsd_base_typeparameter toComplexFeatureFieldto allow overriding it.Added
GISSERVER_DB_PRECISIONsetting and made precision consistent between output formats.Added
.prefetch_related()support to large GeoJSON responses (using prefetching on iterator chunks).Added
FeatureType.filter_related_queryset()that allows adjusting all retrieved querysets.Using
.only()to reduce transferred data to the actual fields.Optimized large responses through the chunked-iterator and
.only()usage (seen 2x improvement on GeoJSON on some large datasets).Improved
<fes:Filter>error handling, avoid internal server errors for missing XML child elements.Improved GeoJSON content type in HTTP responses, using
application/geo+jsoninstead ofapplication/json.Fixed next/previous pagination links, to preserve lowercase querystring fields that project-specific code might use.
Fixed preserving extra querystring fields in HTML pages.
Fixed integration with custom fields, using
value_from_object()instead ofgetattr()to retrieve field values.Fixed calculating extent over feature with mixed geometry types.
Various code cleanups.
Dropped Python 3.6 support.
2021-05-17 (1.1.3)¶
Included Django 3.2 in test matrix.
Fixed preserving axis orientation by passing Incoming SRS data is directly to GDAL.
Fixed doc typoo’s
Updated pre-commit hooks.
Drop universal wheel declaration (Python 2 is no longer supported)
2020-12-22 (1.1.2)¶
Fixed double
>sign in<Filter xml..>>code when namespaces were auto-corrected.Fixed basic
<Beyond>support for distance queries.Fixed parameter name for
round()function.
2020-08-19 (1.1.1)¶
Improve HTML page with “Using This WFS” section.
Fixed Django 3.1 compatibility.
Improved error message for
<fes:PropertyIsLike>operator when comparing against a<fes:ValueReference>instead of<fes:Literal>.
2020-08-13 (1.1)¶
Added browsable HTML views for WFS views, which can be extended/overwritten.
Added content-disposition header to export formats, to have a proper filename.
Added “abstract” property to field classes to provide a description.
Consider
?SERVICE=WFSas default forWFSViewviews.
2020-07-21 (1.0)¶
Added
FeatureType.show_name_fieldto show/hide<gml:name>and GeoJSONgeometry_name.Added
FeatureType.xml_prefixso the outputted namespace prefix can be changed from “app:” to anything else.Added
FeatureType.xsd_type_classso this can be overwritten easier.Added
XsdNode.to_python()to support input data parsing.Added
GISSERVER_SUPPORTED_CRS_ONLYto accept only the listed coordinate systems.Rename
is_gml->is_geometry.Fixes for CITE compliance testing for WFS Basic conformance:
Added
ImplementsBasicWFSflag in capabilities document.Added attribute resolving, like
@gml:idin XPath.Added querying support for the
gml:namefield.Added support to fetch multiple RESOURCEID objects in a single request.
Fixed unwanted exception when the RESOURCEID format is invalid, empty results are returned instead.
Fixed locator for RESOURCEID errors.
Fixed filter type exception, now
OperationParsingFailedinstead ofInvalidParameterValue.Fixed datetime and boolean comparisons.
Fixed exception message when
<PropertyIsLessThanOrEqualTo>receives an GML object.Fixed exception message for bad SRID’s.
Internal code reorganizations.
2020-07-09 (0.9.1)¶
Fixed
GetPropertyValuecalls for non-db optimized rendering.
2020-07-09 (0.9)¶
Added support for nested, flattened fields.
Added support for dotted-names in field names.
Added support for dotted-names in
model_attribute.Added
GISSERVER_WRAP_FILTER_DB_ERRORSsetting for debugging filter errors.Added API’s for easier subclassing:
FeatureField.xsd_element_class.FeatureField.parentfor elements in a complex feature.gisserver.features.get_basic_field_type().
Fixed CSV output to render datetimes as UTC, identical to GeoJSON
Fixed bugs found by CITE compliance testing:
Fixed support for LIKE operators on string-based foreign keys.
Fixed
<fes:PropertyIsLike>on numeric values, when the field is a string.Fixed comparison of
<fes:PropertyIs..>when the field name and value are reversed.
Improved error messages when using invalid comparison operators.
Optimize feature retrieval, only fetch the actual fields being displayed.
Compactified XML output headers.
2020-07-06 (0.8.4)¶
Added field renaming support with
field(..., model_attribute=...).Added support for WFS 1 parameters TYPENAME and MAXFEATURES.
Improved error handling for FES filters with invalid comparisons.
Fixed GeoJSON support for Decimal/gettext_lazy values.
Fixes for CITE compliance testing for WFS Basic conformance:
Handle
NAMESPACESparameter.Fix missing “application/gml+xml” output format for
GetFeature.Fix namespace prefix support in filters (by stripping them).
Fix support for
<fes:BBOX>with a single operand.Fix
DescribeStoredQueriesto show the actual requested queries.Fix
DescribeFeatureTypecompliance testing by supporting the WFS 1 TYPENAME parameter.Fix
GetFeatureByIdresponse, which missed an xmlns:xsi to parse responses with “xsi:nil” values.Fix
GetFeatureByIdto return a 404 instead of 400 for any ID syntax, including unexpected formats.Fix
GetCapabilitiesby exposing “resolve=local” parameter.Fix exposed WFS capabilities to pass cite WFS Simple conformance
Fixed SORTBY parameter to handle renamed fields.
2020-06-30 (0.8.3)¶
Added
GISSERVER_CAPABILITIES_BOUNDING_BOXsetting.Added
PropertyIsNullsupport (though currently identical toPropertyIsNil).Fixed
DescribeFeatureTypeto return all types when TYPENAMES is not provided.Advertise
ImplementsMinimumXPathinGetCapabilitiesfor cite testing (other servers also do this while being incomplete).
2020-06-30 (0.8.2)¶
Improve XPath matching support, allow “app:” prefix and root elements.
Refactored
FeatureType.resolve_element()to return anXPathMatchobject
2020-06-29 (0.8.1)¶
Added unpaginated GeoJSON support (performance is good enough).
Added basic support for non-namespaced
FILTERqueries, andPropertyNametags (though being WFS1 attributes, clients still use them).Added extra strict check that
ValueReference/Literal/ResourceIdnodes don’t have child nodes.Fixed allowing filtering on unknown or undefined fields (XPaths are now resolved to known elements).
Optimized results streaming by automatically using a queryset-iterator if possible.
Optimized GeoJSON output by no longer selecting the other geometry fields.
Added shortcut properties to
XsdComplexType:gml_elementsandcomplex_elements.
2020-06-25 (0.8)¶
Added preliminary support to render complex field types (e.g. relations).
Added
FeatureType.check_permissions()hook to allow permission checking by subclasses.Added
WFSMethod.validate()hook that allows request validation.Added CSV output format support.
Added infinite pagination support.
Added pagination size settings:
GISSERVER_DEFAULT_MAX_PAGE_SIZE,GISSERVER_CSV_MAX_PAGE_SIZE.Added internal
XsdComplexTypeclass to support complex data schema definitions.Replaced many
FeatureTypemethods to create a stable fields definition API.Replaced
FeatureType.fields_with_typewithFeatureType.xsd_typethat returns anXsdComplexType.Optimized
GetFeatureresponses by omitting aCOUNTquery for the last page.Optimized
GetFeatureresponses by omitting the binary geometry data for DB-optimized rendering.Changed default page size /
DefaultMaxFeaturesto 5000.Fixed detecting
AutoFieldas integer for Django 2.2.Fixed fallback datatype for unknown model fields (should be
xsd:anyType, notxsd:anywhich is an element).Fixed fallback datatype for unknown geometry fields (should be
gml:GeometryPropertyType, not gml:AbstractGeometryType).Fixed error messages for currently unsupported multiple-query KVP requests (e.g.
TYPENAMES=(A)(B)).Fixed raising
InvalidParameterValuefor runtime errors in a customWFSView.get_feature_types()implementation.Enforce using keyword-arguments on
FeatureType(...)Internal code reorganizations/cleanups.
2020-06-08 (0.7)¶
Added database-based rendering for GML/GeoJSON (disable with
GISSERVER_USE_DB_RENDERING=False).Added
has_custom_backendto CRS class.Improved rendering performance for python-based GML output.
Improved
DescribeFeatureTypeto show which geometry type is used in a geometry field.Fixed XML output error for pagination.
Internal code reorganizations/cleanups.
2020-05-14 (0.6)¶
Added
RESOURCEIDparameter support.Added
GetFeatureByIdsupport.Added basic support for defining stored procedures.
Added GML rendering for Polygon / MultiGeometry / MultiLineString / MultiPoint / LineString / LinearRing data.
Fix
<fes:ResourceId>parsing and type selection.Fix output errors because of
AttributeErrorinForeignKeyfields.Fix
DateTimeFieldbeing represented by anxs:dateinstead ofxs:dateTime.Internal code reorganizations/cleanups.
2020-03-23 (0.5)¶
Added
GetPropertyValuesupport.Added empty
ListStoredQueries/DescribeStoredQueriesoperations nearing Simple WFS conformance.Added a lot of built-in FES functions.
Added
FeatureType(fields=...)to limit which fields are exposed (can also use__all__).Backwards incompatible: by default no fields are exposed, unless they are mentioned.
Added pagination links to GeoJSON response, based on WFS 3.0 DRAFT.
Changed
max_page_sizeto reasonable 1000 per page.Fixed
SRSNAMEsupport on GeoJSON output to select the coordinate reference system.Fixed
ResourceIdto extract the ID from the typename.id value.Improved performance of output streaming (buffering output, reducing yield).
Removed lxml dependency, as it’s only used for tests.
Internal code reorganizations/cleanups.
2020-03-11 (0.4)¶
Added response streaming for GML/GeoJSON.
Added
OutputFormat(..., renderer_class=...)API to integrate custom output formats.Added
SORTBYparameter support.Fixed mentioning GML 3.2 instead of 3.1.1 in
GetCapabilities.Fixed exposing FES filter capabilities for
GetCapabilitiesrequest.Fixed error reporting for filter XML that were omitted.
Fixed BBOX and FILTER to be mutually exclusive, as the spec requests.
Fixed ISO formatting for date/datetime/time.
Reverted BBOX operator to intersects (is more correct).
Internal code reorganizations.
2020-03-09 (0.3)¶
Added FES filtering support.
Changed BBOX lookup operator to bboverlaps (uses PostGIS && operator).
Improve field type reporting in DescribeFeatureType.
2020-02-24 (0.2)¶
Added
CRS.from_srid()functionAdded
CRS.apply_to()API for geometry transformation.Added
CRS.backendsetting, which allows assigning a PROJ.4 string to the CRS object.Added support for other geometry types besides
Point(affectedBoundingBox.extend_to_geometry()and GeoJSON output).Added Python 3.6 support.
Improved repeated geometry transformation speed, by using/caching
CoordTransformobjects.Fixed calling
BoundingBox.extend_to_geometry()when crs parameter is not set.Changed
FeatureTypeparameter frommodeltoqueryset.Replaced
ujsonwithorjsonfor faster and better decimal support.
2020-02-12 (0.1)¶
First basic release that works in QGis.
Features:
WFS
GetCapabilitiesWFS
DescribeFeatureTypeWFS
GetFeaturewith bbox and pagination support.