Core
* OGRSQL and SQLite dialect: add STDDEV_POP() and STDDEV_SAMP() aggregate functions
* SQL SQLite dialect: fix translation of "x IN (NULL)" with "recent"
(at least > 3.31.1) versions of SQLite3
* OGRSQL: fix compliance of NOT and IN operators regarding NULL values
* OGRSQL: SQL expression tree to string: add missing parenthesis that could make
further evaluation of operator priority wrong
* OGRSQL: add SELECT expression [AS] OGR_STYLE HIDDEN to be able to specify
feature style string without generating a visible column (10259)
* OGRSQL: use Kahan-Babuska-Neumaier algorithm for accurate SUM()
* OGRSQL: avoid going through string serialization for MIN(), MAX(), SUM(),
AVG() on numeric fields
* OGRSQL: do not query geometry column(s) when not needed
* SQLite SQL dialect: add MEDIAN, PERCENTILE, PERCENTILE_CONT and MODE
ordered-set aggregate functions
* SQLite/GPKG: extend gdal_get_pixel_value()/gdal_get_layer_pixel_value()
to support an interpolation method
* SQLite/GPKG: Add ST_Length(geom, use_ellipsoid)
* GetNextArrowArray() generic implementation: avoid calling
VSI_MALLOC_ALIGNED_AUTO_VERBOSE() with a zero size
* Arrow reading: generic code path (as used by GeoJSON): fix mis-handling of
timezones
* OGRFeature: optimizations while accessing field count
* OGRFeature: SetXXX() methods: more informative warning messages reporting
field name and value for out-of-range values
* Add OGRGeometry::BufferEx() method
* Add OGRGeometry::hasEmptyParts()/removeEmptyParts()
* Add OGRCurve::reversePoints(), and deprecated OGRLinearRing::reverseWindingOrder()
* Add OGRGeometryCollection::stealGeometry()
* Add OGR_G_GeodesicLength() and OGRCurve/OGRSurface/OGRGeometryCollection::get_GeodesicLength()
* make OGR_G_GetLength() work on surfaces, suming the length of their
exterior and interior rings.
* OGR geometry classes: add a bool return type for methods that can fail
* OGR geometry classes: mark default constructors directly in .h and removed
useless overridden destructor for better code generation
* MakeValid(METHOD=STRUCTURE): make sure to return a MULTIPOLYGON if input is
MULTIPOLYGON (10819)
* GML geometry reader: add support for gml:OrientableCurve (10301)
* GenSQL layer: implement OLCFastGetArrowStream when underlying layer does and
for very simple SQL statements
* WKT geometry importer: accept (non conformant) PointZ/PointZM without space as
generated by current QGIS versions
* OGRLineString::SetPoint(): avoid int overflow if passing iPoint = INT_MAX
* OGRCurveCollection::addCurveDirectly(): avoid int overflow if adding to a
already huge collection
* OGRGeometryCollection::addGeometryDirectly(): avoid int overflow if adding to
a already huge collection
* OGRGeometryFactory::transformWithOptions(): in WRAPDATELINE=YES mode, return a
multi polygon if a input multi polygon has been provided (10686)
* OGRGeometryFactory::transformWithOptions(): deal with polar or anti-meridian
discontinuities when going from projected to (any) geographic CRS
* OGRProjCT::TransformWithErrorCodes(): speed-up by avoiding OSRGetProjTLSContext()
when possible
* Add OGRWKBTransform() for in-place coordinate transformation of WKB geometries
* OGR_GreatCircle_ API: do not hardcode Earth radius
* ogr_core.h: suppress warning when building with -Wpedantic for C < 23 (2322)
OGRSpatialReference
* OGRSpatialReference::FindMatches(): improve when input SRS doesn't have
expected axis order
* OGRSpatialReference::EPSGTreatsAsLatLong()/EPSGTreatsAsNorthingEasting():
remove the check on the EPSG authority
* Add OSRGetAuthorityListFromDatabase() to get the list of CRS authorities used
in the PROJ database.
Utilities
* ogr2ogr: add -skipinvalid to skip features whose geometry is not valid w.r.t
Simple Features
* ogr2ogr: error out if WKT argument of -clipsrc/-clipdst is an invalid geometry
(10289)
* ogr2ogr: speed-up -clipsrc/-clipdst by avoiding GEOS when possible
* ogr2ogr: speed-up -t_srs in Arrow code path using multi-threaded coordinate
transformation
* ogr2ogr: optim: call GetArrowStream() only once on source layer when using
Arrow interface
* ogr2ogr: fix -explodecollections on empty geometries (11067)
* validate_gpkg.py: make it robust to CURRENT_TIMESTAMP instead of 'now'
Vector drivers
Multi-driver changes:
* Arrow, CSV, ESRIJSON, JSONFG, GeoJSON, GeoJSONSeq, GML, GTFS, LVBAG, NAS,
OAPIF, TopoJSON:
relax identificationchecks when papszAllowedDrivers[] contains only the
driver name
* GeoJSON like driver: avoid fetching unrecognized HTTP dataset more than once
Arrow ecosystem:
* Arrow/Parquet/generic arrow: add write support for arrow.json extension
* Add a Arrow VSI file system (for libarrow >= 16.0) allowing to use GDAL
VSI file systems as libarrow compatible file systems.
* Add (minimum) support for libarrow 18.0.0
Arrow driver
* add read support for StringView and BinaryView (but not in OGR generic Arrow
code)
* use recommended item names for GeoArrow [multi]line, [multi]polygon, multipoint
CSV driver:
* error out if invalid/inconsistent value for GEOMETRY layer creation option
(10055)
* allow inf, -inf and nan as numeric values
* emit warning when reading invalid WKT (10496)
CSW driver:
* make it buildable as plugin
DGN driver:
* add ENCODING open option and creation option (10630)
DXF driver:
* add a DXF_CLOSED_LINE_AS_POLYGON=YES/NO configuration option (10153)
ESRIJSON driver:
* make it able to parse response of some CadastralSpecialServices APIs (9996)
* use 'alias' field member to set OGR alternative field name
FileGDB/OpenFileGDB drivers:
* update (and unify) list of reserved keywords that can't be used for column
and table names (11094)
JSONFG driver:
* avoid Polyhedron/Prism geometry instantiation during initial scan
GeoJSON driver:
* make it (and companion TopoJSON, ESRIJSON, GeoJSONSeq) optional (but must be
explicitly disabled) and buildable as plugin
* avoid false-positive identification as TopoJSON
GeoJSONSeq driver:
* add a WRITE_BBOX layer creation option
GML driver:
* XSD parser: fix to resolve schema imports using open option USE_SCHEMA_IMPORT
(10500)
* make it buildable as plugin if NAS driver is explicitly disabled
* add a GML_DOWNLOAD_SCHEMA config option matching the DOWNLOAD_SCHEMA open
option (and deprecate undocumented GML_DOWNLOAD_WFS_SCHEMA)
GPKG driver:
* prevent from creating field with same name, or with the name of the geometry
field
* CreateField(): check we are not reaching the max number of fields
* SQLite/GPKG: turn on SQLite 'PRAGMA secure_delete=1' by default
HANA driver:
* Add support for REAL_VECTOR type (10499)
* Add support for fast extent estimation (10543)
KML driver:
* make it optional and buildable as plugin
* writer: generate a Placemark id
LIBKML driver:
* writer: validate longitude, latitude to be in range (10483)
* writer: set name of NetworkLink from NAME layer creation option (10507)
* writer: dump feature when its geometry cannot be written (10829)
* on reading of directory KML datasets, don't consider the root doc.kml as a layer
MapInfo driver:
* make it optional and buildable as plugin
* implement read/write support for MapInfo logical type to OGR OFSTBoolean
* Add UTF-8 encoding
* Disable table fields "laundering" for non-neutral charset
* Add 'STRICT_FIELDS_NAME_LAUNDERING' creation option
* better deal with EPSG:3301 'Estonian Coordinate System of 1997'
Miramon driver:
* various memory leak fixes on corrupted datasets
* fix a case of mutirecord (lists) in some fields (11148)
OAPIF driver:
* combine CURL error message and data payload (when it exists) to form error
message (10653)
* make it buildable as plugin (independently of WFS driver)
* add a DATETIME open option (10909)
OCI driver:
* OCI: use TIMESTAMP(3) and tweak NLS_TIME[STAMP][_TZ]_FORMAT to accept
milliseconds (11057)
ODBC driver:
* add GDAL_DMD_LONGNAME
OpenFileGDB driver:
* add partial read-only support for tables with 64-bit ObjectIDs
* more informative warning message when opening a dataset with a .cdf file and
FileGDB driver isn't there
* error out explicitly when attempting to create an index on multiple columns
OSM driver:
* add a \[general\] section at top of osmconf.ini to make it INI compliant (and
Python's configparser friendly)
* actually reserve memory for /vsimem/ temp files
Parquet driver:
* dataset (multi-file typically) mode: enable use of bounding box columns
for spatial filter; optimize spatial filtering
* dataset mode: implement SetIgnoredFields() and SetAttributeFilter()
* dataset mode: detect bbox geometry column when opening current Overture Maps
* dataset mode: make sure all files are closed before closing the GDALDataset
PDF driver:
* reader: fixes to handle recursive resources, /OC property attached to a
XObjet and an empty UTF-16 layer name (11034)
PostgreSQL driver:
* OGR_PG_SKIP_CONFLICTS: optionally insert with ON CONFLICT DO NOTHING (10156)
* avoid error when the original search_path is empty
Shapefile driver:
* make it optional (but must be explicitly disabled) and buildable as plugin
* Shapelib: resync'ed with upstream
SQLite driver:
* run deferred table creation before StartTransaction
* avoid some potential O(n^2) issues with n=field_count
TileDB driver:
* use GEOM_WKB type when creating geometry columns with TileDB >= 2.21
VRT driver:
* OGRWarpedVRT: use faster SetFrom() implementation (10765)
* UnionLayer: avoid some potential O(n^2) issues with n=field_count
WFS driver:
* make it buildable as plugin
SWIG bindings
* Python/Java: replace sprintf() with snprintf() to avoid warnings on OSX
* fix memleak in gdal.GetConfigOptions()
Python bindings
* generate launcher shell/bat scripts for Python scripts in /swig/python/bin
* make GetStatistics() and ComputeStatistics() return None in case of error (10462)
* Make ogr.DataSource a synonym of gdal.Dataset
* Remove ogr.Driver
* do not emit warnings about not having used UseExceptions() if run under
gdal.ExceptionMgr()
* avoid gdal.ExceptionMgr() to re-throw a GDAL exception already caught under it
* avoid exception emitted and caught under gdal.ExceptionMgr() to cause later issues
* Python scripts: use local exception manager, instead of global UseExceptions()
* check validity of GDALAccess flag passed to gdal.Open()
* make MDArray.Write(array_of_strings) work with a 0-d string variable
* Avoid linear scan in gdal_array.NumericTypeCodeToGDALTypeCode (10694)
* Dataset.Close(): invalidate children before closing dataset
* __init__.py: remove calls to warnings.simplefilter() (11140)
* fix compatibility issue with SWIG 4.3.0 and PYTHONWARNINGS=error
Java bindings
* Make sure a valid UTF-8 string is passed to NewStringUTF()
* OGR module: add various xxxxAsByteArray() method that return a byte[] when
content is not UTF-8 (10521, 10630)
GDAL/OGR 3.9.3 Release Notes
GDAL 3.9.3 is a bugfix release.
Build
* Java bindings: remove unneeded dependency on Java AWT
* Use the right header for std::endian cpl_conv.cpp (C++20 compilation)
* Fix build failure with upstream netcdf caused by _FillValue macro renaming