Compare commits

..

51 Commits

Author SHA1 Message Date
Nyall Dawson
73e4ff232b Add early exit path to hue/saturation filter 2025-06-25 15:02:03 +12:00
Nyall Dawson
2e24086cab Optimize hue/saturation filter
Avoid calling costly per-pixel getters/setters
2025-06-25 15:02:03 +12:00
Nyall Dawson
688afa6fff Slightly delay background render of layout maps in preview
Avoids incurring the main thread preparation cost many times when resizing a layout window
2025-06-25 15:01:28 +12:00
Nyall Dawson
b97c1f9d2d Apply suggestions from code review
Co-authored-by: Andrea Giudiceandrea <andreaerdna@libero.it>
2025-06-25 15:00:51 +12:00
Nyall Dawson
5142e4995a [ogr] Only retrieve layer crs once
Instead of retrieving and converting the layer crs with every
call to ::crs(), just read it once when determining the layer
properties and store for later retrieval.

Speeds up construction of OGR feature sources, which occurs
on the main thread when starting a new map render and adds
significant cost to the map render preparation.
2025-06-25 15:00:51 +12:00
qgis-bot
cd3a1d0710 auto sipify 🍺 2025-06-24 22:22:26 +00:00
Nyall Dawson
48e1efebfc Replace deprecated method calls 2025-06-25 10:19:31 +12:00
Nyall Dawson
9241880300 Fix ambiguity in QgsMapLayer::saveStyleToDatabase API
Don't require successful generation of both QML AND SLD, and return descriptive results flags
2025-06-25 10:19:31 +12:00
Even Rouault
47576382ad [Tests] Disable 7 tests that break due to expired certificate
Workaround for refs #62373
2025-06-24 20:07:50 +02:00
Nyall Dawson
1a019895c9 Apply suggestions from code review 2025-06-24 16:40:06 +12:00
Mathieu Pellerin
f24d4c4f3d Improve layers and bookmarks toolbar actions' tooltip 2025-06-24 16:40:06 +12:00
Mathieu Pellerin
d74364a15b Inform user of absence of spatial layers/bookmarks instead of empty menu 2025-06-24 16:40:06 +12:00
Mathieu Pellerin
47f6704229 [gui][layouts] Add set extent to layer item in the map item's toolbar menu 2025-06-24 16:40:06 +12:00
github-actions[bot]
27b6e08dd5 auto-fix pre-commit issues 2025-06-24 16:39:30 +12:00
Nyall Dawson
199373300c Apply suggestions from code review 2025-06-24 16:39:30 +12:00
pgipper
a9fc79985d append default file name to lastUsedDir 2025-06-24 16:39:30 +12:00
github-actions[bot]
cbdf99ccf0 auto-fix pre-commit issues 2025-06-24 16:38:21 +12:00
Viper MiniQ
46b04269cf create algorithm instance before making a decision
Co-authored-by: Nyall Dawson <nyall.dawson@gmail.com>
2025-06-24 16:38:21 +12:00
github-actions[bot]
5a09c69587 auto-fix pre-commit issues 2025-06-24 16:38:21 +12:00
viperminiq
3323834409 use better logic when opening dialogs 2025-06-24 16:38:21 +12:00
github-actions[bot]
0da56166d8 auto-fix pre-commit issues 2025-06-24 16:38:21 +12:00
viperminiq
c1396bd314 add decision gdal or native dialog 2025-06-24 16:38:21 +12:00
viperminiq
9456e8a529 load GdalAlgorithmDialog containing console call widget instead of basic AlgorithmDialog 2025-06-24 16:38:21 +12:00
Jean Felder
e069fd7731 testqgs3dcameracontroller: Now test for navigation mode shortcut change 2025-06-24 14:44:56 +12:00
qgis-bot
9d0f20dae9 auto sipify 🍺 2025-06-23 23:17:56 +00:00
uclaros
fa7681b449 Add points on intersections by default when tracing 2025-06-24 11:14:54 +12:00
uclaros
5ba6b15383 Fix reshape when snapping to segment 2025-06-24 11:14:09 +12:00
uclaros
124a285e77 Don't crash when undoing first digitized point 2025-06-24 11:12:14 +12:00
Alessandro Pasotti
c734e1fad3 more tidy warnings 2025-06-24 11:11:32 +12:00
Alessandro Pasotti
807a784d36 Remove unused if 2025-06-24 11:11:32 +12:00
Alessandro Pasotti
06487d711e More ogc utils tests 2025-06-24 11:11:32 +12:00
Alessandro Pasotti
fc7e16fe43 tidy warnings 2025-06-24 11:11:32 +12:00
Alessandro Pasotti
c275af3086 Fix multipolygon gml and add more tests 2025-06-24 11:11:32 +12:00
Alessandro Pasotti
ae2cf3bed9 Expose QgsPolyline to SIP 2025-06-24 11:11:32 +12:00
Alessandro Pasotti
55a1e38843 doxy 2025-06-24 11:11:32 +12:00
Alessandro Pasotti
89e165dfdf [GML] Add parsing support for Z geometries
Funded by: QGIS Danish User Group
2025-06-24 11:11:32 +12:00
uclaros
1dbeb61e0b Fix reshaping whith an active selection 2025-06-24 11:11:11 +12:00
Stefanos Natsis
5d0056940c
Don't trigger reshape logic when using less than two points (#62324) 2025-06-24 09:09:47 +10:00
Jean Felder
7cb5ca3bd2 testqgs3dcameracontroller: Ensure proper OpenGL context
This fixes the following warning in `testResetViewRaster` and
`testResetViewPointCloud` tests:

```
Failed to make context current: OpenGL resources will not be destroyed
```
2025-06-24 11:06:31 +12:00
Even Rouault
9d459a0c40 Rename C++ class GEOSException to QgsGeosException
This will help making it clear that this is a QGIS C++ class and help
reducing the confusion with GEOS own geos::util::GEOSException class.
2025-06-24 11:04:11 +12:00
Even Rouault
1637be8a37
Merge pull request #62322 from uclaros/fix-reshape-exception
Handle GEOS exception when reshaping polygons
2025-06-23 10:41:10 +01:00
Juergen E. Fischer
efaafaecdc run scripts/scandeps.pl 2025-06-23 06:33:32 +00:00
Juergen E. Fischer
944a3d5898 debian packaging: disable webkit on sid, trixie and plucky 2025-06-23 06:33:32 +00:00
Andrea Giudiceandrea
e69e8341d6 [DXF] add INSUNITS and MEASUREMENT creation options (GDAL >= 3.11)
Ref. https://github.com/OSGeo/gdal/pull/11424
2025-06-21 11:56:34 +02:00
Alexander Bruy
fb2e3c41ee
Merge pull request #62233 from elpaso/bugfix-gh62231-select-by-expression
Fix select by expression
2025-06-21 08:51:04 +01:00
Matthias Kuhn
3c3a505508
Merge pull request #62350 from stefantalpalaru/gcc-15
fix compilation with GCC-15
2025-06-21 05:37:18 +02:00
Ștefan Talpalaru
148c1ce34d
fix compilation with GCC-15 2025-06-20 18:06:44 +02:00
Juergen E. Fischer
030387a838 Bump version to 3.99 2025-06-20 14:09:51 +02:00
uclaros
b1c56b434c Add test, also check resulting pointer 2025-06-19 12:50:47 +03:00
uclaros
a43423807b Handle exception in GEOSGeom_createLinearRing_r 2025-06-18 16:36:52 +03:00
Alessandro Pasotti
0fa98ae3d6 Fix select by expression
Layer scope was missing from the expression context

Fix #62231
2025-06-10 17:13:48 +02:00
71 changed files with 2270 additions and 1171 deletions

View File

@ -1,7 +1,7 @@
[main] [main]
host = https://www.transifex.com host = https://www.transifex.com
[o:qgis:p:QGIS:r:release-3_44-qgis-application] [o:qgis:p:QGIS:r:qgis-application]
file_filter = i18n/qgis_<lang>.ts file_filter = i18n/qgis_<lang>.ts
source_file = i18n/qgis_en.ts source_file = i18n/qgis_en.ts
source_lang = en source_lang = en

View File

@ -59,10 +59,10 @@ endif()
############################################################# #############################################################
# Project and version # Project and version
set(CPACK_PACKAGE_VERSION_MAJOR "3") set(CPACK_PACKAGE_VERSION_MAJOR "3")
set(CPACK_PACKAGE_VERSION_MINOR "44") set(CPACK_PACKAGE_VERSION_MINOR "99")
set(CPACK_PACKAGE_VERSION_PATCH "0") set(CPACK_PACKAGE_VERSION_PATCH "0")
set(COMPLETE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}) set(COMPLETE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
set(RELEASE_NAME "Solothurn") set(RELEASE_NAME "Master")
project(qgis VERSION ${COMPLETE_VERSION}) project(qgis VERSION ${COMPLETE_VERSION})
if (APPLE) if (APPLE)

View File

@ -179,14 +179,16 @@ sudo apt-get update
|Distribution|Install command for packages| |Distribution|Install command for packages|
|------------|----------------------------| |------------|----------------------------|
| bullseye | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpdal-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build ocl-icd-opencl-dev opencl-headers pandoc pdal pkg-config poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-sip python3-sip-dev python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qt5keychain-dev qtbase5-dev qtbase5-private-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` | | bookworm | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build nlohmann-json3-dev ocl-icd-opencl-dev opencl-headers pandoc pkgconf poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-packaging python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
| bookworm | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build ocl-icd-opencl-dev opencl-headers pandoc pkg-config poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` | | trixie | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build nlohmann-json3-dev ocl-icd-opencl-dev opencl-headers pandoc pkgconf poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-packaging python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
| jammy | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpdal-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build ocl-icd-opencl-dev opencl-headers pandoc pdal pkg-config poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` | | jammy | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpdal-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build nlohmann-json3-dev ocl-icd-opencl-dev opencl-headers pandoc pdal pkgconf poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-packaging python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
| kinetic | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build ocl-icd-opencl-dev opencl-headers pandoc pkg-config poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` | | kinetic | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build nlohmann-json3-dev ocl-icd-opencl-dev opencl-headers pandoc pkgconf poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-packaging python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
| lunar | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build ocl-icd-opencl-dev opencl-headers pandoc pkg-config poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` | | lunar | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build nlohmann-json3-dev ocl-icd-opencl-dev opencl-headers pandoc pkgconf poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-packaging python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
| mantic | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build ocl-icd-opencl-dev opencl-headers pandoc pkg-config poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` | | mantic | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build nlohmann-json3-dev ocl-icd-opencl-dev opencl-headers pandoc pkgconf poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-packaging python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
| noble | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build ocl-icd-opencl-dev opencl-headers pandoc pkg-config poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` | | noble | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build nlohmann-json3-dev ocl-icd-opencl-dev opencl-headers pandoc pkgconf poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-packaging python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
| sid | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build ocl-icd-opencl-dev opencl-headers pandoc pkg-config poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` | | oracular | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build nlohmann-json3-dev ocl-icd-opencl-dev opencl-headers pandoc pkgconf poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-packaging python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
| plucky | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build nlohmann-json3-dev ocl-icd-opencl-dev opencl-headers pandoc pkgconf poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-packaging python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
| sid | ``apt-get install bison build-essential ca-certificates ccache cmake cmake-curses-gui dh-python expect flex flip gdal-bin git graphviz grass-dev libdraco-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build nlohmann-json3-dev ocl-icd-opencl-dev opencl-headers pandoc pkgconf poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dev python3-gdal python3-jinja2 python3-lxml python3-mock python3-nose2 python3-owslib python3-packaging python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtmultimedia python3-pyqt5.qtpositioning python3-pyqt5.qtserialport python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqtbuild python3-sip python3-termcolor python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qtbase5-dev qtbase5-private-dev qtkeychain-qt5-dev qtmultimedia5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools sip-tools spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
(extracted from the control.in file in `debian/`) (extracted from the control.in file in `debian/`)
@ -651,7 +653,7 @@ For the QGIS build you need to install following packages from cygwin:
and from OSGeo4W (select *Advanced Install*): and from OSGeo4W (select *Advanced Install*):
* qgis-rel-deps * qgis-dev-deps
* This will also select packages the above packages depend on. * This will also select packages the above packages depend on.

10
debian/changelog vendored
View File

@ -1,8 +1,14 @@
qgis (3.44.0) UNRELEASED; urgency=medium qgis (3.99.0) UNRELEASED; urgency=medium
* New development version 3.99 after branch of 3.44
-- Jürgen E. Fischer <jef@norbit.de> Fri, 20 Jun 2025 14:09:51 +0200
qgis (3.44.0) unstable; urgency=medium
* Release of 3.44.0 * Release of 3.44.0
-- Jürgen E. Fischer <jef@norbit.de> Fri, 20 Jun 2025 14:08:50 +0200 -- Jürgen E. Fischer <jef@norbit.de> Fri, 20 Jun 2025 14:09:51 +0200
qgis (3.43.0) unstable; urgency=medium qgis (3.43.0) unstable; urgency=medium

3
debian/control vendored
View File

@ -27,7 +27,6 @@ Build-Depends:
libqt5serialport5-dev, libqt5serialport5-dev,
libqt5sql5-sqlite, libqt5sql5-sqlite,
libqt5svg5-dev, libqt5svg5-dev,
libqt5webkit5-dev,
libqt5xmlpatterns5-dev, libqt5xmlpatterns5-dev,
libqwt-qt5-dev, libqwt-qt5-dev,
libspatialindex-dev, libspatialindex-dev,
@ -271,7 +270,6 @@ Depends:
libqgispython2.99.0 (= ${binary:Version}), libqgispython2.99.0 (= ${binary:Version}),
libqscintilla2-qt5-dev, libqscintilla2-qt5-dev,
libqt5svg5-dev, libqt5svg5-dev,
libqt5webkit5-dev,
libqwt-qt5-dev, libqwt-qt5-dev,
libsqlite3-dev, libsqlite3-dev,
pyqt5-dev-tools, pyqt5-dev-tools,
@ -374,7 +372,6 @@ Depends:
python3-pyqt5.qtpositioning, python3-pyqt5.qtpositioning,
python3-pyqt5.qtsql, python3-pyqt5.qtsql,
python3-pyqt5.qtsvg, python3-pyqt5.qtsvg,
python3-pyqt5.qtwebkit,
python3-sip, python3-sip,
python3-yaml, python3-yaml,
${python3:Depends}, ${python3:Depends},

6
debian/control.in vendored
View File

@ -27,7 +27,7 @@ Build-Depends:
libqt5serialport5-dev, libqt5serialport5-dev,
libqt5sql5-sqlite, libqt5sql5-sqlite,
libqt5svg5-dev, libqt5svg5-dev,
libqt5webkit5-dev, #bookworm jammy kinetic lunar mantic noble oracular# libqt5webkit5-dev,
libqt5xmlpatterns5-dev, libqt5xmlpatterns5-dev,
libdraco-dev, libdraco-dev,
qtmultimedia5-dev, qtmultimedia5-dev,
@ -288,7 +288,7 @@ Depends:
libqgispython{QGIS_ABI} (= ${binary:Version}), libqgispython{QGIS_ABI} (= ${binary:Version}),
libqscintilla2-qt5-dev, libqscintilla2-qt5-dev,
libqt5svg5-dev, libqt5svg5-dev,
libqt5webkit5-dev, #bookworm jammy kinetic lunar mantic noble oracular# libqt5webkit5-dev,
libqwt-qt5-dev, libqwt-qt5-dev,
libsqlite3-dev, libsqlite3-dev,
nlohmann-json3-dev, nlohmann-json3-dev,
@ -394,7 +394,7 @@ Depends:
python3-pyqt5.qtmultimedia, python3-pyqt5.qtmultimedia,
python3-pyqt5.qtpositioning, python3-pyqt5.qtpositioning,
python3-pyqt5.qtsvg, python3-pyqt5.qtsvg,
python3-pyqt5.qtwebkit, #bookworm jammy kinetic lunar mantic noble oracular# python3-pyqt5.qtwebkit,
python3-pyqt5.qtserialport, python3-pyqt5.qtserialport,
python3-sip, python3-sip,
python3-yaml, python3-yaml,

5
debian/rules vendored
View File

@ -115,6 +115,11 @@ ifneq (,$(findstring ;$(GRASSVER);, ";7;8;"))
-DGRASS_PREFIX$(GRASSVER)=/usr/lib/$(GRASS) -DGRASS_PREFIX$(GRASSVER)=/usr/lib/$(GRASS)
endif endif
ifneq (,$(filter $(DISTRIBUTION),sid trixie plucky))
CMAKE_OPTS += \
-DWITH_QTWEBKIT=FALSE
endif
ifneq (,$(findstring $(DISTRIBUTION),"trixie sid kinetic lunar mantic noble oracular plucky")) ifneq (,$(findstring $(DISTRIBUTION),"trixie sid kinetic lunar mantic noble oracular plucky"))
CMAKE_OPTS += -DGDAL_LIBRARY=/usr/lib/$(DEB_BUILD_MULTIARCH)/libgdal.so CMAKE_OPTS += -DGDAL_LIBRARY=/usr/lib/$(DEB_BUILD_MULTIARCH)/libgdal.so
endif endif

View File

@ -33,6 +33,7 @@ the documentation</a> available.
See \ref api_break for information about incompatible changes to API between releases. See \ref api_break for information about incompatible changes to API between releases.
Earlier versions of the documentation are also available on the QGIS website: Earlier versions of the documentation are also available on the QGIS website:
<a href="https://qgis.org/api/3.44">3.44</a>,
<a href="https://qgis.org/api/3.42">3.42</a>, <a href="https://qgis.org/api/3.42">3.42</a>,
<a href="https://qgis.org/api/3.40">3.40 (LTR)</a>, <a href="https://qgis.org/api/3.40">3.40 (LTR)</a>,
<a href="https://qgis.org/api/3.38">3.38</a>, <a href="https://qgis.org/api/3.38">3.38</a>,

View File

@ -339,6 +339,7 @@
<file>themes/default/mActionKeyboardShortcuts.svg</file> <file>themes/default/mActionKeyboardShortcuts.svg</file>
<file>themes/default/mActionLabel.svg</file> <file>themes/default/mActionLabel.svg</file>
<file>themes/default/mActionLabeling.svg</file> <file>themes/default/mActionLabeling.svg</file>
<file>themes/default/mActionLayers.svg</file>
<file>themes/default/mActionLocalCumulativeCutStretch.svg</file> <file>themes/default/mActionLocalCumulativeCutStretch.svg</file>
<file>themes/default/mActionLocalHistogramStretch.svg</file> <file>themes/default/mActionLocalHistogramStretch.svg</file>
<file>themes/default/mActionLockItems.svg</file> <file>themes/default/mActionLockItems.svg</file>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 9.6 MiB

View File

@ -0,0 +1 @@
<svg height="24" viewBox="0 0 6.35 6.35" width="24" xmlns="http://www.w3.org/2000/svg"><g fill="#eeeeec" stroke="#888a85" stroke-linecap="round" stroke-linejoin="round" stroke-width=".265"><path d="m.661 2.778h2.91v2.91h-2.909z"/><path d="m1.72 1.72h2.91v2.91h-2.91z"/><path d="m2.778.661h2.91v2.91h-2.91z"/></g></svg>

After

Width:  |  Height:  |  Size: 318 B

View File

@ -37,6 +37,26 @@ QgsMapLayer.FlagTrustLayerMetadata = QgsMapLayer.ReadFlag.FlagTrustLayerMetadata
QgsMapLayer.FlagReadExtentFromXml = QgsMapLayer.ReadFlag.FlagReadExtentFromXml QgsMapLayer.FlagReadExtentFromXml = QgsMapLayer.ReadFlag.FlagReadExtentFromXml
QgsMapLayer.FlagForceReadOnly = QgsMapLayer.ReadFlag.FlagForceReadOnly QgsMapLayer.FlagForceReadOnly = QgsMapLayer.ReadFlag.FlagForceReadOnly
QgsMapLayer.ReadFlags = lambda flags=0: QgsMapLayer.ReadFlag(flags) QgsMapLayer.ReadFlags = lambda flags=0: QgsMapLayer.ReadFlag(flags)
# monkey patching scoped based enum
QgsMapLayer.SaveStyleResult.Success.__doc__ = "Both QML and SLD formats were successfully written to the database."
QgsMapLayer.SaveStyleResult.QmlGenerationFailed.__doc__ = "Generation of the QML failed, and was not written to the database."
QgsMapLayer.SaveStyleResult.SldGenerationFailed.__doc__ = "Generation of the SLD failed, and was not written to the database."
QgsMapLayer.SaveStyleResult.DatabaseWriteFailed.__doc__ = "An error occurred when attempting to write to the database."
QgsMapLayer.SaveStyleResult.__doc__ = """Results of saving styles to database.
.. versionadded:: 4.0
* ``Success``: Both QML and SLD formats were successfully written to the database.
* ``QmlGenerationFailed``: Generation of the QML failed, and was not written to the database.
* ``SldGenerationFailed``: Generation of the SLD failed, and was not written to the database.
* ``DatabaseWriteFailed``: An error occurred when attempting to write to the database.
"""
# --
QgsMapLayer.SaveStyleResult.baseClass = QgsMapLayer
QgsMapLayer.SaveStyleResults = lambda flags=0: QgsMapLayer.SaveStyleResult(flags)
QgsMapLayer.SaveStyleResults.baseClass = QgsMapLayer
SaveStyleResults = QgsMapLayer # dirty hack since SIP seems to introduce the flags in module
from enum import Enum from enum import Enum

View File

@ -16,7 +16,9 @@
typedef QVector<QgsPointXY> QgsPolylineXY; typedef QVector<QgsPointXY> QgsPolylineXY;
typedef QgsPointSequence QgsPolyline; typedef QVector<QgsPoint> QgsPolyline;
typedef QVector<QVector< QgsPoint >> QgsMultiPolyline;
typedef QVector<QVector<QgsPointXY>> QgsPolygonXY; typedef QVector<QVector<QgsPointXY>> QgsPolygonXY;

View File

@ -825,12 +825,24 @@ Deletes a style from the database
- msgError: a descriptive error message if any occurs - msgError: a descriptive error message if any occurs
%End %End
enum class SaveStyleResult
{
Success,
QmlGenerationFailed,
SldGenerationFailed,
DatabaseWriteFailed,
};
typedef QFlags<QgsMapLayer::SaveStyleResult> SaveStyleResults;
virtual void saveStyleToDatabase( const QString &name, const QString &description, virtual void saveStyleToDatabase( const QString &name, const QString &description,
bool useAsDefault, const QString &uiFileContent, bool useAsDefault, const QString &uiFileContent,
QString &msgError /Out/, QString &msgError /Out/,
QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories ); QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories ) /Deprecated="Since 4.0. Use saveStyleToDatabaseV2() instead."/;
%Docstring %Docstring
Saves named and sld style of the layer to the style table in the db. Saves QML and SLD representations of the layer's style to a table in the
database.
:param name: Style name :param name: Style name
:param description: A description of the style :param description: A description of the style
@ -847,9 +859,33 @@ Saves named and sld style of the layer to the style table in the db.
Use :py:func:`QgsProviderRegistry.styleExists()` to test in advance if a style already exists and handle this appropriately Use :py:func:`QgsProviderRegistry.styleExists()` to test in advance if a style already exists and handle this appropriately
in your client code. in your client code.
:return: a descriptive error message if any occurs :return: - msgError: a descriptive error message if any occurs
.. deprecated:: 4.0
Use :py:func:`~QgsMapLayer.saveStyleToDatabaseV2` instead.
%End %End
QgsMapLayer::SaveStyleResults saveStyleToDatabaseV2( const QString &name, const QString &description,
bool useAsDefault, const QString &uiFileContent,
QString &msgError /Out/,
QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories );
%Docstring
Saves QML and SLD representations of the layer's style to a table in the
database.
:param name: Style name
:param description: A description of the style
:param useAsDefault: Set to ``True`` if style should be used as the
default style for the layer
:param uiFileContent:
:param categories: the style categories to be saved.
:return: - flags representing whether QML or SLD storing was successful
- msgError: a descriptive error message if any occurs
.. versionadded:: 4.0
%End
virtual QString loadNamedStyle( const QString &theURI, bool &resultFlag /Out/, bool loadFromLocalDb, virtual QString loadNamedStyle( const QString &theURI, bool &resultFlag /Out/, bool loadFromLocalDb,

View File

@ -217,6 +217,8 @@ Creates an OGC expression XML element from the ``exp`` expression.
}; };
/************************************************************************ /************************************************************************
* This file has been generated automatically from * * This file has been generated automatically from *
* * * *

View File

@ -4938,205 +4938,205 @@ QgsGeographicCoordinateNumericFormat.sortKey: src/core/numericformats/qgscoordin
QgsGeographicCoordinateNumericFormat.suggestSampleValue: src/core/numericformats/qgscoordinatenumericformat.h#L53 QgsGeographicCoordinateNumericFormat.suggestSampleValue: src/core/numericformats/qgscoordinatenumericformat.h#L53
QgsGeographicCoordinateNumericFormat.visibleName: src/core/numericformats/qgscoordinatenumericformat.h#L51 QgsGeographicCoordinateNumericFormat.visibleName: src/core/numericformats/qgscoordinatenumericformat.h#L51
QgsGeographicCoordinateNumericFormat: src/core/numericformats/qgscoordinatenumericformat.h#L28 QgsGeographicCoordinateNumericFormat: src/core/numericformats/qgscoordinatenumericformat.h#L28
QgsGeometry.Error.Error: src/core/geometry/qgsgeometry.h#L2760 QgsGeometry.Error.Error: src/core/geometry/qgsgeometry.h#L2777
QgsGeometry.Error.__repr__: src/core/geometry/qgsgeometry.h#L2783 QgsGeometry.Error.__repr__: src/core/geometry/qgsgeometry.h#L2800
QgsGeometry.Error.hasWhere: src/core/geometry/qgsgeometry.h#L2780 QgsGeometry.Error.hasWhere: src/core/geometry/qgsgeometry.h#L2797
QgsGeometry.Error.what: src/core/geometry/qgsgeometry.h#L2770 QgsGeometry.Error.what: src/core/geometry/qgsgeometry.h#L2787
QgsGeometry.Error.where: src/core/geometry/qgsgeometry.h#L2775 QgsGeometry.Error.where: src/core/geometry/qgsgeometry.h#L2792
QgsGeometry.Error: src/core/geometry/qgsgeometry.h#L2751 QgsGeometry.Error: src/core/geometry/qgsgeometry.h#L2768
QgsGeometry.QVariant: src/core/geometry/qgsgeometry.h#L3180 QgsGeometry.QVariant: src/core/geometry/qgsgeometry.h#L3197
QgsGeometry.QgsGeometry: src/core/geometry/qgsgeometry.h#L184 QgsGeometry.QgsGeometry: src/core/geometry/qgsgeometry.h#L201
QgsGeometry.__repr__: src/core/geometry/qgsgeometry.h#L2185 QgsGeometry.__repr__: src/core/geometry/qgsgeometry.h#L2202
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L930 QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L947
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L948 QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L965
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L966 QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L983
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L982 QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L999
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L939 QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L956
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L957 QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L974
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L975 QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L992
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L914 QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L931
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L921 QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L938
QgsGeometry.addTopologicalPoint: src/core/geometry/qgsgeometry.h#L815 QgsGeometry.addTopologicalPoint: src/core/geometry/qgsgeometry.h#L832
QgsGeometry.adjacentVertices: src/core/geometry/qgsgeometry.h#L778 QgsGeometry.adjacentVertices: src/core/geometry/qgsgeometry.h#L795
QgsGeometry.angleAtVertex: src/core/geometry/qgsgeometry.h#L764 QgsGeometry.angleAtVertex: src/core/geometry/qgsgeometry.h#L781
QgsGeometry.applyDashPattern: src/core/geometry/qgsgeometry.h#L1372 QgsGeometry.applyDashPattern: src/core/geometry/qgsgeometry.h#L1389
QgsGeometry.area: src/core/geometry/qgsgeometry.h#L476 QgsGeometry.area: src/core/geometry/qgsgeometry.h#L493
QgsGeometry.asJson: src/core/geometry/qgsgeometry.h#L2204 QgsGeometry.asJson: src/core/geometry/qgsgeometry.h#L2221
QgsGeometry.asMultiPoint: src/core/geometry/qgsgeometry.h#L2418 QgsGeometry.asMultiPoint: src/core/geometry/qgsgeometry.h#L2435
QgsGeometry.asMultiPolygon: src/core/geometry/qgsgeometry.h#L2508 QgsGeometry.asMultiPolygon: src/core/geometry/qgsgeometry.h#L2525
QgsGeometry.asMultiPolyline: src/core/geometry/qgsgeometry.h#L2463 QgsGeometry.asMultiPolyline: src/core/geometry/qgsgeometry.h#L2480
QgsGeometry.asPoint: src/core/geometry/qgsgeometry.h#L2283 QgsGeometry.asPoint: src/core/geometry/qgsgeometry.h#L2300
QgsGeometry.asPolygon: src/core/geometry/qgsgeometry.h#L2375 QgsGeometry.asPolygon: src/core/geometry/qgsgeometry.h#L2392
QgsGeometry.asPolyline: src/core/geometry/qgsgeometry.h#L2330 QgsGeometry.asPolyline: src/core/geometry/qgsgeometry.h#L2347
QgsGeometry.asQPointF: src/core/geometry/qgsgeometry.h#L2538 QgsGeometry.asQPointF: src/core/geometry/qgsgeometry.h#L2555
QgsGeometry.asQPolygonF: src/core/geometry/qgsgeometry.h#L2551 QgsGeometry.asQPolygonF: src/core/geometry/qgsgeometry.h#L2568
QgsGeometry.asWkb: src/core/geometry/qgsgeometry.h#L2175 QgsGeometry.asWkb: src/core/geometry/qgsgeometry.h#L2192
QgsGeometry.asWkt: src/core/geometry/qgsgeometry.h#L2182 QgsGeometry.asWkt: src/core/geometry/qgsgeometry.h#L2199
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2626 QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2643
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2627 QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2644
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2640 QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2657
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2641 QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2658
QgsGeometry.boundingBox3D: src/core/geometry/qgsgeometry.h#L1206 QgsGeometry.boundingBox3D: src/core/geometry/qgsgeometry.h#L1223
QgsGeometry.boundingBox: src/core/geometry/qgsgeometry.h#L1199 QgsGeometry.boundingBox: src/core/geometry/qgsgeometry.h#L1216
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1447 QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1464
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1457 QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1474
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1544 QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1561
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1557 QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1574
QgsGeometry.centroid: src/core/geometry/qgsgeometry.h#L1686 QgsGeometry.centroid: src/core/geometry/qgsgeometry.h#L1703
QgsGeometry.clipped: src/core/geometry/qgsgeometry.h#L2022 QgsGeometry.clipped: src/core/geometry/qgsgeometry.h#L2039
QgsGeometry.closestSegmentWithContext: src/core/geometry/qgsgeometry.h#L907 QgsGeometry.closestSegmentWithContext: src/core/geometry/qgsgeometry.h#L924
QgsGeometry.closestVertex: src/core/geometry/qgsgeometry.h#L747 QgsGeometry.closestVertex: src/core/geometry/qgsgeometry.h#L764
QgsGeometry.closestVertexWithContext: src/core/geometry/qgsgeometry.h#L894 QgsGeometry.closestVertexWithContext: src/core/geometry/qgsgeometry.h#L911
QgsGeometry.collectGeometry: src/core/geometry/qgsgeometry.h#L330 QgsGeometry.collectGeometry: src/core/geometry/qgsgeometry.h#L347
QgsGeometry.combine: src/core/geometry/qgsgeometry.h#L2038 QgsGeometry.combine: src/core/geometry/qgsgeometry.h#L2055
QgsGeometry.compare: src/core/geometry/qgsgeometry.h#L3013 QgsGeometry.compare: src/core/geometry/qgsgeometry.h#L3030
QgsGeometry.concaveHull: src/core/geometry/qgsgeometry.h#L1816 QgsGeometry.concaveHull: src/core/geometry/qgsgeometry.h#L1833
QgsGeometry.constGet: src/core/geometry/qgsgeometry.h#L205 QgsGeometry.constGet: src/core/geometry/qgsgeometry.h#L222
QgsGeometry.constParts: src/core/geometry/qgsgeometry.h#L656 QgsGeometry.constParts: src/core/geometry/qgsgeometry.h#L673
QgsGeometry.constrainedDelaunayTriangulation: src/core/geometry/qgsgeometry.h#L1858 QgsGeometry.constrainedDelaunayTriangulation: src/core/geometry/qgsgeometry.h#L1875
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1462 QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1479
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1469 QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1486
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1480 QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1497
QgsGeometry.convertGeometryCollectionToSubclass: src/core/geometry/qgsgeometry.h#L2613 QgsGeometry.convertGeometryCollectionToSubclass: src/core/geometry/qgsgeometry.h#L2630
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3167 QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3184
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3174 QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3191
QgsGeometry.convertToCurvedMultiType: src/core/geometry/qgsgeometry.h#L2591 QgsGeometry.convertToCurvedMultiType: src/core/geometry/qgsgeometry.h#L2608
QgsGeometry.convertToCurves: src/core/geometry/qgsgeometry.h#L1671 QgsGeometry.convertToCurves: src/core/geometry/qgsgeometry.h#L1688
QgsGeometry.convertToMultiType: src/core/geometry/qgsgeometry.h#L2574 QgsGeometry.convertToMultiType: src/core/geometry/qgsgeometry.h#L2591
QgsGeometry.convertToSingleType: src/core/geometry/qgsgeometry.h#L2602 QgsGeometry.convertToSingleType: src/core/geometry/qgsgeometry.h#L2619
QgsGeometry.convertToStraightSegment: src/core/geometry/qgsgeometry.h#L2847 QgsGeometry.convertToStraightSegment: src/core/geometry/qgsgeometry.h#L2864
QgsGeometry.convertToType: src/core/geometry/qgsgeometry.h#L2256 QgsGeometry.convertToType: src/core/geometry/qgsgeometry.h#L2273
QgsGeometry.convexHull: src/core/geometry/qgsgeometry.h#L1801 QgsGeometry.convexHull: src/core/geometry/qgsgeometry.h#L1818
QgsGeometry.createGeometryEngine: src/core/geometry/qgsgeometry.h#L3160 QgsGeometry.createGeometryEngine: src/core/geometry/qgsgeometry.h#L3177
QgsGeometry.createPolygonFromQPolygonF: src/core/geometry/qgsgeometry.h#L2956 QgsGeometry.createPolygonFromQPolygonF: src/core/geometry/qgsgeometry.h#L2973
QgsGeometry.createPolylineFromQPolygonF: src/core/geometry/qgsgeometry.h#L2947 QgsGeometry.createPolylineFromQPolygonF: src/core/geometry/qgsgeometry.h#L2964
QgsGeometry.createWedgeBuffer: src/core/geometry/qgsgeometry.h#L347 QgsGeometry.createWedgeBuffer: src/core/geometry/qgsgeometry.h#L364
QgsGeometry.createWedgeBufferFromAngles: src/core/geometry/qgsgeometry.h#L363 QgsGeometry.createWedgeBufferFromAngles: src/core/geometry/qgsgeometry.h#L380
QgsGeometry.crosses: src/core/geometry/qgsgeometry.h#L1535 QgsGeometry.crosses: src/core/geometry/qgsgeometry.h#L1552
QgsGeometry.delaunayTriangulation: src/core/geometry/qgsgeometry.h#L1844 QgsGeometry.delaunayTriangulation: src/core/geometry/qgsgeometry.h#L1861
QgsGeometry.deletePart: src/core/geometry/qgsgeometry.h#L2564 QgsGeometry.deletePart: src/core/geometry/qgsgeometry.h#L2581
QgsGeometry.deleteRing: src/core/geometry/qgsgeometry.h#L2558 QgsGeometry.deleteRing: src/core/geometry/qgsgeometry.h#L2575
QgsGeometry.deleteVertex: src/core/geometry/qgsgeometry.h#L846 QgsGeometry.deleteVertex: src/core/geometry/qgsgeometry.h#L863
QgsGeometry.densifyByCount: src/core/geometry/qgsgeometry.h#L1639 QgsGeometry.densifyByCount: src/core/geometry/qgsgeometry.h#L1656
QgsGeometry.densifyByDistance: src/core/geometry/qgsgeometry.h#L1654 QgsGeometry.densifyByDistance: src/core/geometry/qgsgeometry.h#L1671
QgsGeometry.difference: src/core/geometry/qgsgeometry.h#L2063 QgsGeometry.difference: src/core/geometry/qgsgeometry.h#L2080
QgsGeometry.disjoint: src/core/geometry/qgsgeometry.h#L1491 QgsGeometry.disjoint: src/core/geometry/qgsgeometry.h#L1508
QgsGeometry.distance: src/core/geometry/qgsgeometry.h#L500 QgsGeometry.distance: src/core/geometry/qgsgeometry.h#L517
QgsGeometry.distanceToVertex: src/core/geometry/qgsgeometry.h#L756 QgsGeometry.distanceToVertex: src/core/geometry/qgsgeometry.h#L773
QgsGeometry.draw: src/core/geometry/qgsgeometry.h#L2866 QgsGeometry.draw: src/core/geometry/qgsgeometry.h#L2883
QgsGeometry.equals: src/core/geometry/qgsgeometry.h#L414 QgsGeometry.equals: src/core/geometry/qgsgeometry.h#L431
QgsGeometry.extendLine: src/core/geometry/qgsgeometry.h#L1626 QgsGeometry.extendLine: src/core/geometry/qgsgeometry.h#L1643
QgsGeometry.extrude: src/core/geometry/qgsgeometry.h#L2079 QgsGeometry.extrude: src/core/geometry/qgsgeometry.h#L2096
QgsGeometry.forcePolygonClockwise: src/core/geometry/qgsgeometry.h#L2733 QgsGeometry.forcePolygonClockwise: src/core/geometry/qgsgeometry.h#L2750
QgsGeometry.forcePolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2745 QgsGeometry.forcePolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2762
QgsGeometry.forceRHR: src/core/geometry/qgsgeometry.h#L2721 QgsGeometry.forceRHR: src/core/geometry/qgsgeometry.h#L2738
QgsGeometry.frechetDistance: src/core/geometry/qgsgeometry.h#L709 QgsGeometry.frechetDistance: src/core/geometry/qgsgeometry.h#L726
QgsGeometry.frechetDistanceDensify: src/core/geometry/qgsgeometry.h#L733 QgsGeometry.frechetDistanceDensify: src/core/geometry/qgsgeometry.h#L750
QgsGeometry.fromBox3D: src/core/geometry/qgsgeometry.h#L326 QgsGeometry.fromBox3D: src/core/geometry/qgsgeometry.h#L343
QgsGeometry.fromMultiPointXY: src/core/geometry/qgsgeometry.h#L255 QgsGeometry.fromMultiPointXY: src/core/geometry/qgsgeometry.h#L272
QgsGeometry.fromMultiPolygonXY: src/core/geometry/qgsgeometry.h#L314 QgsGeometry.fromMultiPolygonXY: src/core/geometry/qgsgeometry.h#L331
QgsGeometry.fromMultiPolylineXY: src/core/geometry/qgsgeometry.h#L282 QgsGeometry.fromMultiPolylineXY: src/core/geometry/qgsgeometry.h#L299
QgsGeometry.fromPoint: src/core/geometry/qgsgeometry.h#L252 QgsGeometry.fromPoint: src/core/geometry/qgsgeometry.h#L269
QgsGeometry.fromPointXY: src/core/geometry/qgsgeometry.h#L245 QgsGeometry.fromPointXY: src/core/geometry/qgsgeometry.h#L262
QgsGeometry.fromPolygonXY: src/core/geometry/qgsgeometry.h#L309 QgsGeometry.fromPolygonXY: src/core/geometry/qgsgeometry.h#L326
QgsGeometry.fromPolyline: src/core/geometry/qgsgeometry.h#L277 QgsGeometry.fromPolyline: src/core/geometry/qgsgeometry.h#L294
QgsGeometry.fromPolylineXY: src/core/geometry/qgsgeometry.h#L267 QgsGeometry.fromPolylineXY: src/core/geometry/qgsgeometry.h#L284
QgsGeometry.fromQPointF: src/core/geometry/qgsgeometry.h#L2930 QgsGeometry.fromQPointF: src/core/geometry/qgsgeometry.h#L2947
QgsGeometry.fromQPolygonF: src/core/geometry/qgsgeometry.h#L2938 QgsGeometry.fromQPolygonF: src/core/geometry/qgsgeometry.h#L2955
QgsGeometry.fromRect: src/core/geometry/qgsgeometry.h#L317 QgsGeometry.fromRect: src/core/geometry/qgsgeometry.h#L334
QgsGeometry.fromWkb: src/core/geometry/qgsgeometry.h#L376 QgsGeometry.fromWkb: src/core/geometry/qgsgeometry.h#L393
QgsGeometry.fromWkt: src/core/geometry/qgsgeometry.h#L243 QgsGeometry.fromWkt: src/core/geometry/qgsgeometry.h#L260
QgsGeometry.get: src/core/geometry/qgsgeometry.h#L218 QgsGeometry.get: src/core/geometry/qgsgeometry.h#L235
QgsGeometry.hausdorffDistance: src/core/geometry/qgsgeometry.h#L674 QgsGeometry.hausdorffDistance: src/core/geometry/qgsgeometry.h#L691
QgsGeometry.hausdorffDistanceDensify: src/core/geometry/qgsgeometry.h#L693 QgsGeometry.hausdorffDistanceDensify: src/core/geometry/qgsgeometry.h#L710
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L792 QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L809
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L806 QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L823
QgsGeometry.interpolate: src/core/geometry/qgsgeometry.h#L1979 QgsGeometry.interpolate: src/core/geometry/qgsgeometry.h#L1996
QgsGeometry.interpolateAngle: src/core/geometry/qgsgeometry.h#L2001 QgsGeometry.interpolateAngle: src/core/geometry/qgsgeometry.h#L2018
QgsGeometry.intersection: src/core/geometry/qgsgeometry.h#L2014 QgsGeometry.intersection: src/core/geometry/qgsgeometry.h#L2031
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1421 QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1438
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1437 QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1454
QgsGeometry.isAxisParallelRectangle: src/core/geometry/qgsgeometry.h#L463 QgsGeometry.isAxisParallelRectangle: src/core/geometry/qgsgeometry.h#L480
QgsGeometry.isEmpty: src/core/geometry/qgsgeometry.h#L396 QgsGeometry.isEmpty: src/core/geometry/qgsgeometry.h#L413
QgsGeometry.isGeosEqual: src/core/geometry/qgsgeometry.h#L431 QgsGeometry.isGeosEqual: src/core/geometry/qgsgeometry.h#L448
QgsGeometry.isGeosValid: src/core/geometry/qgsgeometry.h#L439 QgsGeometry.isGeosValid: src/core/geometry/qgsgeometry.h#L456
QgsGeometry.isMultipart: src/core/geometry/qgsgeometry.h#L399 QgsGeometry.isMultipart: src/core/geometry/qgsgeometry.h#L416
QgsGeometry.isNull: src/core/geometry/qgsgeometry.h#L240 QgsGeometry.isNull: src/core/geometry/qgsgeometry.h#L257
QgsGeometry.isPolygonClockwise: src/core/geometry/qgsgeometry.h#L2704 QgsGeometry.isPolygonClockwise: src/core/geometry/qgsgeometry.h#L2721
QgsGeometry.isPolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2689 QgsGeometry.isPolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2706
QgsGeometry.isSimple: src/core/geometry/qgsgeometry.h#L448 QgsGeometry.isSimple: src/core/geometry/qgsgeometry.h#L465
QgsGeometry.largestEmptyCircle: src/core/geometry/qgsgeometry.h#L1739 QgsGeometry.largestEmptyCircle: src/core/geometry/qgsgeometry.h#L1756
QgsGeometry.lastError: src/core/geometry/qgsgeometry.h#L2897 QgsGeometry.lastError: src/core/geometry/qgsgeometry.h#L2914
QgsGeometry.length: src/core/geometry/qgsgeometry.h#L491 QgsGeometry.length: src/core/geometry/qgsgeometry.h#L508
QgsGeometry.lineLocatePoint: src/core/geometry/qgsgeometry.h#L1991 QgsGeometry.lineLocatePoint: src/core/geometry/qgsgeometry.h#L2008
QgsGeometry.makeDifference: src/core/geometry/qgsgeometry.h#L1193 QgsGeometry.makeDifference: src/core/geometry/qgsgeometry.h#L1210
QgsGeometry.makeValid: src/core/geometry/qgsgeometry.h#L2663 QgsGeometry.makeValid: src/core/geometry/qgsgeometry.h#L2680
QgsGeometry.mapToPixel: src/core/geometry/qgsgeometry.h#L2860 QgsGeometry.mapToPixel: src/core/geometry/qgsgeometry.h#L2877
QgsGeometry.mergeLines: src/core/geometry/qgsgeometry.h#L2050 QgsGeometry.mergeLines: src/core/geometry/qgsgeometry.h#L2067
QgsGeometry.minimalEnclosingCircle: src/core/geometry/qgsgeometry.h#L1240 QgsGeometry.minimalEnclosingCircle: src/core/geometry/qgsgeometry.h#L1257
QgsGeometry.minimumClearance: src/core/geometry/qgsgeometry.h#L1778 QgsGeometry.minimumClearance: src/core/geometry/qgsgeometry.h#L1795
QgsGeometry.minimumClearanceLine: src/core/geometry/qgsgeometry.h#L1791 QgsGeometry.minimumClearanceLine: src/core/geometry/qgsgeometry.h#L1808
QgsGeometry.minimumWidth: src/core/geometry/qgsgeometry.h#L1755 QgsGeometry.minimumWidth: src/core/geometry/qgsgeometry.h#L1772
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L824 QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L841
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L833 QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L850
QgsGeometry.nearestPoint: src/core/geometry/qgsgeometry.h#L875 QgsGeometry.nearestPoint: src/core/geometry/qgsgeometry.h#L892
QgsGeometry.node: src/core/geometry/qgsgeometry.h#L1924 QgsGeometry.node: src/core/geometry/qgsgeometry.h#L1941
QgsGeometry.normalize: src/core/geometry/qgsgeometry.h#L2820 QgsGeometry.normalize: src/core/geometry/qgsgeometry.h#L2837
QgsGeometry.offsetCurve: src/core/geometry/qgsgeometry.h#L1566 QgsGeometry.offsetCurve: src/core/geometry/qgsgeometry.h#L1583
QgsGeometry.orientedMinimumBoundingBox: src/core/geometry/qgsgeometry.h#L1220 QgsGeometry.orientedMinimumBoundingBox: src/core/geometry/qgsgeometry.h#L1237
QgsGeometry.orthogonalize: src/core/geometry/qgsgeometry.h#L1255 QgsGeometry.orthogonalize: src/core/geometry/qgsgeometry.h#L1272
QgsGeometry.overlaps: src/core/geometry/qgsgeometry.h#L1513 QgsGeometry.overlaps: src/core/geometry/qgsgeometry.h#L1530
QgsGeometry.parts: src/core/geometry/qgsgeometry.h#L622 QgsGeometry.parts: src/core/geometry/qgsgeometry.h#L639
QgsGeometry.pointOnSurface: src/core/geometry/qgsgeometry.h#L1701 QgsGeometry.pointOnSurface: src/core/geometry/qgsgeometry.h#L1718
QgsGeometry.poleOfInaccessibility: src/core/geometry/qgsgeometry.h#L1714 QgsGeometry.poleOfInaccessibility: src/core/geometry/qgsgeometry.h#L1731
QgsGeometry.polygonOrientation: src/core/geometry/qgsgeometry.h#L2674 QgsGeometry.polygonOrientation: src/core/geometry/qgsgeometry.h#L2691
QgsGeometry.polygonize: src/core/geometry/qgsgeometry.h#L2839 QgsGeometry.polygonize: src/core/geometry/qgsgeometry.h#L2856
QgsGeometry.randomPointsInPolygon: src/core/geometry/qgsgeometry.h#L2136 QgsGeometry.randomPointsInPolygon: src/core/geometry/qgsgeometry.h#L2153
QgsGeometry.removeDuplicateNodes: src/core/geometry/qgsgeometry.h#L1410 QgsGeometry.removeDuplicateNodes: src/core/geometry/qgsgeometry.h#L1427
QgsGeometry.removeInteriorRings: src/core/geometry/qgsgeometry.h#L989 QgsGeometry.removeInteriorRings: src/core/geometry/qgsgeometry.h#L1006
QgsGeometry.requiresConversionToStraightSegments: src/core/geometry/qgsgeometry.h#L2854 QgsGeometry.requiresConversionToStraightSegments: src/core/geometry/qgsgeometry.h#L2871
QgsGeometry.reshapeGeometry: src/core/geometry/qgsgeometry.h#L1178 QgsGeometry.reshapeGeometry: src/core/geometry/qgsgeometry.h#L1195
QgsGeometry.rotate: src/core/geometry/qgsgeometry.h#L1029 QgsGeometry.rotate: src/core/geometry/qgsgeometry.h#L1046
QgsGeometry.roundWaves: src/core/geometry/qgsgeometry.h#L1337 QgsGeometry.roundWaves: src/core/geometry/qgsgeometry.h#L1354
QgsGeometry.roundWavesRandomized: src/core/geometry/qgsgeometry.h#L1357 QgsGeometry.roundWavesRandomized: src/core/geometry/qgsgeometry.h#L1374
QgsGeometry.set: src/core/geometry/qgsgeometry.h#L231 QgsGeometry.set: src/core/geometry/qgsgeometry.h#L248
QgsGeometry.sharedPaths: src/core/geometry/qgsgeometry.h#L1940 QgsGeometry.sharedPaths: src/core/geometry/qgsgeometry.h#L1957
QgsGeometry.shortestLine: src/core/geometry/qgsgeometry.h#L886 QgsGeometry.shortestLine: src/core/geometry/qgsgeometry.h#L903
QgsGeometry.simplify: src/core/geometry/qgsgeometry.h#L1629 QgsGeometry.simplify: src/core/geometry/qgsgeometry.h#L1646
QgsGeometry.simplifyCoverageVW: src/core/geometry/qgsgeometry.h#L1899 QgsGeometry.simplifyCoverageVW: src/core/geometry/qgsgeometry.h#L1916
QgsGeometry.singleSidedBuffer: src/core/geometry/qgsgeometry.h#L1582 QgsGeometry.singleSidedBuffer: src/core/geometry/qgsgeometry.h#L1599
QgsGeometry.smooth: src/core/geometry/qgsgeometry.h#L3118 QgsGeometry.smooth: src/core/geometry/qgsgeometry.h#L3135
QgsGeometry.snappedToGrid: src/core/geometry/qgsgeometry.h#L1389 QgsGeometry.snappedToGrid: src/core/geometry/qgsgeometry.h#L1406
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1092 QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1109
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1172 QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1189
QgsGeometry.sqrDistToVertexAt: src/core/geometry/qgsgeometry.h#L869 QgsGeometry.sqrDistToVertexAt: src/core/geometry/qgsgeometry.h#L886
QgsGeometry.squareWaves: src/core/geometry/qgsgeometry.h#L1303 QgsGeometry.squareWaves: src/core/geometry/qgsgeometry.h#L1320
QgsGeometry.squareWavesRandomized: src/core/geometry/qgsgeometry.h#L1323 QgsGeometry.squareWavesRandomized: src/core/geometry/qgsgeometry.h#L1340
QgsGeometry.subdivide: src/core/geometry/qgsgeometry.h#L1963 QgsGeometry.subdivide: src/core/geometry/qgsgeometry.h#L1980
QgsGeometry.symDifference: src/core/geometry/qgsgeometry.h#L2076 QgsGeometry.symDifference: src/core/geometry/qgsgeometry.h#L2093
QgsGeometry.taperedBuffer: src/core/geometry/qgsgeometry.h#L1603 QgsGeometry.taperedBuffer: src/core/geometry/qgsgeometry.h#L1620
QgsGeometry.toggleCircularAtVertex: src/core/geometry/qgsgeometry.h#L855 QgsGeometry.toggleCircularAtVertex: src/core/geometry/qgsgeometry.h#L872
QgsGeometry.touches: src/core/geometry/qgsgeometry.h#L1502 QgsGeometry.touches: src/core/geometry/qgsgeometry.h#L1519
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1011 QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1028
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1021 QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1038
QgsGeometry.translate: src/core/geometry/qgsgeometry.h#L995 QgsGeometry.translate: src/core/geometry/qgsgeometry.h#L1012
QgsGeometry.triangularWaves: src/core/geometry/qgsgeometry.h#L1269 QgsGeometry.triangularWaves: src/core/geometry/qgsgeometry.h#L1286
QgsGeometry.triangularWavesRandomized: src/core/geometry/qgsgeometry.h#L1289 QgsGeometry.triangularWavesRandomized: src/core/geometry/qgsgeometry.h#L1306
QgsGeometry.type: src/core/geometry/qgsgeometry.h#L388 QgsGeometry.type: src/core/geometry/qgsgeometry.h#L405
QgsGeometry.unaryUnion: src/core/geometry/qgsgeometry.h#L2830 QgsGeometry.unaryUnion: src/core/geometry/qgsgeometry.h#L2847
QgsGeometry.unionCoverage: src/core/geometry/qgsgeometry.h#L1912 QgsGeometry.unionCoverage: src/core/geometry/qgsgeometry.h#L1929
QgsGeometry.validateCoverage: src/core/geometry/qgsgeometry.h#L1877 QgsGeometry.validateCoverage: src/core/geometry/qgsgeometry.h#L1894
QgsGeometry.validateGeometry: src/core/geometry/qgsgeometry.h#L2809 QgsGeometry.validateGeometry: src/core/geometry/qgsgeometry.h#L2826
QgsGeometry.variableWidthBufferByM: src/core/geometry/qgsgeometry.h#L1619 QgsGeometry.variableWidthBufferByM: src/core/geometry/qgsgeometry.h#L1636
QgsGeometry.vertexAt: src/core/geometry/qgsgeometry.h#L862 QgsGeometry.vertexAt: src/core/geometry/qgsgeometry.h#L879
QgsGeometry.vertexIdFromVertexNr: src/core/geometry/qgsgeometry.h#L2877 QgsGeometry.vertexIdFromVertexNr: src/core/geometry/qgsgeometry.h#L2894
QgsGeometry.vertexNrFromVertexId: src/core/geometry/qgsgeometry.h#L2889 QgsGeometry.vertexNrFromVertexId: src/core/geometry/qgsgeometry.h#L2906
QgsGeometry.vertices: src/core/geometry/qgsgeometry.h#L540 QgsGeometry.vertices: src/core/geometry/qgsgeometry.h#L557
QgsGeometry.voronoiDiagram: src/core/geometry/qgsgeometry.h#L1832 QgsGeometry.voronoiDiagram: src/core/geometry/qgsgeometry.h#L1849
QgsGeometry.within: src/core/geometry/qgsgeometry.h#L1524 QgsGeometry.within: src/core/geometry/qgsgeometry.h#L1541
QgsGeometry.wkbSize: src/core/geometry/qgsgeometry.h#L2167 QgsGeometry.wkbSize: src/core/geometry/qgsgeometry.h#L2184
QgsGeometry.wkbType: src/core/geometry/qgsgeometry.h#L382 QgsGeometry.wkbType: src/core/geometry/qgsgeometry.h#L399
QgsGeometry: src/core/geometry/qgsgeometry.h#L161 QgsGeometry: src/core/geometry/qgsgeometry.h#L178
QgsGeometryCollection.__bool__: src/core/geometry/qgsgeometrycollection.h#L136 QgsGeometryCollection.__bool__: src/core/geometry/qgsgeometrycollection.h#L136
QgsGeometryCollection.__delitem__: src/core/geometry/qgsgeometrycollection.h#L401 QgsGeometryCollection.__delitem__: src/core/geometry/qgsgeometrycollection.h#L401
QgsGeometryCollection.__getitem__: src/core/geometry/qgsgeometrycollection.h#L373 QgsGeometryCollection.__getitem__: src/core/geometry/qgsgeometrycollection.h#L373
@ -5306,9 +5306,9 @@ QgsGeometryPaintDevice.painterPathToGeometry: src/core/painting/qgsgeometrypaint
QgsGeometryPaintDevice.setSimplificationTolerance: src/core/painting/qgsgeometrypaintdevice.h#L149 QgsGeometryPaintDevice.setSimplificationTolerance: src/core/painting/qgsgeometrypaintdevice.h#L149
QgsGeometryPaintDevice.setStrokedPathSegments: src/core/painting/qgsgeometrypaintdevice.h#L140 QgsGeometryPaintDevice.setStrokedPathSegments: src/core/painting/qgsgeometrypaintdevice.h#L140
QgsGeometryPaintDevice: src/core/painting/qgsgeometrypaintdevice.h#L122 QgsGeometryPaintDevice: src/core/painting/qgsgeometrypaintdevice.h#L122
QgsGeometryParameters.gridSize: src/core/geometry/qgsgeometry.h#L122 QgsGeometryParameters.gridSize: src/core/geometry/qgsgeometry.h#L139
QgsGeometryParameters.setGridSize: src/core/geometry/qgsgeometry.h#L134 QgsGeometryParameters.setGridSize: src/core/geometry/qgsgeometry.h#L151
QgsGeometryParameters: src/core/geometry/qgsgeometry.h#L108 QgsGeometryParameters: src/core/geometry/qgsgeometry.h#L125
QgsGeometryPartIterator.__iter__: src/core/geometry/qgsabstractgeometry.h#L1286 QgsGeometryPartIterator.__iter__: src/core/geometry/qgsabstractgeometry.h#L1286
QgsGeometryPartIterator.__next__: src/core/geometry/qgsabstractgeometry.h#L1291 QgsGeometryPartIterator.__next__: src/core/geometry/qgsabstractgeometry.h#L1291
QgsGeometryPartIterator.hasNext: src/core/geometry/qgsabstractgeometry.h#L1280 QgsGeometryPartIterator.hasNext: src/core/geometry/qgsabstractgeometry.h#L1280
@ -5508,13 +5508,13 @@ QgsGlowEffect.shadeExterior: src/core/effects/qgsgloweffect.h#L274
QgsGlowEffect.spread: src/core/effects/qgsgloweffect.h#L73 QgsGlowEffect.spread: src/core/effects/qgsgloweffect.h#L73
QgsGlowEffect.spreadUnit: src/core/effects/qgsgloweffect.h#L91 QgsGlowEffect.spreadUnit: src/core/effects/qgsgloweffect.h#L91
QgsGlowEffect: src/core/effects/qgsgloweffect.h#L37 QgsGlowEffect: src/core/effects/qgsgloweffect.h#L37
QgsGml.crs: src/core/qgsgml.h#L431 QgsGml.crs: src/core/qgsgml.h#L432
QgsGml.dataProgressAndSteps: src/core/qgsgml.h#L455 QgsGml.dataProgressAndSteps: src/core/qgsgml.h#L456
QgsGml.dataReadProgress: src/core/qgsgml.h#L440 QgsGml.dataReadProgress: src/core/qgsgml.h#L441
QgsGml.getFeatures: src/core/qgsgml.h#L408 QgsGml.getFeatures: src/core/qgsgml.h#L409
QgsGml.getFeatures: src/core/qgsgml.h#L420 QgsGml.getFeatures: src/core/qgsgml.h#L421
QgsGml.totalStepsUpdate: src/core/qgsgml.h#L447 QgsGml.totalStepsUpdate: src/core/qgsgml.h#L448
QgsGml: src/core/qgsgml.h#L387 QgsGml: src/core/qgsgml.h#L388
QgsGmlFeatureClass.fieldIndex: src/core/qgsgmlschema.h#L49 QgsGmlFeatureClass.fieldIndex: src/core/qgsgmlschema.h#L49
QgsGmlFeatureClass.path: src/core/qgsgmlschema.h#L51 QgsGmlFeatureClass.path: src/core/qgsgmlschema.h#L51
QgsGmlFeatureClass: src/core/qgsgmlschema.h#L40 QgsGmlFeatureClass: src/core/qgsgmlschema.h#L40
@ -8951,219 +8951,220 @@ QgsMapInfoSymbolConverter.convertFillSymbol: src/core/symbology/qgsmapinfosymbol
QgsMapInfoSymbolConverter.convertLineSymbol: src/core/symbology/qgsmapinfosymbolconverter.h#L75 QgsMapInfoSymbolConverter.convertLineSymbol: src/core/symbology/qgsmapinfosymbolconverter.h#L75
QgsMapInfoSymbolConverter.convertMarkerSymbol: src/core/symbology/qgsmapinfosymbolconverter.h#L91 QgsMapInfoSymbolConverter.convertMarkerSymbol: src/core/symbology/qgsmapinfosymbolconverter.h#L91
QgsMapInfoSymbolConverter: src/core/symbology/qgsmapinfosymbolconverter.h#L66 QgsMapInfoSymbolConverter: src/core/symbology/qgsmapinfosymbolconverter.h#L66
QgsMapLayer.__repr__: src/core/qgsmaplayer.h#L1915 QgsMapLayer.__repr__: src/core/qgsmaplayer.h#L1955
QgsMapLayer.abstract: src/core/qgsmaplayer.h#L356 QgsMapLayer.abstract: src/core/qgsmaplayer.h#L356
QgsMapLayer.accept: src/core/qgsmaplayer.h#L1742 QgsMapLayer.accept: src/core/qgsmaplayer.h#L1782
QgsMapLayer.appendError: src/core/qgsmaplayer.h#L2279 QgsMapLayer.appendError: src/core/qgsmaplayer.h#L2319
QgsMapLayer.attribution: src/core/qgsmaplayer.h#L412 QgsMapLayer.attribution: src/core/qgsmaplayer.h#L412
QgsMapLayer.attributionUrl: src/core/qgsmaplayer.h#L426 QgsMapLayer.attributionUrl: src/core/qgsmaplayer.h#L426
QgsMapLayer.autoRefreshInterval: src/core/qgsmaplayer.h#L1636 QgsMapLayer.autoRefreshInterval: src/core/qgsmaplayer.h#L1676
QgsMapLayer.autoRefreshIntervalChanged: src/core/qgsmaplayer.h#L2080 QgsMapLayer.autoRefreshIntervalChanged: src/core/qgsmaplayer.h#L2120
QgsMapLayer.autoRefreshMode: src/core/qgsmaplayer.h#L1628 QgsMapLayer.autoRefreshMode: src/core/qgsmaplayer.h#L1668
QgsMapLayer.beforeResolveReferences: src/core/qgsmaplayer.h#L1938 QgsMapLayer.beforeResolveReferences: src/core/qgsmaplayer.h#L1978
QgsMapLayer.blendMode: src/core/qgsmaplayer.h#L516 QgsMapLayer.blendMode: src/core/qgsmaplayer.h#L516
QgsMapLayer.blendModeChanged: src/core/qgsmaplayer.h#L2011 QgsMapLayer.blendModeChanged: src/core/qgsmaplayer.h#L2051
QgsMapLayer.clone: src/core/qgsmaplayer.h#L214 QgsMapLayer.clone: src/core/qgsmaplayer.h#L214
QgsMapLayer.clone: src/core/qgsmaplayer.h#L2187 QgsMapLayer.clone: src/core/qgsmaplayer.h#L2227
QgsMapLayer.configChanged: src/core/qgsmaplayer.h#L2062 QgsMapLayer.configChanged: src/core/qgsmaplayer.h#L2102
QgsMapLayer.createMapRenderer: src/core/qgsmaplayer.h#L549 QgsMapLayer.createMapRenderer: src/core/qgsmaplayer.h#L549
QgsMapLayer.crs3D: src/core/qgsmaplayer.h#L1034 QgsMapLayer.crs3D: src/core/qgsmaplayer.h#L1074
QgsMapLayer.crs3DChanged: src/core/qgsmaplayer.h#L1977 QgsMapLayer.crs3DChanged: src/core/qgsmaplayer.h#L2017
QgsMapLayer.crs: src/core/qgsmaplayer.h#L994 QgsMapLayer.crs: src/core/qgsmaplayer.h#L1034
QgsMapLayer.crsChanged: src/core/qgsmaplayer.h#L1966 QgsMapLayer.crsChanged: src/core/qgsmaplayer.h#L2006
QgsMapLayer.customProperty: src/core/qgsmaplayer.h#L721 QgsMapLayer.customProperty: src/core/qgsmaplayer.h#L721
QgsMapLayer.customPropertyChanged: src/core/qgsmaplayer.h#L2125 QgsMapLayer.customPropertyChanged: src/core/qgsmaplayer.h#L2165
QgsMapLayer.customPropertyKeys: src/core/qgsmaplayer.h#L708 QgsMapLayer.customPropertyKeys: src/core/qgsmaplayer.h#L708
QgsMapLayer.dataChanged: src/core/qgsmaplayer.h#L2008 QgsMapLayer.dataChanged: src/core/qgsmaplayer.h#L2048
QgsMapLayer.dataProvider: src/core/qgsmaplayer.h#L302 QgsMapLayer.dataProvider: src/core/qgsmaplayer.h#L302
QgsMapLayer.dataSourceChanged: src/core/qgsmaplayer.h#L2104 QgsMapLayer.dataSourceChanged: src/core/qgsmaplayer.h#L2144
QgsMapLayer.dataUrl: src/core/qgsmaplayer.h#L384 QgsMapLayer.dataUrl: src/core/qgsmaplayer.h#L384
QgsMapLayer.dataUrlFormat: src/core/qgsmaplayer.h#L398 QgsMapLayer.dataUrlFormat: src/core/qgsmaplayer.h#L398
QgsMapLayer.decodedSource: src/core/qgsmaplayer.h#L2238 QgsMapLayer.decodedSource: src/core/qgsmaplayer.h#L2278
QgsMapLayer.deleteStyleFromDatabase: src/core/qgsmaplayer.h#L758 QgsMapLayer.deleteStyleFromDatabase: src/core/qgsmaplayer.h#L758
QgsMapLayer.dependenciesChanged: src/core/qgsmaplayer.h#L2067 QgsMapLayer.dependenciesChanged: src/core/qgsmaplayer.h#L2107
QgsMapLayer.editingStarted: src/core/qgsmaplayer.h#L2131 QgsMapLayer.editingStarted: src/core/qgsmaplayer.h#L2171
QgsMapLayer.editingStopped: src/core/qgsmaplayer.h#L2137 QgsMapLayer.editingStopped: src/core/qgsmaplayer.h#L2177
QgsMapLayer.elevationProperties: src/core/qgsmaplayer.h#L1763 QgsMapLayer.elevationProperties: src/core/qgsmaplayer.h#L1803
QgsMapLayer.emitStyleChanged: src/core/qgsmaplayer.h#L1882 QgsMapLayer.emitStyleChanged: src/core/qgsmaplayer.h#L1922
QgsMapLayer.encodedSource: src/core/qgsmaplayer.h#L2224 QgsMapLayer.encodedSource: src/core/qgsmaplayer.h#L2264
QgsMapLayer.error: src/core/qgsmaplayer.h#L981 QgsMapLayer.error: src/core/qgsmaplayer.h#L1021
QgsMapLayer.exportNamedMetadata: src/core/qgsmaplayer.h#L1096 QgsMapLayer.exportNamedMetadata: src/core/qgsmaplayer.h#L1136
QgsMapLayer.exportNamedStyle: src/core/qgsmaplayer.h#L1244 QgsMapLayer.exportNamedStyle: src/core/qgsmaplayer.h#L1284
QgsMapLayer.exportSldStyle: src/core/qgsmaplayer.h#L1255 QgsMapLayer.exportSldStyle: src/core/qgsmaplayer.h#L1295
QgsMapLayer.exportSldStyleV2: src/core/qgsmaplayer.h#L1264 QgsMapLayer.exportSldStyleV2: src/core/qgsmaplayer.h#L1304
QgsMapLayer.exportSldStyleV3: src/core/qgsmaplayer.h#L1275 QgsMapLayer.exportSldStyleV3: src/core/qgsmaplayer.h#L1315
QgsMapLayer.extensionPropertyType: src/core/qgsmaplayer.h#L260 QgsMapLayer.extensionPropertyType: src/core/qgsmaplayer.h#L260
QgsMapLayer.extent3D: src/core/qgsmaplayer.h#L558 QgsMapLayer.extent3D: src/core/qgsmaplayer.h#L558
QgsMapLayer.extent: src/core/qgsmaplayer.h#L552 QgsMapLayer.extent: src/core/qgsmaplayer.h#L552
QgsMapLayer.flags: src/core/qgsmaplayer.h#L231 QgsMapLayer.flags: src/core/qgsmaplayer.h#L231
QgsMapLayer.flagsChanged: src/core/qgsmaplayer.h#L2095 QgsMapLayer.flagsChanged: src/core/qgsmaplayer.h#L2135
QgsMapLayer.formatLayerName: src/core/qgsmaplayer.h#L1081 QgsMapLayer.formatLayerName: src/core/qgsmaplayer.h#L1121
QgsMapLayer.generateId: src/core/qgsmaplayer.h#L1731 QgsMapLayer.generateId: src/core/qgsmaplayer.h#L1771
QgsMapLayer.getStyleFromDatabase: src/core/qgsmaplayer.h#L750 QgsMapLayer.getStyleFromDatabase: src/core/qgsmaplayer.h#L750
QgsMapLayer.hasAutoRefreshEnabled: src/core/qgsmaplayer.h#L1620 QgsMapLayer.hasAutoRefreshEnabled: src/core/qgsmaplayer.h#L1660
QgsMapLayer.hasDependencyCycle: src/core/qgsmaplayer.h#L2311 QgsMapLayer.hasDependencyCycle: src/core/qgsmaplayer.h#L2351
QgsMapLayer.hasMapTips: src/core/qgsmaplayer.h#L1785 QgsMapLayer.hasMapTips: src/core/qgsmaplayer.h#L1825
QgsMapLayer.hasScaleBasedVisibility: src/core/qgsmaplayer.h#L1612 QgsMapLayer.hasScaleBasedVisibility: src/core/qgsmaplayer.h#L1652
QgsMapLayer.htmlMetadata: src/core/qgsmaplayer.h#L1683 QgsMapLayer.htmlMetadata: src/core/qgsmaplayer.h#L1723
QgsMapLayer.id: src/core/qgsmaplayer.h#L268 QgsMapLayer.id: src/core/qgsmaplayer.h#L268
QgsMapLayer.idChanged: src/core/qgsmaplayer.h#L1951 QgsMapLayer.idChanged: src/core/qgsmaplayer.h#L1991
QgsMapLayer.importNamedMetadata: src/core/qgsmaplayer.h#L1169 QgsMapLayer.importNamedMetadata: src/core/qgsmaplayer.h#L1209
QgsMapLayer.importNamedStyle: src/core/qgsmaplayer.h#L1233 QgsMapLayer.importNamedStyle: src/core/qgsmaplayer.h#L1273
QgsMapLayer.invalidateWgs84Extent: src/core/qgsmaplayer.h#L2289 QgsMapLayer.invalidateWgs84Extent: src/core/qgsmaplayer.h#L2329
QgsMapLayer.isEditable: src/core/qgsmaplayer.h#L624 QgsMapLayer.isEditable: src/core/qgsmaplayer.h#L624
QgsMapLayer.isInScaleRange: src/core/qgsmaplayer.h#L1578 QgsMapLayer.isInScaleRange: src/core/qgsmaplayer.h#L1618
QgsMapLayer.isModified: src/core/qgsmaplayer.h#L631 QgsMapLayer.isModified: src/core/qgsmaplayer.h#L631
QgsMapLayer.isRefreshOnNotifyEnabled: src/core/qgsmaplayer.h#L1706 QgsMapLayer.isRefreshOnNotifyEnabled: src/core/qgsmaplayer.h#L1746
QgsMapLayer.isSpatial: src/core/qgsmaplayer.h#L636 QgsMapLayer.isSpatial: src/core/qgsmaplayer.h#L636
QgsMapLayer.isTemporary: src/core/qgsmaplayer.h#L647 QgsMapLayer.isTemporary: src/core/qgsmaplayer.h#L647
QgsMapLayer.isValid: src/core/qgsmaplayer.h#L575 QgsMapLayer.isValid: src/core/qgsmaplayer.h#L575
QgsMapLayer.isValidChanged: src/core/qgsmaplayer.h#L2118 QgsMapLayer.isValidChanged: src/core/qgsmaplayer.h#L2158
QgsMapLayer.keywordList: src/core/qgsmaplayer.h#L370 QgsMapLayer.keywordList: src/core/qgsmaplayer.h#L370
QgsMapLayer.layerModified: src/core/qgsmaplayer.h#L2143 QgsMapLayer.layerModified: src/core/qgsmaplayer.h#L2183
QgsMapLayer.legend: src/core/qgsmaplayer.h#L1553 QgsMapLayer.legend: src/core/qgsmaplayer.h#L1593
QgsMapLayer.legendChanged: src/core/qgsmaplayer.h#L2044 QgsMapLayer.legendChanged: src/core/qgsmaplayer.h#L2084
QgsMapLayer.legendPlaceholderImage: src/core/qgsmaplayer.h#L1770 QgsMapLayer.legendPlaceholderImage: src/core/qgsmaplayer.h#L1810
QgsMapLayer.legendUrl: src/core/qgsmaplayer.h#L1528 QgsMapLayer.legendUrl: src/core/qgsmaplayer.h#L1568
QgsMapLayer.legendUrlFormat: src/core/qgsmaplayer.h#L1542 QgsMapLayer.legendUrlFormat: src/core/qgsmaplayer.h#L1582
QgsMapLayer.listStylesInDatabase: src/core/qgsmaplayer.h#L744 QgsMapLayer.listStylesInDatabase: src/core/qgsmaplayer.h#L744
QgsMapLayer.loadDefaultMetadata: src/core/qgsmaplayer.h#L1152 QgsMapLayer.loadDefaultMetadata: src/core/qgsmaplayer.h#L1192
QgsMapLayer.loadDefaultStyle: src/core/qgsmaplayer.h#L1193 QgsMapLayer.loadDefaultStyle: src/core/qgsmaplayer.h#L1233
QgsMapLayer.loadNamedMetadata: src/core/qgsmaplayer.h#L1139 QgsMapLayer.loadNamedMetadata: src/core/qgsmaplayer.h#L1179
QgsMapLayer.loadNamedMetadataFromDatabase: src/core/qgsmaplayer.h#L1161 QgsMapLayer.loadNamedMetadataFromDatabase: src/core/qgsmaplayer.h#L1201
QgsMapLayer.loadNamedStyle: src/core/qgsmaplayer.h#L1214 QgsMapLayer.loadNamedStyle: src/core/qgsmaplayer.h#L1254
QgsMapLayer.loadNamedStyle: src/core/qgsmaplayer.h#L795 QgsMapLayer.loadNamedStyle: src/core/qgsmaplayer.h#L835
QgsMapLayer.loadNamedStyleFromDatabase: src/core/qgsmaplayer.h#L1223 QgsMapLayer.loadNamedStyleFromDatabase: src/core/qgsmaplayer.h#L1263
QgsMapLayer.loadSldStyle: src/core/qgsmaplayer.h#L1351 QgsMapLayer.loadSldStyle: src/core/qgsmaplayer.h#L1391
QgsMapLayer.mapTipTemplate: src/core/qgsmaplayer.h#L1794 QgsMapLayer.mapTipTemplate: src/core/qgsmaplayer.h#L1834
QgsMapLayer.mapTipTemplateChanged: src/core/qgsmaplayer.h#L2150 QgsMapLayer.mapTipTemplateChanged: src/core/qgsmaplayer.h#L2190
QgsMapLayer.mapTipsEnabled: src/core/qgsmaplayer.h#L1817 QgsMapLayer.mapTipsEnabled: src/core/qgsmaplayer.h#L1857
QgsMapLayer.mapTipsEnabledChanged: src/core/qgsmaplayer.h#L2158 QgsMapLayer.mapTipsEnabledChanged: src/core/qgsmaplayer.h#L2198
QgsMapLayer.maximumScale: src/core/qgsmaplayer.h#L1602 QgsMapLayer.maximumScale: src/core/qgsmaplayer.h#L1642
QgsMapLayer.metadataChanged: src/core/qgsmaplayer.h#L2087 QgsMapLayer.metadataChanged: src/core/qgsmaplayer.h#L2127
QgsMapLayer.metadataUri: src/core/qgsmaplayer.h#L1089 QgsMapLayer.metadataUri: src/core/qgsmaplayer.h#L1129
QgsMapLayer.metadataUrl: src/core/qgsmaplayer.h#L461 QgsMapLayer.metadataUrl: src/core/qgsmaplayer.h#L461
QgsMapLayer.metadataUrlFormat: src/core/qgsmaplayer.h#L503 QgsMapLayer.metadataUrlFormat: src/core/qgsmaplayer.h#L503
QgsMapLayer.metadataUrlType: src/core/qgsmaplayer.h#L482 QgsMapLayer.metadataUrlType: src/core/qgsmaplayer.h#L482
QgsMapLayer.minimumScale: src/core/qgsmaplayer.h#L1590 QgsMapLayer.minimumScale: src/core/qgsmaplayer.h#L1630
QgsMapLayer.name: src/core/qgsmaplayer.h#L297 QgsMapLayer.name: src/core/qgsmaplayer.h#L297
QgsMapLayer.nameChanged: src/core/qgsmaplayer.h#L1956 QgsMapLayer.nameChanged: src/core/qgsmaplayer.h#L1996
QgsMapLayer.opacity: src/core/qgsmaplayer.h#L536 QgsMapLayer.opacity: src/core/qgsmaplayer.h#L536
QgsMapLayer.opacityChanged: src/core/qgsmaplayer.h#L2021 QgsMapLayer.opacityChanged: src/core/qgsmaplayer.h#L2061
QgsMapLayer.originalXmlProperties: src/core/qgsmaplayer.h#L1716 QgsMapLayer.originalXmlProperties: src/core/qgsmaplayer.h#L1756
QgsMapLayer.project: src/core/qgsmaplayer.h#L1928 QgsMapLayer.project: src/core/qgsmaplayer.h#L1968
QgsMapLayer.properties: src/core/qgsmaplayer.h#L254 QgsMapLayer.properties: src/core/qgsmaplayer.h#L254
QgsMapLayer.providerMetadata: src/core/qgsmaplayer.h#L314 QgsMapLayer.providerMetadata: src/core/qgsmaplayer.h#L314
QgsMapLayer.providerReadFlags: src/core/qgsmaplayer.h#L1826 QgsMapLayer.providerReadFlags: src/core/qgsmaplayer.h#L1866
QgsMapLayer.providerType: src/core/qgsmaplayer.h#L1506 QgsMapLayer.providerType: src/core/qgsmaplayer.h#L1546
QgsMapLayer.publicSource: src/core/qgsmaplayer.h#L587 QgsMapLayer.publicSource: src/core/qgsmaplayer.h#L587
QgsMapLayer.readCommonStyle: src/core/qgsmaplayer.h#L2265 QgsMapLayer.readCommonStyle: src/core/qgsmaplayer.h#L2305
QgsMapLayer.readCustomProperties: src/core/qgsmaplayer.h#L2245 QgsMapLayer.readCustomProperties: src/core/qgsmaplayer.h#L2285
QgsMapLayer.readLayerXml: src/core/qgsmaplayer.h#L679 QgsMapLayer.readLayerXml: src/core/qgsmaplayer.h#L679
QgsMapLayer.readOnly: src/core/qgsmaplayer.h#L539 QgsMapLayer.readOnly: src/core/qgsmaplayer.h#L539
QgsMapLayer.readSld: src/core/qgsmaplayer.h#L1354 QgsMapLayer.readSld: src/core/qgsmaplayer.h#L1394
QgsMapLayer.readStyle: src/core/qgsmaplayer.h#L1378 QgsMapLayer.readStyle: src/core/qgsmaplayer.h#L1418
QgsMapLayer.readStyleManager: src/core/qgsmaplayer.h#L2251 QgsMapLayer.readStyleManager: src/core/qgsmaplayer.h#L2291
QgsMapLayer.readSymbology: src/core/qgsmaplayer.h#L1366 QgsMapLayer.readSymbology: src/core/qgsmaplayer.h#L1406
QgsMapLayer.readXml: src/core/qgsmaplayer.h#L2205 QgsMapLayer.readXml: src/core/qgsmaplayer.h#L2245
QgsMapLayer.recalculateExtents: src/core/qgsmaplayer.h#L2005 QgsMapLayer.recalculateExtents: src/core/qgsmaplayer.h#L2045
QgsMapLayer.refreshOnNotifyMessage: src/core/qgsmaplayer.h#L1700 QgsMapLayer.refreshOnNotifyMessage: src/core/qgsmaplayer.h#L1740
QgsMapLayer.reload: src/core/qgsmaplayer.h#L544 QgsMapLayer.reload: src/core/qgsmaplayer.h#L544
QgsMapLayer.removeCustomProperty: src/core/qgsmaplayer.h#L974 QgsMapLayer.removeCustomProperty: src/core/qgsmaplayer.h#L1014
QgsMapLayer.renderer3D: src/core/qgsmaplayer.h#L1568 QgsMapLayer.renderer3D: src/core/qgsmaplayer.h#L1608
QgsMapLayer.renderer3DChanged: src/core/qgsmaplayer.h#L2049 QgsMapLayer.renderer3DChanged: src/core/qgsmaplayer.h#L2089
QgsMapLayer.rendererChanged: src/core/qgsmaplayer.h#L2027 QgsMapLayer.rendererChanged: src/core/qgsmaplayer.h#L2067
QgsMapLayer.repaintRequested: src/core/qgsmaplayer.h#L2002 QgsMapLayer.repaintRequested: src/core/qgsmaplayer.h#L2042
QgsMapLayer.request3DUpdate: src/core/qgsmaplayer.h#L2056 QgsMapLayer.request3DUpdate: src/core/qgsmaplayer.h#L2096
QgsMapLayer.resolveReferences: src/core/qgsmaplayer.h#L702 QgsMapLayer.resolveReferences: src/core/qgsmaplayer.h#L702
QgsMapLayer.saveDefaultMetadata: src/core/qgsmaplayer.h#L1106 QgsMapLayer.saveDefaultMetadata: src/core/qgsmaplayer.h#L1146
QgsMapLayer.saveDefaultStyle: src/core/qgsmaplayer.h#L1288 QgsMapLayer.saveDefaultStyle: src/core/qgsmaplayer.h#L1328
QgsMapLayer.saveDefaultStyle: src/core/qgsmaplayer.h#L1301 QgsMapLayer.saveDefaultStyle: src/core/qgsmaplayer.h#L1341
QgsMapLayer.saveNamedMetadata: src/core/qgsmaplayer.h#L1121 QgsMapLayer.saveNamedMetadata: src/core/qgsmaplayer.h#L1161
QgsMapLayer.saveNamedStyle: src/core/qgsmaplayer.h#L1318 QgsMapLayer.saveNamedStyle: src/core/qgsmaplayer.h#L1358
QgsMapLayer.saveSldStyle: src/core/qgsmaplayer.h#L1329 QgsMapLayer.saveSldStyle: src/core/qgsmaplayer.h#L1369
QgsMapLayer.saveSldStyleV2: src/core/qgsmaplayer.h#L1341 QgsMapLayer.saveSldStyleV2: src/core/qgsmaplayer.h#L1381
QgsMapLayer.saveStyleToDatabase: src/core/qgsmaplayer.h#L776 QgsMapLayer.saveStyleToDatabase: src/core/qgsmaplayer.h#L799
QgsMapLayer.selectionProperties: src/core/qgsmaplayer.h#L1749 QgsMapLayer.saveStyleToDatabaseV2: src/core/qgsmaplayer.h#L817
QgsMapLayer.selectionProperties: src/core/qgsmaplayer.h#L1789
QgsMapLayer.serverProperties: src/core/qgsmaplayer.h#L435 QgsMapLayer.serverProperties: src/core/qgsmaplayer.h#L435
QgsMapLayer.setAbstract: src/core/qgsmaplayer.h#L349 QgsMapLayer.setAbstract: src/core/qgsmaplayer.h#L349
QgsMapLayer.setAttribution: src/core/qgsmaplayer.h#L405 QgsMapLayer.setAttribution: src/core/qgsmaplayer.h#L405
QgsMapLayer.setAttributionUrl: src/core/qgsmaplayer.h#L419 QgsMapLayer.setAttributionUrl: src/core/qgsmaplayer.h#L419
QgsMapLayer.setAutoRefreshEnabled: src/core/qgsmaplayer.h#L1656 QgsMapLayer.setAutoRefreshEnabled: src/core/qgsmaplayer.h#L1696
QgsMapLayer.setAutoRefreshInterval: src/core/qgsmaplayer.h#L1648 QgsMapLayer.setAutoRefreshInterval: src/core/qgsmaplayer.h#L1688
QgsMapLayer.setAutoRefreshMode: src/core/qgsmaplayer.h#L1664 QgsMapLayer.setAutoRefreshMode: src/core/qgsmaplayer.h#L1704
QgsMapLayer.setBlendMode: src/core/qgsmaplayer.h#L510 QgsMapLayer.setBlendMode: src/core/qgsmaplayer.h#L510
QgsMapLayer.setCrs: src/core/qgsmaplayer.h#L1046 QgsMapLayer.setCrs: src/core/qgsmaplayer.h#L1086
QgsMapLayer.setCustomProperties: src/core/qgsmaplayer.h#L726 QgsMapLayer.setCustomProperties: src/core/qgsmaplayer.h#L726
QgsMapLayer.setCustomProperty: src/core/qgsmaplayer.h#L715 QgsMapLayer.setCustomProperty: src/core/qgsmaplayer.h#L715
QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1439 QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1479
QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1470 QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1510
QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1501 QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1541
QgsMapLayer.setDataUrl: src/core/qgsmaplayer.h#L377 QgsMapLayer.setDataUrl: src/core/qgsmaplayer.h#L377
QgsMapLayer.setDataUrlFormat: src/core/qgsmaplayer.h#L391 QgsMapLayer.setDataUrlFormat: src/core/qgsmaplayer.h#L391
QgsMapLayer.setDependencies: src/core/qgsmaplayer.h#L1891 QgsMapLayer.setDependencies: src/core/qgsmaplayer.h#L1931
QgsMapLayer.setError: src/core/qgsmaplayer.h#L2281 QgsMapLayer.setError: src/core/qgsmaplayer.h#L2321
QgsMapLayer.setExtent3D: src/core/qgsmaplayer.h#L2196 QgsMapLayer.setExtent3D: src/core/qgsmaplayer.h#L2236
QgsMapLayer.setExtent: src/core/qgsmaplayer.h#L2190 QgsMapLayer.setExtent: src/core/qgsmaplayer.h#L2230
QgsMapLayer.setFlags: src/core/qgsmaplayer.h#L243 QgsMapLayer.setFlags: src/core/qgsmaplayer.h#L243
QgsMapLayer.setId: src/core/qgsmaplayer.h#L285 QgsMapLayer.setId: src/core/qgsmaplayer.h#L285
QgsMapLayer.setKeywordList: src/core/qgsmaplayer.h#L363 QgsMapLayer.setKeywordList: src/core/qgsmaplayer.h#L363
QgsMapLayer.setLayerOrder: src/core/qgsmaplayer.h#L606 QgsMapLayer.setLayerOrder: src/core/qgsmaplayer.h#L606
QgsMapLayer.setLegend: src/core/qgsmaplayer.h#L1548 QgsMapLayer.setLegend: src/core/qgsmaplayer.h#L1588
QgsMapLayer.setLegendPlaceholderImage: src/core/qgsmaplayer.h#L1777 QgsMapLayer.setLegendPlaceholderImage: src/core/qgsmaplayer.h#L1817
QgsMapLayer.setLegendUrl: src/core/qgsmaplayer.h#L1521 QgsMapLayer.setLegendUrl: src/core/qgsmaplayer.h#L1561
QgsMapLayer.setLegendUrlFormat: src/core/qgsmaplayer.h#L1535 QgsMapLayer.setLegendUrlFormat: src/core/qgsmaplayer.h#L1575
QgsMapLayer.setMapTipTemplate: src/core/qgsmaplayer.h#L1803 QgsMapLayer.setMapTipTemplate: src/core/qgsmaplayer.h#L1843
QgsMapLayer.setMapTipsEnabled: src/core/qgsmaplayer.h#L1811 QgsMapLayer.setMapTipsEnabled: src/core/qgsmaplayer.h#L1851
QgsMapLayer.setMaximumScale: src/core/qgsmaplayer.h#L1850 QgsMapLayer.setMaximumScale: src/core/qgsmaplayer.h#L1890
QgsMapLayer.setMetadata: src/core/qgsmaplayer.h#L1678 QgsMapLayer.setMetadata: src/core/qgsmaplayer.h#L1718
QgsMapLayer.setMetadataUrl: src/core/qgsmaplayer.h#L450 QgsMapLayer.setMetadataUrl: src/core/qgsmaplayer.h#L450
QgsMapLayer.setMetadataUrlFormat: src/core/qgsmaplayer.h#L492 QgsMapLayer.setMetadataUrlFormat: src/core/qgsmaplayer.h#L492
QgsMapLayer.setMetadataUrlType: src/core/qgsmaplayer.h#L471 QgsMapLayer.setMetadataUrlType: src/core/qgsmaplayer.h#L471
QgsMapLayer.setMinimumScale: src/core/qgsmaplayer.h#L1839 QgsMapLayer.setMinimumScale: src/core/qgsmaplayer.h#L1879
QgsMapLayer.setName: src/core/qgsmaplayer.h#L291 QgsMapLayer.setName: src/core/qgsmaplayer.h#L291
QgsMapLayer.setOpacity: src/core/qgsmaplayer.h#L526 QgsMapLayer.setOpacity: src/core/qgsmaplayer.h#L526
QgsMapLayer.setOriginalXmlProperties: src/core/qgsmaplayer.h#L1725 QgsMapLayer.setOriginalXmlProperties: src/core/qgsmaplayer.h#L1765
QgsMapLayer.setProviderType: src/core/qgsmaplayer.h#L2269 QgsMapLayer.setProviderType: src/core/qgsmaplayer.h#L2309
QgsMapLayer.setRefreshOnNofifyMessage: src/core/qgsmaplayer.h#L1905 QgsMapLayer.setRefreshOnNofifyMessage: src/core/qgsmaplayer.h#L1945
QgsMapLayer.setRefreshOnNotifyEnabled: src/core/qgsmaplayer.h#L1897 QgsMapLayer.setRefreshOnNotifyEnabled: src/core/qgsmaplayer.h#L1937
QgsMapLayer.setRenderer3D: src/core/qgsmaplayer.h#L1563 QgsMapLayer.setRenderer3D: src/core/qgsmaplayer.h#L1603
QgsMapLayer.setScaleBasedVisibility: src/core/qgsmaplayer.h#L1859 QgsMapLayer.setScaleBasedVisibility: src/core/qgsmaplayer.h#L1899
QgsMapLayer.setShortName: src/core/qgsmaplayer.h#L321 QgsMapLayer.setShortName: src/core/qgsmaplayer.h#L321
QgsMapLayer.setSubLayerVisibility: src/core/qgsmaplayer.h#L613 QgsMapLayer.setSubLayerVisibility: src/core/qgsmaplayer.h#L613
QgsMapLayer.setTitle: src/core/qgsmaplayer.h#L335 QgsMapLayer.setTitle: src/core/qgsmaplayer.h#L335
QgsMapLayer.setTransformContext: src/core/qgsmaplayer.h#L1912 QgsMapLayer.setTransformContext: src/core/qgsmaplayer.h#L1952
QgsMapLayer.setValid: src/core/qgsmaplayer.h#L2199 QgsMapLayer.setValid: src/core/qgsmaplayer.h#L2239
QgsMapLayer.setVerticalCrs: src/core/qgsmaplayer.h#L1067 QgsMapLayer.setVerticalCrs: src/core/qgsmaplayer.h#L1107
QgsMapLayer.shortName: src/core/qgsmaplayer.h#L328 QgsMapLayer.shortName: src/core/qgsmaplayer.h#L328
QgsMapLayer.source: src/core/qgsmaplayer.h#L594 QgsMapLayer.source: src/core/qgsmaplayer.h#L594
QgsMapLayer.statusChanged: src/core/qgsmaplayer.h#L1941 QgsMapLayer.statusChanged: src/core/qgsmaplayer.h#L1981
QgsMapLayer.styleChanged: src/core/qgsmaplayer.h#L2039 QgsMapLayer.styleChanged: src/core/qgsmaplayer.h#L2079
QgsMapLayer.styleLoaded: src/core/qgsmaplayer.h#L2111 QgsMapLayer.styleLoaded: src/core/qgsmaplayer.h#L2151
QgsMapLayer.styleManager: src/core/qgsmaplayer.h#L1558 QgsMapLayer.styleManager: src/core/qgsmaplayer.h#L1598
QgsMapLayer.styleURI: src/core/qgsmaplayer.h#L1179 QgsMapLayer.styleURI: src/core/qgsmaplayer.h#L1219
QgsMapLayer.subLayers: src/core/qgsmaplayer.h#L600 QgsMapLayer.subLayers: src/core/qgsmaplayer.h#L600
QgsMapLayer.supportsEditing: src/core/qgsmaplayer.h#L621 QgsMapLayer.supportsEditing: src/core/qgsmaplayer.h#L621
QgsMapLayer.temporalProperties: src/core/qgsmaplayer.h#L1756 QgsMapLayer.temporalProperties: src/core/qgsmaplayer.h#L1796
QgsMapLayer.timestamp: src/core/qgsmaplayer.h#L1686 QgsMapLayer.timestamp: src/core/qgsmaplayer.h#L1726
QgsMapLayer.title: src/core/qgsmaplayer.h#L342 QgsMapLayer.title: src/core/qgsmaplayer.h#L342
QgsMapLayer.transformContext: src/core/qgsmaplayer.h#L1074 QgsMapLayer.transformContext: src/core/qgsmaplayer.h#L1114
QgsMapLayer.trigger3DUpdate: src/core/qgsmaplayer.h#L1877 QgsMapLayer.trigger3DUpdate: src/core/qgsmaplayer.h#L1917
QgsMapLayer.triggerRepaint: src/core/qgsmaplayer.h#L1869 QgsMapLayer.triggerRepaint: src/core/qgsmaplayer.h#L1909
QgsMapLayer.type: src/core/qgsmaplayer.h#L219 QgsMapLayer.type: src/core/qgsmaplayer.h#L219
QgsMapLayer.undoStack: src/core/qgsmaplayer.h#L1509 QgsMapLayer.undoStack: src/core/qgsmaplayer.h#L1549
QgsMapLayer.undoStackStyles: src/core/qgsmaplayer.h#L1514 QgsMapLayer.undoStackStyles: src/core/qgsmaplayer.h#L1554
QgsMapLayer.verticalCrs: src/core/qgsmaplayer.h#L1014 QgsMapLayer.verticalCrs: src/core/qgsmaplayer.h#L1054
QgsMapLayer.verticalCrsChanged: src/core/qgsmaplayer.h#L1994 QgsMapLayer.verticalCrsChanged: src/core/qgsmaplayer.h#L2034
QgsMapLayer.wgs84Extent: src/core/qgsmaplayer.h#L568 QgsMapLayer.wgs84Extent: src/core/qgsmaplayer.h#L568
QgsMapLayer.willBeDeleted: src/core/qgsmaplayer.h#L2074 QgsMapLayer.willBeDeleted: src/core/qgsmaplayer.h#L2114
QgsMapLayer.writeCommonStyle: src/core/qgsmaplayer.h#L2258 QgsMapLayer.writeCommonStyle: src/core/qgsmaplayer.h#L2298
QgsMapLayer.writeCustomProperties: src/core/qgsmaplayer.h#L2248 QgsMapLayer.writeCustomProperties: src/core/qgsmaplayer.h#L2288
QgsMapLayer.writeLayerXml: src/core/qgsmaplayer.h#L697 QgsMapLayer.writeLayerXml: src/core/qgsmaplayer.h#L697
QgsMapLayer.writeStyle: src/core/qgsmaplayer.h#L1405 QgsMapLayer.writeStyle: src/core/qgsmaplayer.h#L1445
QgsMapLayer.writeStyleManager: src/core/qgsmaplayer.h#L2253 QgsMapLayer.writeStyleManager: src/core/qgsmaplayer.h#L2293
QgsMapLayer.writeSymbology: src/core/qgsmaplayer.h#L1391 QgsMapLayer.writeSymbology: src/core/qgsmaplayer.h#L1431
QgsMapLayer.writeXml: src/core/qgsmaplayer.h#L2211 QgsMapLayer.writeXml: src/core/qgsmaplayer.h#L2251
QgsMapLayer: src/core/qgsmaplayer.h#L76 QgsMapLayer: src/core/qgsmaplayer.h#L76
QgsMapLayerDependency.__hash__: src/core/qgsmaplayerdependency.h#L78 QgsMapLayerDependency.__hash__: src/core/qgsmaplayerdependency.h#L78
QgsMapLayerDependency.layerId: src/core/qgsmaplayerdependency.h#L67 QgsMapLayerDependency.layerId: src/core/qgsmaplayerdependency.h#L67

File diff suppressed because one or more lines are too long

View File

@ -16,7 +16,9 @@
typedef QVector<QgsPointXY> QgsPolylineXY; typedef QVector<QgsPointXY> QgsPolylineXY;
typedef QgsPointSequence QgsPolyline; typedef QVector<QgsPoint> QgsPolyline;
typedef QVector<QVector< QgsPoint >> QgsMultiPolyline;
typedef QVector<QVector<QgsPointXY>> QgsPolygonXY; typedef QVector<QVector<QgsPointXY>> QgsPolygonXY;

View File

@ -825,12 +825,24 @@ Deletes a style from the database
- msgError: a descriptive error message if any occurs - msgError: a descriptive error message if any occurs
%End %End
enum class SaveStyleResult
{
Success,
QmlGenerationFailed,
SldGenerationFailed,
DatabaseWriteFailed,
};
typedef QFlags<QgsMapLayer::SaveStyleResult> SaveStyleResults;
virtual void saveStyleToDatabase( const QString &name, const QString &description, virtual void saveStyleToDatabase( const QString &name, const QString &description,
bool useAsDefault, const QString &uiFileContent, bool useAsDefault, const QString &uiFileContent,
QString &msgError /Out/, QString &msgError /Out/,
QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories ); QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories ) /Deprecated="Since 4.0. Use saveStyleToDatabaseV2() instead."/;
%Docstring %Docstring
Saves named and sld style of the layer to the style table in the db. Saves QML and SLD representations of the layer's style to a table in the
database.
:param name: Style name :param name: Style name
:param description: A description of the style :param description: A description of the style
@ -847,9 +859,33 @@ Saves named and sld style of the layer to the style table in the db.
Use :py:func:`QgsProviderRegistry.styleExists()` to test in advance if a style already exists and handle this appropriately Use :py:func:`QgsProviderRegistry.styleExists()` to test in advance if a style already exists and handle this appropriately
in your client code. in your client code.
:return: a descriptive error message if any occurs :return: - msgError: a descriptive error message if any occurs
.. deprecated:: 4.0
Use :py:func:`~QgsMapLayer.saveStyleToDatabaseV2` instead.
%End %End
QgsMapLayer::SaveStyleResults saveStyleToDatabaseV2( const QString &name, const QString &description,
bool useAsDefault, const QString &uiFileContent,
QString &msgError /Out/,
QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories );
%Docstring
Saves QML and SLD representations of the layer's style to a table in the
database.
:param name: Style name
:param description: A description of the style
:param useAsDefault: Set to ``True`` if style should be used as the
default style for the layer
:param uiFileContent:
:param categories: the style categories to be saved.
:return: - flags representing whether QML or SLD storing was successful
- msgError: a descriptive error message if any occurs
.. versionadded:: 4.0
%End
virtual QString loadNamedStyle( const QString &theURI, bool &resultFlag /Out/, bool loadFromLocalDb, virtual QString loadNamedStyle( const QString &theURI, bool &resultFlag /Out/, bool loadFromLocalDb,

View File

@ -217,6 +217,8 @@ Creates an OGC expression XML element from the ``exp`` expression.
}; };
/************************************************************************ /************************************************************************
* This file has been generated automatically from * * This file has been generated automatically from *
* * * *

View File

@ -4938,205 +4938,205 @@ QgsGeographicCoordinateNumericFormat.sortKey: src/core/numericformats/qgscoordin
QgsGeographicCoordinateNumericFormat.suggestSampleValue: src/core/numericformats/qgscoordinatenumericformat.h#L53 QgsGeographicCoordinateNumericFormat.suggestSampleValue: src/core/numericformats/qgscoordinatenumericformat.h#L53
QgsGeographicCoordinateNumericFormat.visibleName: src/core/numericformats/qgscoordinatenumericformat.h#L51 QgsGeographicCoordinateNumericFormat.visibleName: src/core/numericformats/qgscoordinatenumericformat.h#L51
QgsGeographicCoordinateNumericFormat: src/core/numericformats/qgscoordinatenumericformat.h#L28 QgsGeographicCoordinateNumericFormat: src/core/numericformats/qgscoordinatenumericformat.h#L28
QgsGeometry.Error.Error: src/core/geometry/qgsgeometry.h#L2760 QgsGeometry.Error.Error: src/core/geometry/qgsgeometry.h#L2777
QgsGeometry.Error.__repr__: src/core/geometry/qgsgeometry.h#L2783 QgsGeometry.Error.__repr__: src/core/geometry/qgsgeometry.h#L2800
QgsGeometry.Error.hasWhere: src/core/geometry/qgsgeometry.h#L2780 QgsGeometry.Error.hasWhere: src/core/geometry/qgsgeometry.h#L2797
QgsGeometry.Error.what: src/core/geometry/qgsgeometry.h#L2770 QgsGeometry.Error.what: src/core/geometry/qgsgeometry.h#L2787
QgsGeometry.Error.where: src/core/geometry/qgsgeometry.h#L2775 QgsGeometry.Error.where: src/core/geometry/qgsgeometry.h#L2792
QgsGeometry.Error: src/core/geometry/qgsgeometry.h#L2751 QgsGeometry.Error: src/core/geometry/qgsgeometry.h#L2768
QgsGeometry.QVariant: src/core/geometry/qgsgeometry.h#L3180 QgsGeometry.QVariant: src/core/geometry/qgsgeometry.h#L3197
QgsGeometry.QgsGeometry: src/core/geometry/qgsgeometry.h#L184 QgsGeometry.QgsGeometry: src/core/geometry/qgsgeometry.h#L201
QgsGeometry.__repr__: src/core/geometry/qgsgeometry.h#L2185 QgsGeometry.__repr__: src/core/geometry/qgsgeometry.h#L2202
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L930 QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L947
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L948 QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L965
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L966 QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L983
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L982 QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L999
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L939 QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L956
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L957 QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L974
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L975 QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L992
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L914 QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L931
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L921 QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L938
QgsGeometry.addTopologicalPoint: src/core/geometry/qgsgeometry.h#L815 QgsGeometry.addTopologicalPoint: src/core/geometry/qgsgeometry.h#L832
QgsGeometry.adjacentVertices: src/core/geometry/qgsgeometry.h#L778 QgsGeometry.adjacentVertices: src/core/geometry/qgsgeometry.h#L795
QgsGeometry.angleAtVertex: src/core/geometry/qgsgeometry.h#L764 QgsGeometry.angleAtVertex: src/core/geometry/qgsgeometry.h#L781
QgsGeometry.applyDashPattern: src/core/geometry/qgsgeometry.h#L1372 QgsGeometry.applyDashPattern: src/core/geometry/qgsgeometry.h#L1389
QgsGeometry.area: src/core/geometry/qgsgeometry.h#L476 QgsGeometry.area: src/core/geometry/qgsgeometry.h#L493
QgsGeometry.asJson: src/core/geometry/qgsgeometry.h#L2204 QgsGeometry.asJson: src/core/geometry/qgsgeometry.h#L2221
QgsGeometry.asMultiPoint: src/core/geometry/qgsgeometry.h#L2418 QgsGeometry.asMultiPoint: src/core/geometry/qgsgeometry.h#L2435
QgsGeometry.asMultiPolygon: src/core/geometry/qgsgeometry.h#L2508 QgsGeometry.asMultiPolygon: src/core/geometry/qgsgeometry.h#L2525
QgsGeometry.asMultiPolyline: src/core/geometry/qgsgeometry.h#L2463 QgsGeometry.asMultiPolyline: src/core/geometry/qgsgeometry.h#L2480
QgsGeometry.asPoint: src/core/geometry/qgsgeometry.h#L2283 QgsGeometry.asPoint: src/core/geometry/qgsgeometry.h#L2300
QgsGeometry.asPolygon: src/core/geometry/qgsgeometry.h#L2375 QgsGeometry.asPolygon: src/core/geometry/qgsgeometry.h#L2392
QgsGeometry.asPolyline: src/core/geometry/qgsgeometry.h#L2330 QgsGeometry.asPolyline: src/core/geometry/qgsgeometry.h#L2347
QgsGeometry.asQPointF: src/core/geometry/qgsgeometry.h#L2538 QgsGeometry.asQPointF: src/core/geometry/qgsgeometry.h#L2555
QgsGeometry.asQPolygonF: src/core/geometry/qgsgeometry.h#L2551 QgsGeometry.asQPolygonF: src/core/geometry/qgsgeometry.h#L2568
QgsGeometry.asWkb: src/core/geometry/qgsgeometry.h#L2175 QgsGeometry.asWkb: src/core/geometry/qgsgeometry.h#L2192
QgsGeometry.asWkt: src/core/geometry/qgsgeometry.h#L2182 QgsGeometry.asWkt: src/core/geometry/qgsgeometry.h#L2199
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2626 QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2643
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2627 QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2644
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2640 QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2657
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2641 QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2658
QgsGeometry.boundingBox3D: src/core/geometry/qgsgeometry.h#L1206 QgsGeometry.boundingBox3D: src/core/geometry/qgsgeometry.h#L1223
QgsGeometry.boundingBox: src/core/geometry/qgsgeometry.h#L1199 QgsGeometry.boundingBox: src/core/geometry/qgsgeometry.h#L1216
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1447 QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1464
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1457 QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1474
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1544 QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1561
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1557 QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1574
QgsGeometry.centroid: src/core/geometry/qgsgeometry.h#L1686 QgsGeometry.centroid: src/core/geometry/qgsgeometry.h#L1703
QgsGeometry.clipped: src/core/geometry/qgsgeometry.h#L2022 QgsGeometry.clipped: src/core/geometry/qgsgeometry.h#L2039
QgsGeometry.closestSegmentWithContext: src/core/geometry/qgsgeometry.h#L907 QgsGeometry.closestSegmentWithContext: src/core/geometry/qgsgeometry.h#L924
QgsGeometry.closestVertex: src/core/geometry/qgsgeometry.h#L747 QgsGeometry.closestVertex: src/core/geometry/qgsgeometry.h#L764
QgsGeometry.closestVertexWithContext: src/core/geometry/qgsgeometry.h#L894 QgsGeometry.closestVertexWithContext: src/core/geometry/qgsgeometry.h#L911
QgsGeometry.collectGeometry: src/core/geometry/qgsgeometry.h#L330 QgsGeometry.collectGeometry: src/core/geometry/qgsgeometry.h#L347
QgsGeometry.combine: src/core/geometry/qgsgeometry.h#L2038 QgsGeometry.combine: src/core/geometry/qgsgeometry.h#L2055
QgsGeometry.compare: src/core/geometry/qgsgeometry.h#L3013 QgsGeometry.compare: src/core/geometry/qgsgeometry.h#L3030
QgsGeometry.concaveHull: src/core/geometry/qgsgeometry.h#L1816 QgsGeometry.concaveHull: src/core/geometry/qgsgeometry.h#L1833
QgsGeometry.constGet: src/core/geometry/qgsgeometry.h#L205 QgsGeometry.constGet: src/core/geometry/qgsgeometry.h#L222
QgsGeometry.constParts: src/core/geometry/qgsgeometry.h#L656 QgsGeometry.constParts: src/core/geometry/qgsgeometry.h#L673
QgsGeometry.constrainedDelaunayTriangulation: src/core/geometry/qgsgeometry.h#L1858 QgsGeometry.constrainedDelaunayTriangulation: src/core/geometry/qgsgeometry.h#L1875
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1462 QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1479
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1469 QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1486
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1480 QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1497
QgsGeometry.convertGeometryCollectionToSubclass: src/core/geometry/qgsgeometry.h#L2613 QgsGeometry.convertGeometryCollectionToSubclass: src/core/geometry/qgsgeometry.h#L2630
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3167 QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3184
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3174 QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3191
QgsGeometry.convertToCurvedMultiType: src/core/geometry/qgsgeometry.h#L2591 QgsGeometry.convertToCurvedMultiType: src/core/geometry/qgsgeometry.h#L2608
QgsGeometry.convertToCurves: src/core/geometry/qgsgeometry.h#L1671 QgsGeometry.convertToCurves: src/core/geometry/qgsgeometry.h#L1688
QgsGeometry.convertToMultiType: src/core/geometry/qgsgeometry.h#L2574 QgsGeometry.convertToMultiType: src/core/geometry/qgsgeometry.h#L2591
QgsGeometry.convertToSingleType: src/core/geometry/qgsgeometry.h#L2602 QgsGeometry.convertToSingleType: src/core/geometry/qgsgeometry.h#L2619
QgsGeometry.convertToStraightSegment: src/core/geometry/qgsgeometry.h#L2847 QgsGeometry.convertToStraightSegment: src/core/geometry/qgsgeometry.h#L2864
QgsGeometry.convertToType: src/core/geometry/qgsgeometry.h#L2256 QgsGeometry.convertToType: src/core/geometry/qgsgeometry.h#L2273
QgsGeometry.convexHull: src/core/geometry/qgsgeometry.h#L1801 QgsGeometry.convexHull: src/core/geometry/qgsgeometry.h#L1818
QgsGeometry.createGeometryEngine: src/core/geometry/qgsgeometry.h#L3160 QgsGeometry.createGeometryEngine: src/core/geometry/qgsgeometry.h#L3177
QgsGeometry.createPolygonFromQPolygonF: src/core/geometry/qgsgeometry.h#L2956 QgsGeometry.createPolygonFromQPolygonF: src/core/geometry/qgsgeometry.h#L2973
QgsGeometry.createPolylineFromQPolygonF: src/core/geometry/qgsgeometry.h#L2947 QgsGeometry.createPolylineFromQPolygonF: src/core/geometry/qgsgeometry.h#L2964
QgsGeometry.createWedgeBuffer: src/core/geometry/qgsgeometry.h#L347 QgsGeometry.createWedgeBuffer: src/core/geometry/qgsgeometry.h#L364
QgsGeometry.createWedgeBufferFromAngles: src/core/geometry/qgsgeometry.h#L363 QgsGeometry.createWedgeBufferFromAngles: src/core/geometry/qgsgeometry.h#L380
QgsGeometry.crosses: src/core/geometry/qgsgeometry.h#L1535 QgsGeometry.crosses: src/core/geometry/qgsgeometry.h#L1552
QgsGeometry.delaunayTriangulation: src/core/geometry/qgsgeometry.h#L1844 QgsGeometry.delaunayTriangulation: src/core/geometry/qgsgeometry.h#L1861
QgsGeometry.deletePart: src/core/geometry/qgsgeometry.h#L2564 QgsGeometry.deletePart: src/core/geometry/qgsgeometry.h#L2581
QgsGeometry.deleteRing: src/core/geometry/qgsgeometry.h#L2558 QgsGeometry.deleteRing: src/core/geometry/qgsgeometry.h#L2575
QgsGeometry.deleteVertex: src/core/geometry/qgsgeometry.h#L846 QgsGeometry.deleteVertex: src/core/geometry/qgsgeometry.h#L863
QgsGeometry.densifyByCount: src/core/geometry/qgsgeometry.h#L1639 QgsGeometry.densifyByCount: src/core/geometry/qgsgeometry.h#L1656
QgsGeometry.densifyByDistance: src/core/geometry/qgsgeometry.h#L1654 QgsGeometry.densifyByDistance: src/core/geometry/qgsgeometry.h#L1671
QgsGeometry.difference: src/core/geometry/qgsgeometry.h#L2063 QgsGeometry.difference: src/core/geometry/qgsgeometry.h#L2080
QgsGeometry.disjoint: src/core/geometry/qgsgeometry.h#L1491 QgsGeometry.disjoint: src/core/geometry/qgsgeometry.h#L1508
QgsGeometry.distance: src/core/geometry/qgsgeometry.h#L500 QgsGeometry.distance: src/core/geometry/qgsgeometry.h#L517
QgsGeometry.distanceToVertex: src/core/geometry/qgsgeometry.h#L756 QgsGeometry.distanceToVertex: src/core/geometry/qgsgeometry.h#L773
QgsGeometry.draw: src/core/geometry/qgsgeometry.h#L2866 QgsGeometry.draw: src/core/geometry/qgsgeometry.h#L2883
QgsGeometry.equals: src/core/geometry/qgsgeometry.h#L414 QgsGeometry.equals: src/core/geometry/qgsgeometry.h#L431
QgsGeometry.extendLine: src/core/geometry/qgsgeometry.h#L1626 QgsGeometry.extendLine: src/core/geometry/qgsgeometry.h#L1643
QgsGeometry.extrude: src/core/geometry/qgsgeometry.h#L2079 QgsGeometry.extrude: src/core/geometry/qgsgeometry.h#L2096
QgsGeometry.forcePolygonClockwise: src/core/geometry/qgsgeometry.h#L2733 QgsGeometry.forcePolygonClockwise: src/core/geometry/qgsgeometry.h#L2750
QgsGeometry.forcePolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2745 QgsGeometry.forcePolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2762
QgsGeometry.forceRHR: src/core/geometry/qgsgeometry.h#L2721 QgsGeometry.forceRHR: src/core/geometry/qgsgeometry.h#L2738
QgsGeometry.frechetDistance: src/core/geometry/qgsgeometry.h#L709 QgsGeometry.frechetDistance: src/core/geometry/qgsgeometry.h#L726
QgsGeometry.frechetDistanceDensify: src/core/geometry/qgsgeometry.h#L733 QgsGeometry.frechetDistanceDensify: src/core/geometry/qgsgeometry.h#L750
QgsGeometry.fromBox3D: src/core/geometry/qgsgeometry.h#L326 QgsGeometry.fromBox3D: src/core/geometry/qgsgeometry.h#L343
QgsGeometry.fromMultiPointXY: src/core/geometry/qgsgeometry.h#L255 QgsGeometry.fromMultiPointXY: src/core/geometry/qgsgeometry.h#L272
QgsGeometry.fromMultiPolygonXY: src/core/geometry/qgsgeometry.h#L314 QgsGeometry.fromMultiPolygonXY: src/core/geometry/qgsgeometry.h#L331
QgsGeometry.fromMultiPolylineXY: src/core/geometry/qgsgeometry.h#L282 QgsGeometry.fromMultiPolylineXY: src/core/geometry/qgsgeometry.h#L299
QgsGeometry.fromPoint: src/core/geometry/qgsgeometry.h#L252 QgsGeometry.fromPoint: src/core/geometry/qgsgeometry.h#L269
QgsGeometry.fromPointXY: src/core/geometry/qgsgeometry.h#L245 QgsGeometry.fromPointXY: src/core/geometry/qgsgeometry.h#L262
QgsGeometry.fromPolygonXY: src/core/geometry/qgsgeometry.h#L309 QgsGeometry.fromPolygonXY: src/core/geometry/qgsgeometry.h#L326
QgsGeometry.fromPolyline: src/core/geometry/qgsgeometry.h#L277 QgsGeometry.fromPolyline: src/core/geometry/qgsgeometry.h#L294
QgsGeometry.fromPolylineXY: src/core/geometry/qgsgeometry.h#L267 QgsGeometry.fromPolylineXY: src/core/geometry/qgsgeometry.h#L284
QgsGeometry.fromQPointF: src/core/geometry/qgsgeometry.h#L2930 QgsGeometry.fromQPointF: src/core/geometry/qgsgeometry.h#L2947
QgsGeometry.fromQPolygonF: src/core/geometry/qgsgeometry.h#L2938 QgsGeometry.fromQPolygonF: src/core/geometry/qgsgeometry.h#L2955
QgsGeometry.fromRect: src/core/geometry/qgsgeometry.h#L317 QgsGeometry.fromRect: src/core/geometry/qgsgeometry.h#L334
QgsGeometry.fromWkb: src/core/geometry/qgsgeometry.h#L376 QgsGeometry.fromWkb: src/core/geometry/qgsgeometry.h#L393
QgsGeometry.fromWkt: src/core/geometry/qgsgeometry.h#L243 QgsGeometry.fromWkt: src/core/geometry/qgsgeometry.h#L260
QgsGeometry.get: src/core/geometry/qgsgeometry.h#L218 QgsGeometry.get: src/core/geometry/qgsgeometry.h#L235
QgsGeometry.hausdorffDistance: src/core/geometry/qgsgeometry.h#L674 QgsGeometry.hausdorffDistance: src/core/geometry/qgsgeometry.h#L691
QgsGeometry.hausdorffDistanceDensify: src/core/geometry/qgsgeometry.h#L693 QgsGeometry.hausdorffDistanceDensify: src/core/geometry/qgsgeometry.h#L710
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L792 QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L809
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L806 QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L823
QgsGeometry.interpolate: src/core/geometry/qgsgeometry.h#L1979 QgsGeometry.interpolate: src/core/geometry/qgsgeometry.h#L1996
QgsGeometry.interpolateAngle: src/core/geometry/qgsgeometry.h#L2001 QgsGeometry.interpolateAngle: src/core/geometry/qgsgeometry.h#L2018
QgsGeometry.intersection: src/core/geometry/qgsgeometry.h#L2014 QgsGeometry.intersection: src/core/geometry/qgsgeometry.h#L2031
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1421 QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1438
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1437 QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1454
QgsGeometry.isAxisParallelRectangle: src/core/geometry/qgsgeometry.h#L463 QgsGeometry.isAxisParallelRectangle: src/core/geometry/qgsgeometry.h#L480
QgsGeometry.isEmpty: src/core/geometry/qgsgeometry.h#L396 QgsGeometry.isEmpty: src/core/geometry/qgsgeometry.h#L413
QgsGeometry.isGeosEqual: src/core/geometry/qgsgeometry.h#L431 QgsGeometry.isGeosEqual: src/core/geometry/qgsgeometry.h#L448
QgsGeometry.isGeosValid: src/core/geometry/qgsgeometry.h#L439 QgsGeometry.isGeosValid: src/core/geometry/qgsgeometry.h#L456
QgsGeometry.isMultipart: src/core/geometry/qgsgeometry.h#L399 QgsGeometry.isMultipart: src/core/geometry/qgsgeometry.h#L416
QgsGeometry.isNull: src/core/geometry/qgsgeometry.h#L240 QgsGeometry.isNull: src/core/geometry/qgsgeometry.h#L257
QgsGeometry.isPolygonClockwise: src/core/geometry/qgsgeometry.h#L2704 QgsGeometry.isPolygonClockwise: src/core/geometry/qgsgeometry.h#L2721
QgsGeometry.isPolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2689 QgsGeometry.isPolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2706
QgsGeometry.isSimple: src/core/geometry/qgsgeometry.h#L448 QgsGeometry.isSimple: src/core/geometry/qgsgeometry.h#L465
QgsGeometry.largestEmptyCircle: src/core/geometry/qgsgeometry.h#L1739 QgsGeometry.largestEmptyCircle: src/core/geometry/qgsgeometry.h#L1756
QgsGeometry.lastError: src/core/geometry/qgsgeometry.h#L2897 QgsGeometry.lastError: src/core/geometry/qgsgeometry.h#L2914
QgsGeometry.length: src/core/geometry/qgsgeometry.h#L491 QgsGeometry.length: src/core/geometry/qgsgeometry.h#L508
QgsGeometry.lineLocatePoint: src/core/geometry/qgsgeometry.h#L1991 QgsGeometry.lineLocatePoint: src/core/geometry/qgsgeometry.h#L2008
QgsGeometry.makeDifference: src/core/geometry/qgsgeometry.h#L1193 QgsGeometry.makeDifference: src/core/geometry/qgsgeometry.h#L1210
QgsGeometry.makeValid: src/core/geometry/qgsgeometry.h#L2663 QgsGeometry.makeValid: src/core/geometry/qgsgeometry.h#L2680
QgsGeometry.mapToPixel: src/core/geometry/qgsgeometry.h#L2860 QgsGeometry.mapToPixel: src/core/geometry/qgsgeometry.h#L2877
QgsGeometry.mergeLines: src/core/geometry/qgsgeometry.h#L2050 QgsGeometry.mergeLines: src/core/geometry/qgsgeometry.h#L2067
QgsGeometry.minimalEnclosingCircle: src/core/geometry/qgsgeometry.h#L1240 QgsGeometry.minimalEnclosingCircle: src/core/geometry/qgsgeometry.h#L1257
QgsGeometry.minimumClearance: src/core/geometry/qgsgeometry.h#L1778 QgsGeometry.minimumClearance: src/core/geometry/qgsgeometry.h#L1795
QgsGeometry.minimumClearanceLine: src/core/geometry/qgsgeometry.h#L1791 QgsGeometry.minimumClearanceLine: src/core/geometry/qgsgeometry.h#L1808
QgsGeometry.minimumWidth: src/core/geometry/qgsgeometry.h#L1755 QgsGeometry.minimumWidth: src/core/geometry/qgsgeometry.h#L1772
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L824 QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L841
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L833 QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L850
QgsGeometry.nearestPoint: src/core/geometry/qgsgeometry.h#L875 QgsGeometry.nearestPoint: src/core/geometry/qgsgeometry.h#L892
QgsGeometry.node: src/core/geometry/qgsgeometry.h#L1924 QgsGeometry.node: src/core/geometry/qgsgeometry.h#L1941
QgsGeometry.normalize: src/core/geometry/qgsgeometry.h#L2820 QgsGeometry.normalize: src/core/geometry/qgsgeometry.h#L2837
QgsGeometry.offsetCurve: src/core/geometry/qgsgeometry.h#L1566 QgsGeometry.offsetCurve: src/core/geometry/qgsgeometry.h#L1583
QgsGeometry.orientedMinimumBoundingBox: src/core/geometry/qgsgeometry.h#L1220 QgsGeometry.orientedMinimumBoundingBox: src/core/geometry/qgsgeometry.h#L1237
QgsGeometry.orthogonalize: src/core/geometry/qgsgeometry.h#L1255 QgsGeometry.orthogonalize: src/core/geometry/qgsgeometry.h#L1272
QgsGeometry.overlaps: src/core/geometry/qgsgeometry.h#L1513 QgsGeometry.overlaps: src/core/geometry/qgsgeometry.h#L1530
QgsGeometry.parts: src/core/geometry/qgsgeometry.h#L622 QgsGeometry.parts: src/core/geometry/qgsgeometry.h#L639
QgsGeometry.pointOnSurface: src/core/geometry/qgsgeometry.h#L1701 QgsGeometry.pointOnSurface: src/core/geometry/qgsgeometry.h#L1718
QgsGeometry.poleOfInaccessibility: src/core/geometry/qgsgeometry.h#L1714 QgsGeometry.poleOfInaccessibility: src/core/geometry/qgsgeometry.h#L1731
QgsGeometry.polygonOrientation: src/core/geometry/qgsgeometry.h#L2674 QgsGeometry.polygonOrientation: src/core/geometry/qgsgeometry.h#L2691
QgsGeometry.polygonize: src/core/geometry/qgsgeometry.h#L2839 QgsGeometry.polygonize: src/core/geometry/qgsgeometry.h#L2856
QgsGeometry.randomPointsInPolygon: src/core/geometry/qgsgeometry.h#L2136 QgsGeometry.randomPointsInPolygon: src/core/geometry/qgsgeometry.h#L2153
QgsGeometry.removeDuplicateNodes: src/core/geometry/qgsgeometry.h#L1410 QgsGeometry.removeDuplicateNodes: src/core/geometry/qgsgeometry.h#L1427
QgsGeometry.removeInteriorRings: src/core/geometry/qgsgeometry.h#L989 QgsGeometry.removeInteriorRings: src/core/geometry/qgsgeometry.h#L1006
QgsGeometry.requiresConversionToStraightSegments: src/core/geometry/qgsgeometry.h#L2854 QgsGeometry.requiresConversionToStraightSegments: src/core/geometry/qgsgeometry.h#L2871
QgsGeometry.reshapeGeometry: src/core/geometry/qgsgeometry.h#L1178 QgsGeometry.reshapeGeometry: src/core/geometry/qgsgeometry.h#L1195
QgsGeometry.rotate: src/core/geometry/qgsgeometry.h#L1029 QgsGeometry.rotate: src/core/geometry/qgsgeometry.h#L1046
QgsGeometry.roundWaves: src/core/geometry/qgsgeometry.h#L1337 QgsGeometry.roundWaves: src/core/geometry/qgsgeometry.h#L1354
QgsGeometry.roundWavesRandomized: src/core/geometry/qgsgeometry.h#L1357 QgsGeometry.roundWavesRandomized: src/core/geometry/qgsgeometry.h#L1374
QgsGeometry.set: src/core/geometry/qgsgeometry.h#L231 QgsGeometry.set: src/core/geometry/qgsgeometry.h#L248
QgsGeometry.sharedPaths: src/core/geometry/qgsgeometry.h#L1940 QgsGeometry.sharedPaths: src/core/geometry/qgsgeometry.h#L1957
QgsGeometry.shortestLine: src/core/geometry/qgsgeometry.h#L886 QgsGeometry.shortestLine: src/core/geometry/qgsgeometry.h#L903
QgsGeometry.simplify: src/core/geometry/qgsgeometry.h#L1629 QgsGeometry.simplify: src/core/geometry/qgsgeometry.h#L1646
QgsGeometry.simplifyCoverageVW: src/core/geometry/qgsgeometry.h#L1899 QgsGeometry.simplifyCoverageVW: src/core/geometry/qgsgeometry.h#L1916
QgsGeometry.singleSidedBuffer: src/core/geometry/qgsgeometry.h#L1582 QgsGeometry.singleSidedBuffer: src/core/geometry/qgsgeometry.h#L1599
QgsGeometry.smooth: src/core/geometry/qgsgeometry.h#L3118 QgsGeometry.smooth: src/core/geometry/qgsgeometry.h#L3135
QgsGeometry.snappedToGrid: src/core/geometry/qgsgeometry.h#L1389 QgsGeometry.snappedToGrid: src/core/geometry/qgsgeometry.h#L1406
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1092 QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1109
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1172 QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1189
QgsGeometry.sqrDistToVertexAt: src/core/geometry/qgsgeometry.h#L869 QgsGeometry.sqrDistToVertexAt: src/core/geometry/qgsgeometry.h#L886
QgsGeometry.squareWaves: src/core/geometry/qgsgeometry.h#L1303 QgsGeometry.squareWaves: src/core/geometry/qgsgeometry.h#L1320
QgsGeometry.squareWavesRandomized: src/core/geometry/qgsgeometry.h#L1323 QgsGeometry.squareWavesRandomized: src/core/geometry/qgsgeometry.h#L1340
QgsGeometry.subdivide: src/core/geometry/qgsgeometry.h#L1963 QgsGeometry.subdivide: src/core/geometry/qgsgeometry.h#L1980
QgsGeometry.symDifference: src/core/geometry/qgsgeometry.h#L2076 QgsGeometry.symDifference: src/core/geometry/qgsgeometry.h#L2093
QgsGeometry.taperedBuffer: src/core/geometry/qgsgeometry.h#L1603 QgsGeometry.taperedBuffer: src/core/geometry/qgsgeometry.h#L1620
QgsGeometry.toggleCircularAtVertex: src/core/geometry/qgsgeometry.h#L855 QgsGeometry.toggleCircularAtVertex: src/core/geometry/qgsgeometry.h#L872
QgsGeometry.touches: src/core/geometry/qgsgeometry.h#L1502 QgsGeometry.touches: src/core/geometry/qgsgeometry.h#L1519
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1011 QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1028
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1021 QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1038
QgsGeometry.translate: src/core/geometry/qgsgeometry.h#L995 QgsGeometry.translate: src/core/geometry/qgsgeometry.h#L1012
QgsGeometry.triangularWaves: src/core/geometry/qgsgeometry.h#L1269 QgsGeometry.triangularWaves: src/core/geometry/qgsgeometry.h#L1286
QgsGeometry.triangularWavesRandomized: src/core/geometry/qgsgeometry.h#L1289 QgsGeometry.triangularWavesRandomized: src/core/geometry/qgsgeometry.h#L1306
QgsGeometry.type: src/core/geometry/qgsgeometry.h#L388 QgsGeometry.type: src/core/geometry/qgsgeometry.h#L405
QgsGeometry.unaryUnion: src/core/geometry/qgsgeometry.h#L2830 QgsGeometry.unaryUnion: src/core/geometry/qgsgeometry.h#L2847
QgsGeometry.unionCoverage: src/core/geometry/qgsgeometry.h#L1912 QgsGeometry.unionCoverage: src/core/geometry/qgsgeometry.h#L1929
QgsGeometry.validateCoverage: src/core/geometry/qgsgeometry.h#L1877 QgsGeometry.validateCoverage: src/core/geometry/qgsgeometry.h#L1894
QgsGeometry.validateGeometry: src/core/geometry/qgsgeometry.h#L2809 QgsGeometry.validateGeometry: src/core/geometry/qgsgeometry.h#L2826
QgsGeometry.variableWidthBufferByM: src/core/geometry/qgsgeometry.h#L1619 QgsGeometry.variableWidthBufferByM: src/core/geometry/qgsgeometry.h#L1636
QgsGeometry.vertexAt: src/core/geometry/qgsgeometry.h#L862 QgsGeometry.vertexAt: src/core/geometry/qgsgeometry.h#L879
QgsGeometry.vertexIdFromVertexNr: src/core/geometry/qgsgeometry.h#L2877 QgsGeometry.vertexIdFromVertexNr: src/core/geometry/qgsgeometry.h#L2894
QgsGeometry.vertexNrFromVertexId: src/core/geometry/qgsgeometry.h#L2889 QgsGeometry.vertexNrFromVertexId: src/core/geometry/qgsgeometry.h#L2906
QgsGeometry.vertices: src/core/geometry/qgsgeometry.h#L540 QgsGeometry.vertices: src/core/geometry/qgsgeometry.h#L557
QgsGeometry.voronoiDiagram: src/core/geometry/qgsgeometry.h#L1832 QgsGeometry.voronoiDiagram: src/core/geometry/qgsgeometry.h#L1849
QgsGeometry.within: src/core/geometry/qgsgeometry.h#L1524 QgsGeometry.within: src/core/geometry/qgsgeometry.h#L1541
QgsGeometry.wkbSize: src/core/geometry/qgsgeometry.h#L2167 QgsGeometry.wkbSize: src/core/geometry/qgsgeometry.h#L2184
QgsGeometry.wkbType: src/core/geometry/qgsgeometry.h#L382 QgsGeometry.wkbType: src/core/geometry/qgsgeometry.h#L399
QgsGeometry: src/core/geometry/qgsgeometry.h#L161 QgsGeometry: src/core/geometry/qgsgeometry.h#L178
QgsGeometryCollection.__bool__: src/core/geometry/qgsgeometrycollection.h#L136 QgsGeometryCollection.__bool__: src/core/geometry/qgsgeometrycollection.h#L136
QgsGeometryCollection.__delitem__: src/core/geometry/qgsgeometrycollection.h#L401 QgsGeometryCollection.__delitem__: src/core/geometry/qgsgeometrycollection.h#L401
QgsGeometryCollection.__getitem__: src/core/geometry/qgsgeometrycollection.h#L373 QgsGeometryCollection.__getitem__: src/core/geometry/qgsgeometrycollection.h#L373
@ -5306,9 +5306,9 @@ QgsGeometryPaintDevice.painterPathToGeometry: src/core/painting/qgsgeometrypaint
QgsGeometryPaintDevice.setSimplificationTolerance: src/core/painting/qgsgeometrypaintdevice.h#L149 QgsGeometryPaintDevice.setSimplificationTolerance: src/core/painting/qgsgeometrypaintdevice.h#L149
QgsGeometryPaintDevice.setStrokedPathSegments: src/core/painting/qgsgeometrypaintdevice.h#L140 QgsGeometryPaintDevice.setStrokedPathSegments: src/core/painting/qgsgeometrypaintdevice.h#L140
QgsGeometryPaintDevice: src/core/painting/qgsgeometrypaintdevice.h#L122 QgsGeometryPaintDevice: src/core/painting/qgsgeometrypaintdevice.h#L122
QgsGeometryParameters.gridSize: src/core/geometry/qgsgeometry.h#L122 QgsGeometryParameters.gridSize: src/core/geometry/qgsgeometry.h#L139
QgsGeometryParameters.setGridSize: src/core/geometry/qgsgeometry.h#L134 QgsGeometryParameters.setGridSize: src/core/geometry/qgsgeometry.h#L151
QgsGeometryParameters: src/core/geometry/qgsgeometry.h#L108 QgsGeometryParameters: src/core/geometry/qgsgeometry.h#L125
QgsGeometryPartIterator.__iter__: src/core/geometry/qgsabstractgeometry.h#L1286 QgsGeometryPartIterator.__iter__: src/core/geometry/qgsabstractgeometry.h#L1286
QgsGeometryPartIterator.__next__: src/core/geometry/qgsabstractgeometry.h#L1291 QgsGeometryPartIterator.__next__: src/core/geometry/qgsabstractgeometry.h#L1291
QgsGeometryPartIterator.hasNext: src/core/geometry/qgsabstractgeometry.h#L1280 QgsGeometryPartIterator.hasNext: src/core/geometry/qgsabstractgeometry.h#L1280
@ -5508,13 +5508,13 @@ QgsGlowEffect.shadeExterior: src/core/effects/qgsgloweffect.h#L274
QgsGlowEffect.spread: src/core/effects/qgsgloweffect.h#L73 QgsGlowEffect.spread: src/core/effects/qgsgloweffect.h#L73
QgsGlowEffect.spreadUnit: src/core/effects/qgsgloweffect.h#L91 QgsGlowEffect.spreadUnit: src/core/effects/qgsgloweffect.h#L91
QgsGlowEffect: src/core/effects/qgsgloweffect.h#L37 QgsGlowEffect: src/core/effects/qgsgloweffect.h#L37
QgsGml.crs: src/core/qgsgml.h#L431 QgsGml.crs: src/core/qgsgml.h#L432
QgsGml.dataProgressAndSteps: src/core/qgsgml.h#L455 QgsGml.dataProgressAndSteps: src/core/qgsgml.h#L456
QgsGml.dataReadProgress: src/core/qgsgml.h#L440 QgsGml.dataReadProgress: src/core/qgsgml.h#L441
QgsGml.getFeatures: src/core/qgsgml.h#L408 QgsGml.getFeatures: src/core/qgsgml.h#L409
QgsGml.getFeatures: src/core/qgsgml.h#L420 QgsGml.getFeatures: src/core/qgsgml.h#L421
QgsGml.totalStepsUpdate: src/core/qgsgml.h#L447 QgsGml.totalStepsUpdate: src/core/qgsgml.h#L448
QgsGml: src/core/qgsgml.h#L387 QgsGml: src/core/qgsgml.h#L388
QgsGmlFeatureClass.fieldIndex: src/core/qgsgmlschema.h#L49 QgsGmlFeatureClass.fieldIndex: src/core/qgsgmlschema.h#L49
QgsGmlFeatureClass.path: src/core/qgsgmlschema.h#L51 QgsGmlFeatureClass.path: src/core/qgsgmlschema.h#L51
QgsGmlFeatureClass: src/core/qgsgmlschema.h#L40 QgsGmlFeatureClass: src/core/qgsgmlschema.h#L40
@ -8951,219 +8951,220 @@ QgsMapInfoSymbolConverter.convertFillSymbol: src/core/symbology/qgsmapinfosymbol
QgsMapInfoSymbolConverter.convertLineSymbol: src/core/symbology/qgsmapinfosymbolconverter.h#L75 QgsMapInfoSymbolConverter.convertLineSymbol: src/core/symbology/qgsmapinfosymbolconverter.h#L75
QgsMapInfoSymbolConverter.convertMarkerSymbol: src/core/symbology/qgsmapinfosymbolconverter.h#L91 QgsMapInfoSymbolConverter.convertMarkerSymbol: src/core/symbology/qgsmapinfosymbolconverter.h#L91
QgsMapInfoSymbolConverter: src/core/symbology/qgsmapinfosymbolconverter.h#L66 QgsMapInfoSymbolConverter: src/core/symbology/qgsmapinfosymbolconverter.h#L66
QgsMapLayer.__repr__: src/core/qgsmaplayer.h#L1915 QgsMapLayer.__repr__: src/core/qgsmaplayer.h#L1955
QgsMapLayer.abstract: src/core/qgsmaplayer.h#L356 QgsMapLayer.abstract: src/core/qgsmaplayer.h#L356
QgsMapLayer.accept: src/core/qgsmaplayer.h#L1742 QgsMapLayer.accept: src/core/qgsmaplayer.h#L1782
QgsMapLayer.appendError: src/core/qgsmaplayer.h#L2279 QgsMapLayer.appendError: src/core/qgsmaplayer.h#L2319
QgsMapLayer.attribution: src/core/qgsmaplayer.h#L412 QgsMapLayer.attribution: src/core/qgsmaplayer.h#L412
QgsMapLayer.attributionUrl: src/core/qgsmaplayer.h#L426 QgsMapLayer.attributionUrl: src/core/qgsmaplayer.h#L426
QgsMapLayer.autoRefreshInterval: src/core/qgsmaplayer.h#L1636 QgsMapLayer.autoRefreshInterval: src/core/qgsmaplayer.h#L1676
QgsMapLayer.autoRefreshIntervalChanged: src/core/qgsmaplayer.h#L2080 QgsMapLayer.autoRefreshIntervalChanged: src/core/qgsmaplayer.h#L2120
QgsMapLayer.autoRefreshMode: src/core/qgsmaplayer.h#L1628 QgsMapLayer.autoRefreshMode: src/core/qgsmaplayer.h#L1668
QgsMapLayer.beforeResolveReferences: src/core/qgsmaplayer.h#L1938 QgsMapLayer.beforeResolveReferences: src/core/qgsmaplayer.h#L1978
QgsMapLayer.blendMode: src/core/qgsmaplayer.h#L516 QgsMapLayer.blendMode: src/core/qgsmaplayer.h#L516
QgsMapLayer.blendModeChanged: src/core/qgsmaplayer.h#L2011 QgsMapLayer.blendModeChanged: src/core/qgsmaplayer.h#L2051
QgsMapLayer.clone: src/core/qgsmaplayer.h#L214 QgsMapLayer.clone: src/core/qgsmaplayer.h#L214
QgsMapLayer.clone: src/core/qgsmaplayer.h#L2187 QgsMapLayer.clone: src/core/qgsmaplayer.h#L2227
QgsMapLayer.configChanged: src/core/qgsmaplayer.h#L2062 QgsMapLayer.configChanged: src/core/qgsmaplayer.h#L2102
QgsMapLayer.createMapRenderer: src/core/qgsmaplayer.h#L549 QgsMapLayer.createMapRenderer: src/core/qgsmaplayer.h#L549
QgsMapLayer.crs3D: src/core/qgsmaplayer.h#L1034 QgsMapLayer.crs3D: src/core/qgsmaplayer.h#L1074
QgsMapLayer.crs3DChanged: src/core/qgsmaplayer.h#L1977 QgsMapLayer.crs3DChanged: src/core/qgsmaplayer.h#L2017
QgsMapLayer.crs: src/core/qgsmaplayer.h#L994 QgsMapLayer.crs: src/core/qgsmaplayer.h#L1034
QgsMapLayer.crsChanged: src/core/qgsmaplayer.h#L1966 QgsMapLayer.crsChanged: src/core/qgsmaplayer.h#L2006
QgsMapLayer.customProperty: src/core/qgsmaplayer.h#L721 QgsMapLayer.customProperty: src/core/qgsmaplayer.h#L721
QgsMapLayer.customPropertyChanged: src/core/qgsmaplayer.h#L2125 QgsMapLayer.customPropertyChanged: src/core/qgsmaplayer.h#L2165
QgsMapLayer.customPropertyKeys: src/core/qgsmaplayer.h#L708 QgsMapLayer.customPropertyKeys: src/core/qgsmaplayer.h#L708
QgsMapLayer.dataChanged: src/core/qgsmaplayer.h#L2008 QgsMapLayer.dataChanged: src/core/qgsmaplayer.h#L2048
QgsMapLayer.dataProvider: src/core/qgsmaplayer.h#L302 QgsMapLayer.dataProvider: src/core/qgsmaplayer.h#L302
QgsMapLayer.dataSourceChanged: src/core/qgsmaplayer.h#L2104 QgsMapLayer.dataSourceChanged: src/core/qgsmaplayer.h#L2144
QgsMapLayer.dataUrl: src/core/qgsmaplayer.h#L384 QgsMapLayer.dataUrl: src/core/qgsmaplayer.h#L384
QgsMapLayer.dataUrlFormat: src/core/qgsmaplayer.h#L398 QgsMapLayer.dataUrlFormat: src/core/qgsmaplayer.h#L398
QgsMapLayer.decodedSource: src/core/qgsmaplayer.h#L2238 QgsMapLayer.decodedSource: src/core/qgsmaplayer.h#L2278
QgsMapLayer.deleteStyleFromDatabase: src/core/qgsmaplayer.h#L758 QgsMapLayer.deleteStyleFromDatabase: src/core/qgsmaplayer.h#L758
QgsMapLayer.dependenciesChanged: src/core/qgsmaplayer.h#L2067 QgsMapLayer.dependenciesChanged: src/core/qgsmaplayer.h#L2107
QgsMapLayer.editingStarted: src/core/qgsmaplayer.h#L2131 QgsMapLayer.editingStarted: src/core/qgsmaplayer.h#L2171
QgsMapLayer.editingStopped: src/core/qgsmaplayer.h#L2137 QgsMapLayer.editingStopped: src/core/qgsmaplayer.h#L2177
QgsMapLayer.elevationProperties: src/core/qgsmaplayer.h#L1763 QgsMapLayer.elevationProperties: src/core/qgsmaplayer.h#L1803
QgsMapLayer.emitStyleChanged: src/core/qgsmaplayer.h#L1882 QgsMapLayer.emitStyleChanged: src/core/qgsmaplayer.h#L1922
QgsMapLayer.encodedSource: src/core/qgsmaplayer.h#L2224 QgsMapLayer.encodedSource: src/core/qgsmaplayer.h#L2264
QgsMapLayer.error: src/core/qgsmaplayer.h#L981 QgsMapLayer.error: src/core/qgsmaplayer.h#L1021
QgsMapLayer.exportNamedMetadata: src/core/qgsmaplayer.h#L1096 QgsMapLayer.exportNamedMetadata: src/core/qgsmaplayer.h#L1136
QgsMapLayer.exportNamedStyle: src/core/qgsmaplayer.h#L1244 QgsMapLayer.exportNamedStyle: src/core/qgsmaplayer.h#L1284
QgsMapLayer.exportSldStyle: src/core/qgsmaplayer.h#L1255 QgsMapLayer.exportSldStyle: src/core/qgsmaplayer.h#L1295
QgsMapLayer.exportSldStyleV2: src/core/qgsmaplayer.h#L1264 QgsMapLayer.exportSldStyleV2: src/core/qgsmaplayer.h#L1304
QgsMapLayer.exportSldStyleV3: src/core/qgsmaplayer.h#L1275 QgsMapLayer.exportSldStyleV3: src/core/qgsmaplayer.h#L1315
QgsMapLayer.extensionPropertyType: src/core/qgsmaplayer.h#L260 QgsMapLayer.extensionPropertyType: src/core/qgsmaplayer.h#L260
QgsMapLayer.extent3D: src/core/qgsmaplayer.h#L558 QgsMapLayer.extent3D: src/core/qgsmaplayer.h#L558
QgsMapLayer.extent: src/core/qgsmaplayer.h#L552 QgsMapLayer.extent: src/core/qgsmaplayer.h#L552
QgsMapLayer.flags: src/core/qgsmaplayer.h#L231 QgsMapLayer.flags: src/core/qgsmaplayer.h#L231
QgsMapLayer.flagsChanged: src/core/qgsmaplayer.h#L2095 QgsMapLayer.flagsChanged: src/core/qgsmaplayer.h#L2135
QgsMapLayer.formatLayerName: src/core/qgsmaplayer.h#L1081 QgsMapLayer.formatLayerName: src/core/qgsmaplayer.h#L1121
QgsMapLayer.generateId: src/core/qgsmaplayer.h#L1731 QgsMapLayer.generateId: src/core/qgsmaplayer.h#L1771
QgsMapLayer.getStyleFromDatabase: src/core/qgsmaplayer.h#L750 QgsMapLayer.getStyleFromDatabase: src/core/qgsmaplayer.h#L750
QgsMapLayer.hasAutoRefreshEnabled: src/core/qgsmaplayer.h#L1620 QgsMapLayer.hasAutoRefreshEnabled: src/core/qgsmaplayer.h#L1660
QgsMapLayer.hasDependencyCycle: src/core/qgsmaplayer.h#L2311 QgsMapLayer.hasDependencyCycle: src/core/qgsmaplayer.h#L2351
QgsMapLayer.hasMapTips: src/core/qgsmaplayer.h#L1785 QgsMapLayer.hasMapTips: src/core/qgsmaplayer.h#L1825
QgsMapLayer.hasScaleBasedVisibility: src/core/qgsmaplayer.h#L1612 QgsMapLayer.hasScaleBasedVisibility: src/core/qgsmaplayer.h#L1652
QgsMapLayer.htmlMetadata: src/core/qgsmaplayer.h#L1683 QgsMapLayer.htmlMetadata: src/core/qgsmaplayer.h#L1723
QgsMapLayer.id: src/core/qgsmaplayer.h#L268 QgsMapLayer.id: src/core/qgsmaplayer.h#L268
QgsMapLayer.idChanged: src/core/qgsmaplayer.h#L1951 QgsMapLayer.idChanged: src/core/qgsmaplayer.h#L1991
QgsMapLayer.importNamedMetadata: src/core/qgsmaplayer.h#L1169 QgsMapLayer.importNamedMetadata: src/core/qgsmaplayer.h#L1209
QgsMapLayer.importNamedStyle: src/core/qgsmaplayer.h#L1233 QgsMapLayer.importNamedStyle: src/core/qgsmaplayer.h#L1273
QgsMapLayer.invalidateWgs84Extent: src/core/qgsmaplayer.h#L2289 QgsMapLayer.invalidateWgs84Extent: src/core/qgsmaplayer.h#L2329
QgsMapLayer.isEditable: src/core/qgsmaplayer.h#L624 QgsMapLayer.isEditable: src/core/qgsmaplayer.h#L624
QgsMapLayer.isInScaleRange: src/core/qgsmaplayer.h#L1578 QgsMapLayer.isInScaleRange: src/core/qgsmaplayer.h#L1618
QgsMapLayer.isModified: src/core/qgsmaplayer.h#L631 QgsMapLayer.isModified: src/core/qgsmaplayer.h#L631
QgsMapLayer.isRefreshOnNotifyEnabled: src/core/qgsmaplayer.h#L1706 QgsMapLayer.isRefreshOnNotifyEnabled: src/core/qgsmaplayer.h#L1746
QgsMapLayer.isSpatial: src/core/qgsmaplayer.h#L636 QgsMapLayer.isSpatial: src/core/qgsmaplayer.h#L636
QgsMapLayer.isTemporary: src/core/qgsmaplayer.h#L647 QgsMapLayer.isTemporary: src/core/qgsmaplayer.h#L647
QgsMapLayer.isValid: src/core/qgsmaplayer.h#L575 QgsMapLayer.isValid: src/core/qgsmaplayer.h#L575
QgsMapLayer.isValidChanged: src/core/qgsmaplayer.h#L2118 QgsMapLayer.isValidChanged: src/core/qgsmaplayer.h#L2158
QgsMapLayer.keywordList: src/core/qgsmaplayer.h#L370 QgsMapLayer.keywordList: src/core/qgsmaplayer.h#L370
QgsMapLayer.layerModified: src/core/qgsmaplayer.h#L2143 QgsMapLayer.layerModified: src/core/qgsmaplayer.h#L2183
QgsMapLayer.legend: src/core/qgsmaplayer.h#L1553 QgsMapLayer.legend: src/core/qgsmaplayer.h#L1593
QgsMapLayer.legendChanged: src/core/qgsmaplayer.h#L2044 QgsMapLayer.legendChanged: src/core/qgsmaplayer.h#L2084
QgsMapLayer.legendPlaceholderImage: src/core/qgsmaplayer.h#L1770 QgsMapLayer.legendPlaceholderImage: src/core/qgsmaplayer.h#L1810
QgsMapLayer.legendUrl: src/core/qgsmaplayer.h#L1528 QgsMapLayer.legendUrl: src/core/qgsmaplayer.h#L1568
QgsMapLayer.legendUrlFormat: src/core/qgsmaplayer.h#L1542 QgsMapLayer.legendUrlFormat: src/core/qgsmaplayer.h#L1582
QgsMapLayer.listStylesInDatabase: src/core/qgsmaplayer.h#L744 QgsMapLayer.listStylesInDatabase: src/core/qgsmaplayer.h#L744
QgsMapLayer.loadDefaultMetadata: src/core/qgsmaplayer.h#L1152 QgsMapLayer.loadDefaultMetadata: src/core/qgsmaplayer.h#L1192
QgsMapLayer.loadDefaultStyle: src/core/qgsmaplayer.h#L1193 QgsMapLayer.loadDefaultStyle: src/core/qgsmaplayer.h#L1233
QgsMapLayer.loadNamedMetadata: src/core/qgsmaplayer.h#L1139 QgsMapLayer.loadNamedMetadata: src/core/qgsmaplayer.h#L1179
QgsMapLayer.loadNamedMetadataFromDatabase: src/core/qgsmaplayer.h#L1161 QgsMapLayer.loadNamedMetadataFromDatabase: src/core/qgsmaplayer.h#L1201
QgsMapLayer.loadNamedStyle: src/core/qgsmaplayer.h#L1214 QgsMapLayer.loadNamedStyle: src/core/qgsmaplayer.h#L1254
QgsMapLayer.loadNamedStyle: src/core/qgsmaplayer.h#L795 QgsMapLayer.loadNamedStyle: src/core/qgsmaplayer.h#L835
QgsMapLayer.loadNamedStyleFromDatabase: src/core/qgsmaplayer.h#L1223 QgsMapLayer.loadNamedStyleFromDatabase: src/core/qgsmaplayer.h#L1263
QgsMapLayer.loadSldStyle: src/core/qgsmaplayer.h#L1351 QgsMapLayer.loadSldStyle: src/core/qgsmaplayer.h#L1391
QgsMapLayer.mapTipTemplate: src/core/qgsmaplayer.h#L1794 QgsMapLayer.mapTipTemplate: src/core/qgsmaplayer.h#L1834
QgsMapLayer.mapTipTemplateChanged: src/core/qgsmaplayer.h#L2150 QgsMapLayer.mapTipTemplateChanged: src/core/qgsmaplayer.h#L2190
QgsMapLayer.mapTipsEnabled: src/core/qgsmaplayer.h#L1817 QgsMapLayer.mapTipsEnabled: src/core/qgsmaplayer.h#L1857
QgsMapLayer.mapTipsEnabledChanged: src/core/qgsmaplayer.h#L2158 QgsMapLayer.mapTipsEnabledChanged: src/core/qgsmaplayer.h#L2198
QgsMapLayer.maximumScale: src/core/qgsmaplayer.h#L1602 QgsMapLayer.maximumScale: src/core/qgsmaplayer.h#L1642
QgsMapLayer.metadataChanged: src/core/qgsmaplayer.h#L2087 QgsMapLayer.metadataChanged: src/core/qgsmaplayer.h#L2127
QgsMapLayer.metadataUri: src/core/qgsmaplayer.h#L1089 QgsMapLayer.metadataUri: src/core/qgsmaplayer.h#L1129
QgsMapLayer.metadataUrl: src/core/qgsmaplayer.h#L461 QgsMapLayer.metadataUrl: src/core/qgsmaplayer.h#L461
QgsMapLayer.metadataUrlFormat: src/core/qgsmaplayer.h#L503 QgsMapLayer.metadataUrlFormat: src/core/qgsmaplayer.h#L503
QgsMapLayer.metadataUrlType: src/core/qgsmaplayer.h#L482 QgsMapLayer.metadataUrlType: src/core/qgsmaplayer.h#L482
QgsMapLayer.minimumScale: src/core/qgsmaplayer.h#L1590 QgsMapLayer.minimumScale: src/core/qgsmaplayer.h#L1630
QgsMapLayer.name: src/core/qgsmaplayer.h#L297 QgsMapLayer.name: src/core/qgsmaplayer.h#L297
QgsMapLayer.nameChanged: src/core/qgsmaplayer.h#L1956 QgsMapLayer.nameChanged: src/core/qgsmaplayer.h#L1996
QgsMapLayer.opacity: src/core/qgsmaplayer.h#L536 QgsMapLayer.opacity: src/core/qgsmaplayer.h#L536
QgsMapLayer.opacityChanged: src/core/qgsmaplayer.h#L2021 QgsMapLayer.opacityChanged: src/core/qgsmaplayer.h#L2061
QgsMapLayer.originalXmlProperties: src/core/qgsmaplayer.h#L1716 QgsMapLayer.originalXmlProperties: src/core/qgsmaplayer.h#L1756
QgsMapLayer.project: src/core/qgsmaplayer.h#L1928 QgsMapLayer.project: src/core/qgsmaplayer.h#L1968
QgsMapLayer.properties: src/core/qgsmaplayer.h#L254 QgsMapLayer.properties: src/core/qgsmaplayer.h#L254
QgsMapLayer.providerMetadata: src/core/qgsmaplayer.h#L314 QgsMapLayer.providerMetadata: src/core/qgsmaplayer.h#L314
QgsMapLayer.providerReadFlags: src/core/qgsmaplayer.h#L1826 QgsMapLayer.providerReadFlags: src/core/qgsmaplayer.h#L1866
QgsMapLayer.providerType: src/core/qgsmaplayer.h#L1506 QgsMapLayer.providerType: src/core/qgsmaplayer.h#L1546
QgsMapLayer.publicSource: src/core/qgsmaplayer.h#L587 QgsMapLayer.publicSource: src/core/qgsmaplayer.h#L587
QgsMapLayer.readCommonStyle: src/core/qgsmaplayer.h#L2265 QgsMapLayer.readCommonStyle: src/core/qgsmaplayer.h#L2305
QgsMapLayer.readCustomProperties: src/core/qgsmaplayer.h#L2245 QgsMapLayer.readCustomProperties: src/core/qgsmaplayer.h#L2285
QgsMapLayer.readLayerXml: src/core/qgsmaplayer.h#L679 QgsMapLayer.readLayerXml: src/core/qgsmaplayer.h#L679
QgsMapLayer.readOnly: src/core/qgsmaplayer.h#L539 QgsMapLayer.readOnly: src/core/qgsmaplayer.h#L539
QgsMapLayer.readSld: src/core/qgsmaplayer.h#L1354 QgsMapLayer.readSld: src/core/qgsmaplayer.h#L1394
QgsMapLayer.readStyle: src/core/qgsmaplayer.h#L1378 QgsMapLayer.readStyle: src/core/qgsmaplayer.h#L1418
QgsMapLayer.readStyleManager: src/core/qgsmaplayer.h#L2251 QgsMapLayer.readStyleManager: src/core/qgsmaplayer.h#L2291
QgsMapLayer.readSymbology: src/core/qgsmaplayer.h#L1366 QgsMapLayer.readSymbology: src/core/qgsmaplayer.h#L1406
QgsMapLayer.readXml: src/core/qgsmaplayer.h#L2205 QgsMapLayer.readXml: src/core/qgsmaplayer.h#L2245
QgsMapLayer.recalculateExtents: src/core/qgsmaplayer.h#L2005 QgsMapLayer.recalculateExtents: src/core/qgsmaplayer.h#L2045
QgsMapLayer.refreshOnNotifyMessage: src/core/qgsmaplayer.h#L1700 QgsMapLayer.refreshOnNotifyMessage: src/core/qgsmaplayer.h#L1740
QgsMapLayer.reload: src/core/qgsmaplayer.h#L544 QgsMapLayer.reload: src/core/qgsmaplayer.h#L544
QgsMapLayer.removeCustomProperty: src/core/qgsmaplayer.h#L974 QgsMapLayer.removeCustomProperty: src/core/qgsmaplayer.h#L1014
QgsMapLayer.renderer3D: src/core/qgsmaplayer.h#L1568 QgsMapLayer.renderer3D: src/core/qgsmaplayer.h#L1608
QgsMapLayer.renderer3DChanged: src/core/qgsmaplayer.h#L2049 QgsMapLayer.renderer3DChanged: src/core/qgsmaplayer.h#L2089
QgsMapLayer.rendererChanged: src/core/qgsmaplayer.h#L2027 QgsMapLayer.rendererChanged: src/core/qgsmaplayer.h#L2067
QgsMapLayer.repaintRequested: src/core/qgsmaplayer.h#L2002 QgsMapLayer.repaintRequested: src/core/qgsmaplayer.h#L2042
QgsMapLayer.request3DUpdate: src/core/qgsmaplayer.h#L2056 QgsMapLayer.request3DUpdate: src/core/qgsmaplayer.h#L2096
QgsMapLayer.resolveReferences: src/core/qgsmaplayer.h#L702 QgsMapLayer.resolveReferences: src/core/qgsmaplayer.h#L702
QgsMapLayer.saveDefaultMetadata: src/core/qgsmaplayer.h#L1106 QgsMapLayer.saveDefaultMetadata: src/core/qgsmaplayer.h#L1146
QgsMapLayer.saveDefaultStyle: src/core/qgsmaplayer.h#L1288 QgsMapLayer.saveDefaultStyle: src/core/qgsmaplayer.h#L1328
QgsMapLayer.saveDefaultStyle: src/core/qgsmaplayer.h#L1301 QgsMapLayer.saveDefaultStyle: src/core/qgsmaplayer.h#L1341
QgsMapLayer.saveNamedMetadata: src/core/qgsmaplayer.h#L1121 QgsMapLayer.saveNamedMetadata: src/core/qgsmaplayer.h#L1161
QgsMapLayer.saveNamedStyle: src/core/qgsmaplayer.h#L1318 QgsMapLayer.saveNamedStyle: src/core/qgsmaplayer.h#L1358
QgsMapLayer.saveSldStyle: src/core/qgsmaplayer.h#L1329 QgsMapLayer.saveSldStyle: src/core/qgsmaplayer.h#L1369
QgsMapLayer.saveSldStyleV2: src/core/qgsmaplayer.h#L1341 QgsMapLayer.saveSldStyleV2: src/core/qgsmaplayer.h#L1381
QgsMapLayer.saveStyleToDatabase: src/core/qgsmaplayer.h#L776 QgsMapLayer.saveStyleToDatabase: src/core/qgsmaplayer.h#L799
QgsMapLayer.selectionProperties: src/core/qgsmaplayer.h#L1749 QgsMapLayer.saveStyleToDatabaseV2: src/core/qgsmaplayer.h#L817
QgsMapLayer.selectionProperties: src/core/qgsmaplayer.h#L1789
QgsMapLayer.serverProperties: src/core/qgsmaplayer.h#L435 QgsMapLayer.serverProperties: src/core/qgsmaplayer.h#L435
QgsMapLayer.setAbstract: src/core/qgsmaplayer.h#L349 QgsMapLayer.setAbstract: src/core/qgsmaplayer.h#L349
QgsMapLayer.setAttribution: src/core/qgsmaplayer.h#L405 QgsMapLayer.setAttribution: src/core/qgsmaplayer.h#L405
QgsMapLayer.setAttributionUrl: src/core/qgsmaplayer.h#L419 QgsMapLayer.setAttributionUrl: src/core/qgsmaplayer.h#L419
QgsMapLayer.setAutoRefreshEnabled: src/core/qgsmaplayer.h#L1656 QgsMapLayer.setAutoRefreshEnabled: src/core/qgsmaplayer.h#L1696
QgsMapLayer.setAutoRefreshInterval: src/core/qgsmaplayer.h#L1648 QgsMapLayer.setAutoRefreshInterval: src/core/qgsmaplayer.h#L1688
QgsMapLayer.setAutoRefreshMode: src/core/qgsmaplayer.h#L1664 QgsMapLayer.setAutoRefreshMode: src/core/qgsmaplayer.h#L1704
QgsMapLayer.setBlendMode: src/core/qgsmaplayer.h#L510 QgsMapLayer.setBlendMode: src/core/qgsmaplayer.h#L510
QgsMapLayer.setCrs: src/core/qgsmaplayer.h#L1046 QgsMapLayer.setCrs: src/core/qgsmaplayer.h#L1086
QgsMapLayer.setCustomProperties: src/core/qgsmaplayer.h#L726 QgsMapLayer.setCustomProperties: src/core/qgsmaplayer.h#L726
QgsMapLayer.setCustomProperty: src/core/qgsmaplayer.h#L715 QgsMapLayer.setCustomProperty: src/core/qgsmaplayer.h#L715
QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1439 QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1479
QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1470 QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1510
QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1501 QgsMapLayer.setDataSource: src/core/qgsmaplayer.h#L1541
QgsMapLayer.setDataUrl: src/core/qgsmaplayer.h#L377 QgsMapLayer.setDataUrl: src/core/qgsmaplayer.h#L377
QgsMapLayer.setDataUrlFormat: src/core/qgsmaplayer.h#L391 QgsMapLayer.setDataUrlFormat: src/core/qgsmaplayer.h#L391
QgsMapLayer.setDependencies: src/core/qgsmaplayer.h#L1891 QgsMapLayer.setDependencies: src/core/qgsmaplayer.h#L1931
QgsMapLayer.setError: src/core/qgsmaplayer.h#L2281 QgsMapLayer.setError: src/core/qgsmaplayer.h#L2321
QgsMapLayer.setExtent3D: src/core/qgsmaplayer.h#L2196 QgsMapLayer.setExtent3D: src/core/qgsmaplayer.h#L2236
QgsMapLayer.setExtent: src/core/qgsmaplayer.h#L2190 QgsMapLayer.setExtent: src/core/qgsmaplayer.h#L2230
QgsMapLayer.setFlags: src/core/qgsmaplayer.h#L243 QgsMapLayer.setFlags: src/core/qgsmaplayer.h#L243
QgsMapLayer.setId: src/core/qgsmaplayer.h#L285 QgsMapLayer.setId: src/core/qgsmaplayer.h#L285
QgsMapLayer.setKeywordList: src/core/qgsmaplayer.h#L363 QgsMapLayer.setKeywordList: src/core/qgsmaplayer.h#L363
QgsMapLayer.setLayerOrder: src/core/qgsmaplayer.h#L606 QgsMapLayer.setLayerOrder: src/core/qgsmaplayer.h#L606
QgsMapLayer.setLegend: src/core/qgsmaplayer.h#L1548 QgsMapLayer.setLegend: src/core/qgsmaplayer.h#L1588
QgsMapLayer.setLegendPlaceholderImage: src/core/qgsmaplayer.h#L1777 QgsMapLayer.setLegendPlaceholderImage: src/core/qgsmaplayer.h#L1817
QgsMapLayer.setLegendUrl: src/core/qgsmaplayer.h#L1521 QgsMapLayer.setLegendUrl: src/core/qgsmaplayer.h#L1561
QgsMapLayer.setLegendUrlFormat: src/core/qgsmaplayer.h#L1535 QgsMapLayer.setLegendUrlFormat: src/core/qgsmaplayer.h#L1575
QgsMapLayer.setMapTipTemplate: src/core/qgsmaplayer.h#L1803 QgsMapLayer.setMapTipTemplate: src/core/qgsmaplayer.h#L1843
QgsMapLayer.setMapTipsEnabled: src/core/qgsmaplayer.h#L1811 QgsMapLayer.setMapTipsEnabled: src/core/qgsmaplayer.h#L1851
QgsMapLayer.setMaximumScale: src/core/qgsmaplayer.h#L1850 QgsMapLayer.setMaximumScale: src/core/qgsmaplayer.h#L1890
QgsMapLayer.setMetadata: src/core/qgsmaplayer.h#L1678 QgsMapLayer.setMetadata: src/core/qgsmaplayer.h#L1718
QgsMapLayer.setMetadataUrl: src/core/qgsmaplayer.h#L450 QgsMapLayer.setMetadataUrl: src/core/qgsmaplayer.h#L450
QgsMapLayer.setMetadataUrlFormat: src/core/qgsmaplayer.h#L492 QgsMapLayer.setMetadataUrlFormat: src/core/qgsmaplayer.h#L492
QgsMapLayer.setMetadataUrlType: src/core/qgsmaplayer.h#L471 QgsMapLayer.setMetadataUrlType: src/core/qgsmaplayer.h#L471
QgsMapLayer.setMinimumScale: src/core/qgsmaplayer.h#L1839 QgsMapLayer.setMinimumScale: src/core/qgsmaplayer.h#L1879
QgsMapLayer.setName: src/core/qgsmaplayer.h#L291 QgsMapLayer.setName: src/core/qgsmaplayer.h#L291
QgsMapLayer.setOpacity: src/core/qgsmaplayer.h#L526 QgsMapLayer.setOpacity: src/core/qgsmaplayer.h#L526
QgsMapLayer.setOriginalXmlProperties: src/core/qgsmaplayer.h#L1725 QgsMapLayer.setOriginalXmlProperties: src/core/qgsmaplayer.h#L1765
QgsMapLayer.setProviderType: src/core/qgsmaplayer.h#L2269 QgsMapLayer.setProviderType: src/core/qgsmaplayer.h#L2309
QgsMapLayer.setRefreshOnNofifyMessage: src/core/qgsmaplayer.h#L1905 QgsMapLayer.setRefreshOnNofifyMessage: src/core/qgsmaplayer.h#L1945
QgsMapLayer.setRefreshOnNotifyEnabled: src/core/qgsmaplayer.h#L1897 QgsMapLayer.setRefreshOnNotifyEnabled: src/core/qgsmaplayer.h#L1937
QgsMapLayer.setRenderer3D: src/core/qgsmaplayer.h#L1563 QgsMapLayer.setRenderer3D: src/core/qgsmaplayer.h#L1603
QgsMapLayer.setScaleBasedVisibility: src/core/qgsmaplayer.h#L1859 QgsMapLayer.setScaleBasedVisibility: src/core/qgsmaplayer.h#L1899
QgsMapLayer.setShortName: src/core/qgsmaplayer.h#L321 QgsMapLayer.setShortName: src/core/qgsmaplayer.h#L321
QgsMapLayer.setSubLayerVisibility: src/core/qgsmaplayer.h#L613 QgsMapLayer.setSubLayerVisibility: src/core/qgsmaplayer.h#L613
QgsMapLayer.setTitle: src/core/qgsmaplayer.h#L335 QgsMapLayer.setTitle: src/core/qgsmaplayer.h#L335
QgsMapLayer.setTransformContext: src/core/qgsmaplayer.h#L1912 QgsMapLayer.setTransformContext: src/core/qgsmaplayer.h#L1952
QgsMapLayer.setValid: src/core/qgsmaplayer.h#L2199 QgsMapLayer.setValid: src/core/qgsmaplayer.h#L2239
QgsMapLayer.setVerticalCrs: src/core/qgsmaplayer.h#L1067 QgsMapLayer.setVerticalCrs: src/core/qgsmaplayer.h#L1107
QgsMapLayer.shortName: src/core/qgsmaplayer.h#L328 QgsMapLayer.shortName: src/core/qgsmaplayer.h#L328
QgsMapLayer.source: src/core/qgsmaplayer.h#L594 QgsMapLayer.source: src/core/qgsmaplayer.h#L594
QgsMapLayer.statusChanged: src/core/qgsmaplayer.h#L1941 QgsMapLayer.statusChanged: src/core/qgsmaplayer.h#L1981
QgsMapLayer.styleChanged: src/core/qgsmaplayer.h#L2039 QgsMapLayer.styleChanged: src/core/qgsmaplayer.h#L2079
QgsMapLayer.styleLoaded: src/core/qgsmaplayer.h#L2111 QgsMapLayer.styleLoaded: src/core/qgsmaplayer.h#L2151
QgsMapLayer.styleManager: src/core/qgsmaplayer.h#L1558 QgsMapLayer.styleManager: src/core/qgsmaplayer.h#L1598
QgsMapLayer.styleURI: src/core/qgsmaplayer.h#L1179 QgsMapLayer.styleURI: src/core/qgsmaplayer.h#L1219
QgsMapLayer.subLayers: src/core/qgsmaplayer.h#L600 QgsMapLayer.subLayers: src/core/qgsmaplayer.h#L600
QgsMapLayer.supportsEditing: src/core/qgsmaplayer.h#L621 QgsMapLayer.supportsEditing: src/core/qgsmaplayer.h#L621
QgsMapLayer.temporalProperties: src/core/qgsmaplayer.h#L1756 QgsMapLayer.temporalProperties: src/core/qgsmaplayer.h#L1796
QgsMapLayer.timestamp: src/core/qgsmaplayer.h#L1686 QgsMapLayer.timestamp: src/core/qgsmaplayer.h#L1726
QgsMapLayer.title: src/core/qgsmaplayer.h#L342 QgsMapLayer.title: src/core/qgsmaplayer.h#L342
QgsMapLayer.transformContext: src/core/qgsmaplayer.h#L1074 QgsMapLayer.transformContext: src/core/qgsmaplayer.h#L1114
QgsMapLayer.trigger3DUpdate: src/core/qgsmaplayer.h#L1877 QgsMapLayer.trigger3DUpdate: src/core/qgsmaplayer.h#L1917
QgsMapLayer.triggerRepaint: src/core/qgsmaplayer.h#L1869 QgsMapLayer.triggerRepaint: src/core/qgsmaplayer.h#L1909
QgsMapLayer.type: src/core/qgsmaplayer.h#L219 QgsMapLayer.type: src/core/qgsmaplayer.h#L219
QgsMapLayer.undoStack: src/core/qgsmaplayer.h#L1509 QgsMapLayer.undoStack: src/core/qgsmaplayer.h#L1549
QgsMapLayer.undoStackStyles: src/core/qgsmaplayer.h#L1514 QgsMapLayer.undoStackStyles: src/core/qgsmaplayer.h#L1554
QgsMapLayer.verticalCrs: src/core/qgsmaplayer.h#L1014 QgsMapLayer.verticalCrs: src/core/qgsmaplayer.h#L1054
QgsMapLayer.verticalCrsChanged: src/core/qgsmaplayer.h#L1994 QgsMapLayer.verticalCrsChanged: src/core/qgsmaplayer.h#L2034
QgsMapLayer.wgs84Extent: src/core/qgsmaplayer.h#L568 QgsMapLayer.wgs84Extent: src/core/qgsmaplayer.h#L568
QgsMapLayer.willBeDeleted: src/core/qgsmaplayer.h#L2074 QgsMapLayer.willBeDeleted: src/core/qgsmaplayer.h#L2114
QgsMapLayer.writeCommonStyle: src/core/qgsmaplayer.h#L2258 QgsMapLayer.writeCommonStyle: src/core/qgsmaplayer.h#L2298
QgsMapLayer.writeCustomProperties: src/core/qgsmaplayer.h#L2248 QgsMapLayer.writeCustomProperties: src/core/qgsmaplayer.h#L2288
QgsMapLayer.writeLayerXml: src/core/qgsmaplayer.h#L697 QgsMapLayer.writeLayerXml: src/core/qgsmaplayer.h#L697
QgsMapLayer.writeStyle: src/core/qgsmaplayer.h#L1405 QgsMapLayer.writeStyle: src/core/qgsmaplayer.h#L1445
QgsMapLayer.writeStyleManager: src/core/qgsmaplayer.h#L2253 QgsMapLayer.writeStyleManager: src/core/qgsmaplayer.h#L2293
QgsMapLayer.writeSymbology: src/core/qgsmaplayer.h#L1391 QgsMapLayer.writeSymbology: src/core/qgsmaplayer.h#L1431
QgsMapLayer.writeXml: src/core/qgsmaplayer.h#L2211 QgsMapLayer.writeXml: src/core/qgsmaplayer.h#L2251
QgsMapLayer: src/core/qgsmaplayer.h#L76 QgsMapLayer: src/core/qgsmaplayer.h#L76
QgsMapLayerDependency.__hash__: src/core/qgsmaplayerdependency.h#L78 QgsMapLayerDependency.__hash__: src/core/qgsmaplayerdependency.h#L78
QgsMapLayerDependency.layerId: src/core/qgsmaplayerdependency.h#L67 QgsMapLayerDependency.layerId: src/core/qgsmaplayerdependency.h#L67

View File

@ -57,9 +57,13 @@ class BatchAlgorithmDialog(QgsProcessingBatchAlgorithmDialogBase):
def runAsSingle(self): def runAsSingle(self):
self.close() self.close()
alg_instance = self.algorithm().create()
dlg = alg_instance.createCustomParametersWidget(parent=iface.mainWindow())
if not dlg:
from processing.gui.AlgorithmDialog import AlgorithmDialog from processing.gui.AlgorithmDialog import AlgorithmDialog
dlg = AlgorithmDialog(self.algorithm().create(), parent=iface.mainWindow()) dlg = AlgorithmDialog(alg_instance, parent=iface.mainWindow())
dlg.show() dlg.show()
dlg.exec() dlg.exec()

View File

@ -554,7 +554,7 @@ QVariantMap QgsExtractLabelsAlgorithm::processAlgorithm( const QVariantMap &para
vl->setLabelsEnabled( true ); vl->setLabelsEnabled( true );
QString errorMessage; QString errorMessage;
vl->saveStyleToDatabase( QString(), QString(), true, QString(), errorMessage ); vl->saveStyleToDatabaseV2( QString(), QString(), true, QString(), errorMessage );
} }
} }

View File

@ -485,9 +485,10 @@ bool QgsPackageAlgorithm::packageVectorLayer( QgsVectorLayer *layer, const QStri
// this is not nice -- but needed to avoid an "overwrite" prompt messagebox from the provider! This api needs a rework to avoid this. // this is not nice -- but needed to avoid an "overwrite" prompt messagebox from the provider! This api needs a rework to avoid this.
const QVariant prevOverwriteStyle = settings.value( QStringLiteral( "qgis/overwriteStyle" ) ); const QVariant prevOverwriteStyle = settings.value( QStringLiteral( "qgis/overwriteStyle" ) );
settings.setValue( QStringLiteral( "qgis/overwriteStyle" ), true ); settings.setValue( QStringLiteral( "qgis/overwriteStyle" ), true );
res->saveStyleToDatabase( newLayer, QString(), true, QString(), errorMsg ); QgsMapLayer::SaveStyleResults saveStyleResults = res->saveStyleToDatabaseV2( newLayer, QString(), true, QString(), errorMsg );
settings.setValue( QStringLiteral( "qgis/overwriteStyle" ), prevOverwriteStyle ); settings.setValue( QStringLiteral( "qgis/overwriteStyle" ), prevOverwriteStyle );
if ( !errorMsg.isEmpty() ) if ( saveStyleResults.testFlag( QgsMapLayer::SaveStyleResult::QmlGenerationFailed )
|| saveStyleResults.testFlag( QgsMapLayer::SaveStyleResult::DatabaseWriteFailed ) )
{ {
feedback->reportError( QObject::tr( "Could not save layer style: %1 " ).arg( errorMsg ) ); feedback->reportError( QObject::tr( "Could not save layer style: %1 " ).arg( errorMsg ) );
} }

View File

@ -74,7 +74,7 @@ bool QgsMapToolShapeCircle2Points::cadCanvasReleaseEvent( QgsMapMouseEvent *e, Q
void QgsMapToolShapeCircle2Points::cadCanvasMoveEvent( QgsMapMouseEvent *e, QgsMapToolCapture::CaptureMode mode ) void QgsMapToolShapeCircle2Points::cadCanvasMoveEvent( QgsMapMouseEvent *e, QgsMapToolCapture::CaptureMode mode )
{ {
Q_UNUSED( mode ) Q_UNUSED( mode )
if ( !mTempRubberBand ) if ( !mTempRubberBand || mPoints.isEmpty() )
return; return;
mCircle = QgsCircle::from2Points( mPoints.at( 0 ), mParentTool->mapPoint( *e ) ); mCircle = QgsCircle::from2Points( mPoints.at( 0 ), mParentTool->mapPoint( *e ) );

View File

@ -81,7 +81,7 @@ void QgsMapToolShapeCircleCenterPoint::cadCanvasMoveEvent( QgsMapMouseEvent *e,
const QgsPoint point = mParentTool->mapPoint( *e ); const QgsPoint point = mParentTool->mapPoint( *e );
if ( mTempRubberBand ) if ( mTempRubberBand && !mPoints.isEmpty() )
{ {
mCircle = QgsCircle::fromCenterPoint( mPoints.at( 0 ), point ); mCircle = QgsCircle::fromCenterPoint( mPoints.at( 0 ), point );
mTempRubberBand->setGeometry( mCircle.toCircularString( true ) ); mTempRubberBand->setGeometry( mCircle.toCircularString( true ) );

View File

@ -92,7 +92,7 @@ void QgsMapToolShapeRegularPolygon2Points::cadCanvasMoveEvent( QgsMapMouseEvent
const QgsPoint point = mParentTool->mapPoint( *e ); const QgsPoint point = mParentTool->mapPoint( *e );
if ( mTempRubberBand ) if ( mTempRubberBand && !mPoints.isEmpty() )
{ {
mRegularPolygon = QgsRegularPolygon( mPoints.at( 0 ), point, mNumberSidesSpinBox->value() ); mRegularPolygon = QgsRegularPolygon( mPoints.at( 0 ), point, mNumberSidesSpinBox->value() );
mTempRubberBand->setGeometry( mRegularPolygon.toPolygon() ); mTempRubberBand->setGeometry( mRegularPolygon.toPolygon() );

View File

@ -89,7 +89,7 @@ void QgsMapToolShapeRegularPolygonCenterCorner::cadCanvasMoveEvent( QgsMapMouseE
const QgsPoint point = mParentTool->mapPoint( *e ); const QgsPoint point = mParentTool->mapPoint( *e );
if ( mTempRubberBand ) if ( mTempRubberBand && !mPoints.isEmpty() )
{ {
const QgsRegularPolygon::ConstructionOption option = QgsRegularPolygon::InscribedCircle; const QgsRegularPolygon::ConstructionOption option = QgsRegularPolygon::InscribedCircle;
mRegularPolygon = QgsRegularPolygon( mPoints.at( 0 ), point, mNumberSidesSpinBox->value(), option ); mRegularPolygon = QgsRegularPolygon( mPoints.at( 0 ), point, mNumberSidesSpinBox->value(), option );

View File

@ -91,7 +91,7 @@ void QgsMapToolShapeRegularPolygonCenterPoint::cadCanvasMoveEvent( QgsMapMouseEv
const QgsPoint point = mParentTool->mapPoint( *e ); const QgsPoint point = mParentTool->mapPoint( *e );
if ( mTempRubberBand ) if ( mTempRubberBand && !mPoints.isEmpty() )
{ {
const QgsRegularPolygon::ConstructionOption option = QgsRegularPolygon::CircumscribedCircle; const QgsRegularPolygon::ConstructionOption option = QgsRegularPolygon::CircumscribedCircle;
mRegularPolygon = QgsRegularPolygon( mPoints.at( 0 ), point, mNumberSidesSpinBox->value(), option ); mRegularPolygon = QgsRegularPolygon( mPoints.at( 0 ), point, mNumberSidesSpinBox->value(), option );

View File

@ -8202,10 +8202,33 @@ void QgisApp::makeMemoryLayerPermanent( QgsVectorLayer *layer )
void QgisApp::saveAsLayerDefinition() void QgisApp::saveAsLayerDefinition()
{ {
QString defaultFileName;
QgsLayerTreeNode *node = mLayerTreeView->currentNode();
if ( !node )
return;
if ( node->nodeType() == QgsLayerTreeNode::NodeLayer )
{
QgsLayerTreeLayer *layerNode = dynamic_cast<QgsLayerTreeLayer *>( node );
if ( layerNode && layerNode->layer() )
{
defaultFileName = QStringLiteral( "/%1.qlr" ).arg( layerNode->layer()->name() );
}
}
else if ( node->nodeType() == QgsLayerTreeNode::NodeGroup )
{
QgsLayerTreeGroup *groupNode = dynamic_cast<QgsLayerTreeGroup *>( node );
if ( groupNode )
{
defaultFileName = QStringLiteral( "/%1.qlr" ).arg( groupNode->name() );
}
}
QgsSettings settings; QgsSettings settings;
QString lastUsedDir = settings.value( QStringLiteral( "UI/lastQLRDir" ), QDir::homePath() ).toString(); QString lastUsedDir = settings.value( QStringLiteral( "UI/lastQLRDir" ), QDir::homePath() ).toString();
QString path = QFileDialog::getSaveFileName( this, QStringLiteral( "Save as Layer Definition File" ), lastUsedDir, QStringLiteral( "*.qlr" ) ); QString path = QFileDialog::getSaveFileName( this, QStringLiteral( "Save as Layer Definition File" ), QStringLiteral( "%1%2" ).arg( lastUsedDir, defaultFileName ), QStringLiteral( "*.qlr" ) );
QgsDebugMsgLevel( path, 2 ); QgsDebugMsgLevel( path, 2 );
if ( path.isEmpty() ) if ( path.isEmpty() )
return; return;

View File

@ -67,14 +67,10 @@ void QgsMapToolReshape::cadCanvasReleaseEvent( QgsMapMouseEvent *e )
{ {
deleteTempRubberBand(); deleteTempRubberBand();
//find out bounding box of mCaptureList if ( size() > 1 )
if ( size() < 1 )
{ {
stopCapturing();
return;
}
reshape( vlayer ); reshape( vlayer );
}
stopCapturing(); stopCapturing();
} }
@ -164,12 +160,11 @@ void QgsMapToolReshape::reshape( QgsVectorLayer *vlayer )
QgsAvoidIntersectionsOperation avoidIntersections; QgsAvoidIntersectionsOperation avoidIntersections;
connect( &avoidIntersections, &QgsAvoidIntersectionsOperation::messageEmitted, this, &QgsMapTool::messageEmitted ); connect( &avoidIntersections, &QgsAvoidIntersectionsOperation::messageEmitted, this, &QgsMapTool::messageEmitted );
vlayer->beginEditCommand( tr( "Reshape" ) ); QHash<QgsFeatureId, QgsGeometry> reshapedGeometries;
// we first gather the features that are actually going to be reshaped and the reshaped results
while ( fit.nextFeature( f ) ) while ( fit.nextFeature( f ) )
{ {
//query geometry
//call geometry->reshape(mCaptureList)
//register changed geometry in vector layer
QgsGeometry geom = f.geometry(); QgsGeometry geom = f.geometry();
if ( !geom.isNull() ) if ( !geom.isNull() )
{ {
@ -181,14 +176,25 @@ void QgsMapToolReshape::reshape( QgsVectorLayer *vlayer )
reshapeReturn = geom.reshapeGeometry( reshapeLineString ); reshapeReturn = geom.reshapeGeometry( reshapeLineString );
if ( reshapeReturn == Qgis::GeometryOperationResult::Success ) if ( reshapeReturn == Qgis::GeometryOperationResult::Success )
{ {
reshapedGeometries.insert( f.id(), geom );
}
}
}
// ignore features that are going to be reshaped
// some intersected features may not be reshaped because of active selection or reshape line geometry
const QHash<QgsVectorLayer *, QSet<QgsFeatureId>> ignoreFeatures { { vlayer, qgis::listToSet( reshapedGeometries.keys() ) } };
// then we can apply intersection avoidance logic and eventually update the layer
vlayer->beginEditCommand( tr( "Reshape" ) );
for ( auto it = reshapedGeometries.begin(); it != reshapedGeometries.end(); ++it )
{
QgsFeatureId fid = it.key();
QgsGeometry geom = it.value();
//avoid intersections on polygon layers //avoid intersections on polygon layers
if ( vlayer->geometryType() == Qgis::GeometryType::Polygon ) if ( vlayer->geometryType() == Qgis::GeometryType::Polygon )
{ {
//ignore all current layer features as they should be reshaped too const QgsAvoidIntersectionsOperation::Result res = avoidIntersections.apply( vlayer, fid, geom, ignoreFeatures );
QHash<QgsVectorLayer *, QSet<QgsFeatureId>> ignoreFeatures;
ignoreFeatures.insert( vlayer, vlayer->allFeatureIds() );
const QgsAvoidIntersectionsOperation::Result res = avoidIntersections.apply( vlayer, f.id(), geom, ignoreFeatures );
if ( res.operationResult == Qgis::GeometryOperationResult::InvalidInputGeometryType ) if ( res.operationResult == Qgis::GeometryOperationResult::InvalidInputGeometryType )
{ {
emit messageEmitted( tr( "An error was reported during intersection removal" ), Qgis::MessageLevel::Warning ); emit messageEmitted( tr( "An error was reported during intersection removal" ), Qgis::MessageLevel::Warning );
@ -205,11 +211,9 @@ void QgsMapToolReshape::reshape( QgsVectorLayer *vlayer )
} }
} }
vlayer->changeGeometry( f.id(), geom ); vlayer->changeGeometry( fid, geom );
reshapeDone = true; reshapeDone = true;
} }
}
}
if ( reshapeDone ) if ( reshapeDone )
{ {

View File

@ -1241,7 +1241,17 @@ Qgis::GeometryOperationResult QgsGeometry::reshapeGeometry( const QgsLineString
return Qgis::GeometryOperationResult::InvalidBaseGeometry; return Qgis::GeometryOperationResult::InvalidBaseGeometry;
} }
QgsGeos geos( d->geometry.get() ); // We're trying adding the reshape line's vertices to the geometry so that
// snap to segment always produces a valid reshape
QgsPointSequence reshapePoints;
reshapeLineString.points( reshapePoints );
QgsGeometry tmpGeom( *this );
for ( const QgsPoint &v : std::as_const( reshapePoints ) )
{
tmpGeom.addTopologicalPoint( v );
}
QgsGeos geos( tmpGeom.get() );
QgsGeometryEngine::EngineOperationResult errorCode = QgsGeometryEngine::Success; QgsGeometryEngine::EngineOperationResult errorCode = QgsGeometryEngine::Success;
mLastError.clear(); mLastError.clear();
std::unique_ptr< QgsAbstractGeometry > geom( geos.reshapeGeometry( reshapeLineString, &errorCode, &mLastError ) ); std::unique_ptr< QgsAbstractGeometry > geom( geos.reshapeGeometry( reshapeLineString, &errorCode, &mLastError ) );

View File

@ -67,7 +67,24 @@ typedef QVector<QgsPointXY> QgsPolylineXY;
* This type has full support for Z/M dimensions. * This type has full support for Z/M dimensions.
* *
*/ */
#ifndef SIP_RUN
typedef QgsPointSequence QgsPolyline; typedef QgsPointSequence QgsPolyline;
#else
typedef QVector<QgsPoint> QgsPolyline;
#endif
/**
* Multi polyline represented as a vector of polylines.
*
* This type has full support for Z/M dimensions.
*
* \since QGIS 3.44
*/
#ifndef SIP_RUN
typedef QVector<QgsPolyline> QgsMultiPolyline;
#else
typedef QVector<QVector< QgsPoint >> QgsMultiPolyline;
#endif
//! Polygon: first item of the list is outer ring, inner rings (if any) start from second item //! Polygon: first item of the list is outer ring, inner rings (if any) start from second item
#ifndef SIP_RUN #ifndef SIP_RUN

View File

@ -33,13 +33,13 @@ email : marco.hugentobler at sourcepole dot com
#define DEFAULT_QUADRANT_SEGMENTS 8 #define DEFAULT_QUADRANT_SEGMENTS 8
#define CATCH_GEOS(r) \ #define CATCH_GEOS(r) \
catch (GEOSException &) \ catch (QgsGeosException &) \
{ \ { \
return r; \ return r; \
} }
#define CATCH_GEOS_WITH_ERRMSG(r) \ #define CATCH_GEOS_WITH_ERRMSG(r) \
catch (GEOSException &e) \ catch (QgsGeosException &e) \
{ \ { \
if ( errorMsg ) \ if ( errorMsg ) \
{ \ { \
@ -50,7 +50,7 @@ email : marco.hugentobler at sourcepole dot com
/// @cond PRIVATE /// @cond PRIVATE
static void throwGEOSException( const char *fmt, ... ) static void throwQgsGeosException( const char *fmt, ... )
{ {
va_list ap; va_list ap;
char buffer[1024]; char buffer[1024];
@ -62,14 +62,14 @@ static void throwGEOSException( const char *fmt, ... )
QString message = QString::fromUtf8( buffer ); QString message = QString::fromUtf8( buffer );
#ifdef _MSC_VER #ifdef _MSC_VER
// stupid stupid MSVC, *SOMETIMES* raises it's own exception if we throw GEOSException, resulting in a crash! // stupid stupid MSVC, *SOMETIMES* raises it's own exception if we throw QgsGeosException, resulting in a crash!
// see https://github.com/qgis/QGIS/issues/22709 // see https://github.com/qgis/QGIS/issues/22709
// if you want to test alternative fixes for this, run the testqgsexpression.cpp test suite - that will crash // if you want to test alternative fixes for this, run the testqgsexpression.cpp test suite - that will crash
// and burn on the "line_interpolate_point point" test if a GEOSException is thrown. // and burn on the "line_interpolate_point point" test if a QgsGeosException is thrown.
// TODO - find a real fix for the underlying issue // TODO - find a real fix for the underlying issue
try try
{ {
throw GEOSException( message ); throw QgsGeosException( message );
} }
catch ( ... ) catch ( ... )
{ {
@ -77,7 +77,7 @@ static void throwGEOSException( const char *fmt, ... )
// just throw nothing instead (except your mouse at your monitor) // just throw nothing instead (except your mouse at your monitor)
} }
#else #else
throw GEOSException( message ); throw QgsGeosException( message );
#endif #endif
} }
@ -112,9 +112,9 @@ QgsGeosContext::QgsGeosContext()
#if GEOS_VERSION_MAJOR>3 || ( GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR>=5 ) #if GEOS_VERSION_MAJOR>3 || ( GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR>=5 )
mContext = GEOS_init_r(); mContext = GEOS_init_r();
GEOSContext_setNoticeHandler_r( mContext, printGEOSNotice ); GEOSContext_setNoticeHandler_r( mContext, printGEOSNotice );
GEOSContext_setErrorHandler_r( mContext, throwGEOSException ); GEOSContext_setErrorHandler_r( mContext, throwQgsGeosException );
#else #else
mContext = initGEOS_r( printGEOSNotice, throwGEOSException ); mContext = initGEOS_r( printGEOSNotice, throwQgsGeosException );
#endif #endif
} }
@ -240,7 +240,7 @@ std::unique_ptr<QgsAbstractGeometry> QgsGeos::makeValid( Qgis::MakeValidMethod m
geos.reset( GEOSMakeValidWithParams_r( context, mGeos.get(), params ) ); geos.reset( GEOSMakeValidWithParams_r( context, mGeos.get(), params ) );
GEOSMakeValidParams_destroy_r( context, params ); GEOSMakeValidParams_destroy_r( context, params );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
if ( errorMsg ) if ( errorMsg )
{ {
@ -336,7 +336,7 @@ std::unique_ptr<QgsAbstractGeometry> QgsGeos::clip( const QgsRectangle &rect, QS
geos::unique_ptr opGeom( GEOSClipByRect_r( QgsGeosContext::get(), mGeos.get(), rect.xMinimum(), rect.yMinimum(), rect.xMaximum(), rect.yMaximum() ) ); geos::unique_ptr opGeom( GEOSClipByRect_r( QgsGeosContext::get(), mGeos.get(), rect.xMinimum(), rect.yMinimum(), rect.xMaximum(), rect.yMaximum() ) );
return fromGeos( opGeom.get() ); return fromGeos( opGeom.get() );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -741,7 +741,7 @@ bool QgsGeos::contains( double x, double y, QString *errorMsg ) const
result = ( GEOSContains_r( context, mGeos.get(), point.get() ) == 1 ); result = ( GEOSContains_r( context, mGeos.get(), point.get() ) == 1 );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -863,7 +863,7 @@ bool QgsGeos::intersects( const QgsAbstractGeometry *geom, QString *errorMsg ) c
{ {
return GEOSPreparedIntersectsXY_r( QgsGeosContext::get(), mGeosPrepared.get(), point->x(), point->y() ) == 1; return GEOSPreparedIntersectsXY_r( QgsGeosContext::get(), mGeosPrepared.get(), point->x(), point->y() ) == 1;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -916,7 +916,7 @@ bool QgsGeos::contains( const QgsAbstractGeometry *geom, QString *errorMsg ) con
{ {
return GEOSPreparedContainsXY_r( QgsGeosContext::get(), mGeosPrepared.get(), point->x(), point->y() ) == 1; return GEOSPreparedContainsXY_r( QgsGeosContext::get(), mGeosPrepared.get(), point->x(), point->y() ) == 1;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -961,7 +961,7 @@ QString QgsGeos::relate( const QgsAbstractGeometry *geom, QString *errorMsg ) co
GEOSFree_r( context, r ); GEOSFree_r( context, r );
} }
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -992,7 +992,7 @@ bool QgsGeos::relatePattern( const QgsAbstractGeometry *geom, const QString &pat
{ {
result = ( GEOSRelatePattern_r( context, mGeos.get(), geosGeom.get(), pattern.toLocal8Bit().constData() ) == 1 ); result = ( GEOSRelatePattern_r( context, mGeos.get(), geosGeom.get(), pattern.toLocal8Bit().constData() ) == 1 );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -1554,7 +1554,7 @@ geos::unique_ptr QgsGeos::createGeosCollection( int typeId, std::vector<geos::un
{ {
geomRes.reset( GEOSGeom_createCollection_r( context, typeId, geomarr.data(), geomarr.size() ) ); geomRes.reset( GEOSGeom_createCollection_r( context, typeId, geomarr.data(), geomarr.size() ) );
} }
catch ( GEOSException & ) catch ( QgsGeosException & )
{ {
for ( GEOSGeometry *geom : geomarr ) for ( GEOSGeometry *geom : geomarr )
{ {
@ -1989,7 +1989,7 @@ std::unique_ptr<QgsAbstractGeometry> QgsGeos::overlay( const QgsAbstractGeometry
} }
return fromGeos( opGeom.get() ); return fromGeos( opGeom.get() );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -2071,7 +2071,7 @@ bool QgsGeos::relation( const QgsAbstractGeometry *geom, Relation r, QString *er
break; break;
} }
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -3114,7 +3114,7 @@ std::unique_ptr<QgsAbstractGeometry> QgsGeos::closestPoint( const QgsGeometry &o
( void )GEOSCoordSeq_getX_r( context, nearestCoord.get(), 0, &nx ); ( void )GEOSCoordSeq_getX_r( context, nearestCoord.get(), 0, &nx );
( void )GEOSCoordSeq_getY_r( context, nearestCoord.get(), 0, &ny ); ( void )GEOSCoordSeq_getY_r( context, nearestCoord.get(), 0, &ny );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -3169,7 +3169,7 @@ std::unique_ptr< QgsAbstractGeometry > QgsGeos::shortestLine( const QgsAbstractG
( void )GEOSCoordSeq_getX_r( context, nearestCoord.get(), 1, &nx2 ); ( void )GEOSCoordSeq_getX_r( context, nearestCoord.get(), 1, &nx2 );
( void )GEOSCoordSeq_getY_r( context, nearestCoord.get(), 1, &ny2 ); ( void )GEOSCoordSeq_getY_r( context, nearestCoord.get(), 1, &ny2 );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -3203,7 +3203,7 @@ double QgsGeos::lineLocatePoint( const QgsPoint &point, QString *errorMsg ) cons
{ {
distance = GEOSProject_r( QgsGeosContext::get(), mGeos.get(), otherGeom.get() ); distance = GEOSProject_r( QgsGeosContext::get(), mGeos.get(), otherGeom.get() );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -3232,7 +3232,7 @@ double QgsGeos::lineLocatePoint( double x, double y, QString *errorMsg ) const
{ {
distance = GEOSProject_r( QgsGeosContext::get(), mGeos.get(), point.get() ); distance = GEOSProject_r( QgsGeosContext::get(), mGeos.get(), point.get() );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
logError( QStringLiteral( "GEOS" ), e.what() ); logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg ) if ( errorMsg )
@ -3270,7 +3270,7 @@ QgsGeometry QgsGeos::polygonize( const QVector<const QgsAbstractGeometry *> &geo
delete[] lineGeosGeometries; delete[] lineGeosGeometries;
return QgsGeometry( fromGeos( result.get() ) ); return QgsGeometry( fromGeos( result.get() ) );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
if ( errorMsg ) if ( errorMsg )
{ {
@ -3475,7 +3475,7 @@ geos::unique_ptr QgsGeos::reshapeLine( const GEOSGeometry *line, const GEOSGeome
} }
} }
} }
catch ( GEOSException & ) catch ( QgsGeosException & )
{ {
atLeastTwoIntersections = false; atLeastTwoIntersections = false;
} }
@ -3736,7 +3736,7 @@ geos::unique_ptr QgsGeos::reshapePolygon( const GEOSGeometry *polygon, const GEO
} }
} }
} }
catch ( GEOSException & ) catch ( QgsGeosException & )
{ {
nIntersections = 0; nIntersections = 0;
} }
@ -3762,7 +3762,15 @@ geos::unique_ptr QgsGeos::reshapePolygon( const GEOSGeometry *polygon, const GEO
reshapeResult.reset(); reshapeResult.reset();
try
{
newRing = GEOSGeom_createLinearRing_r( context, newCoordSequence ); newRing = GEOSGeom_createLinearRing_r( context, newCoordSequence );
}
catch ( QgsGeosException & )
{
// nothing to do: on exception newRing will be null
}
if ( !newRing ) if ( !newRing )
{ {
delete [] innerRings; delete [] innerRings;

View File

@ -945,10 +945,10 @@ class CORE_EXPORT QgsGeos: public QgsGeometryEngine
#ifndef SIP_RUN #ifndef SIP_RUN
class GEOSException : public std::runtime_error class QgsGeosException : public std::runtime_error
{ {
public: public:
explicit GEOSException( const QString &message ) explicit QgsGeosException( const QString &message )
: std::runtime_error( message.toUtf8().constData() ) : std::runtime_error( message.toUtf8().constData() )
{ {
} }

View File

@ -226,7 +226,7 @@ bool QgsAbstractLabelingEngineRuleDistanceFromFeature::candidateExceedsTolerance
return false; return false;
#endif #endif
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) ); QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) );
} }
@ -457,7 +457,7 @@ bool QgsLabelingEngineRuleMinimumDistanceLabelToLabel::candidatesAreConflicting(
return false; return false;
#endif #endif
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) ); QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) );
} }
@ -609,7 +609,7 @@ bool QgsLabelingEngineRuleAvoidLabelOverlapWithFeature::candidateIsIllegal( cons
if ( GEOSPreparedIntersects_r( geosctxt, candidateGeos, featureCandidate.get() ) == 1 ) if ( GEOSPreparedIntersects_r( geosctxt, candidateGeos, featureCandidate.get() ) == 1 )
return true; return true;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) ); QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) );
} }

View File

@ -1135,13 +1135,13 @@ void QgsLayoutItemMap::paint( QPainter *painter, const QStyleOptionGraphicsItem
{ {
// current job was invalidated - start a new one // current job was invalidated - start a new one
mPreviewScaleFactor = QgsLayoutUtils::scaleFactorFromItemStyle( style, painter ); mPreviewScaleFactor = QgsLayoutUtils::scaleFactorFromItemStyle( style, painter );
mBackgroundUpdateTimer->start( 1 ); mBackgroundUpdateTimer->start( 100 );
} }
else if ( !mPainterJob && !mDrawingPreview ) else if ( !mPainterJob && !mDrawingPreview )
{ {
// this is the map's very first paint - trigger a cache update // this is the map's very first paint - trigger a cache update
mPreviewScaleFactor = QgsLayoutUtils::scaleFactorFromItemStyle( style, painter ); mPreviewScaleFactor = QgsLayoutUtils::scaleFactorFromItemStyle( style, painter );
mBackgroundUpdateTimer->start( 1 ); mBackgroundUpdateTimer->start( 100 );
} }
renderInProgress = true; renderInProgress = true;
} }
@ -1151,7 +1151,7 @@ void QgsLayoutItemMap::paint( QPainter *painter, const QStyleOptionGraphicsItem
{ {
// cache was invalidated - trigger a background update // cache was invalidated - trigger a background update
mPreviewScaleFactor = QgsLayoutUtils::scaleFactorFromItemStyle( style, painter ); mPreviewScaleFactor = QgsLayoutUtils::scaleFactorFromItemStyle( style, painter );
mBackgroundUpdateTimer->start( 1 ); mBackgroundUpdateTimer->start( 100 );
renderInProgress = true; renderInProgress = true;
} }

View File

@ -420,7 +420,7 @@ std::unique_ptr<LabelPosition> FeaturePart::createCandidatePointOnSurface( Point
GEOSCoordSeq_getXY_r( geosctxt, coordSeq, 0, &px, &py ); GEOSCoordSeq_getXY_r( geosctxt, coordSeq, 0, &px, &py );
} }
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -2424,7 +2424,7 @@ bool FeaturePart::isConnected( FeaturePart *p2 )
return ( GEOSPreparedIntersects_r( geosctxt, preparedGeom(), p2OtherEnd.get() ) != 1 ); return ( GEOSPreparedIntersects_r( geosctxt, preparedGeom(), p2OtherEnd.get() ) != 1 );
#endif #endif
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -2465,7 +2465,7 @@ bool FeaturePart::mergeWithFeaturePart( FeaturePart *other )
extractCoords( mGeos ); extractCoords( mGeos );
return true; return true;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );

View File

@ -336,7 +336,7 @@ bool GeomFunction::containsCandidate( const GEOSPreparedGeometry *geom, double x
const bool result = ( GEOSPreparedContainsProperly_r( geosctxt, geom, bboxGeos.get() ) == 1 ); const bool result = ( GEOSPreparedContainsProperly_r( geosctxt, geom, bboxGeos.get() ) == 1 );
return result; return result;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
Q_NOWARN_UNREACHABLE_PUSH Q_NOWARN_UNREACHABLE_PUSH

View File

@ -190,7 +190,7 @@ bool LabelPosition::intersects( const GEOSPreparedGeometry *geometry )
return mNextPart->intersects( geometry ); return mNextPart->intersects( geometry );
} }
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -217,7 +217,7 @@ bool LabelPosition::within( const GEOSPreparedGeometry *geometry )
return mNextPart->within( geometry ); return mNextPart->within( geometry );
} }
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -301,7 +301,7 @@ bool LabelPosition::isInConflict( const LabelPosition *lp ) const
QgsMessageLog::logMessage( QStringLiteral( "label margin distance requires GEOS 3.10+" ) ); QgsMessageLog::logMessage( QStringLiteral( "label margin distance requires GEOS 3.10+" ) );
#endif #endif
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) ); QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) );
} }
@ -318,7 +318,7 @@ bool LabelPosition::isInConflict( const LabelPosition *lp ) const
mOuterBoundsGeos ? mOuterBoundsGeos.get() : mGeos ) == 1 ); mOuterBoundsGeos ? mOuterBoundsGeos.get() : mGeos ) == 1 );
return result; return result;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -364,7 +364,7 @@ bool LabelPosition::isInConflictMultiPart( const LabelPosition *lp ) const
QgsMessageLog::logMessage( QStringLiteral( "label margin distance requires GEOS 3.10+" ) ); QgsMessageLog::logMessage( QStringLiteral( "label margin distance requires GEOS 3.10+" ) );
#endif #endif
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) ); QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) );
} }
@ -376,7 +376,7 @@ bool LabelPosition::isInConflictMultiPart( const LabelPosition *lp ) const
const bool result = ( GEOSPreparedIntersects_r( geosctxt, preparedMultiPartGeom(), lp->mMultipartGeos ) == 1 ); const bool result = ( GEOSPreparedIntersects_r( geosctxt, preparedMultiPartGeom(), lp->mMultipartGeos ) == 1 );
return result; return result;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -695,7 +695,7 @@ double LabelPosition::getDistanceToPoint( double xp, double yp, bool useOuterBou
geos::unique_ptr point( GEOSGeom_createPointFromXY_r( geosctxt, xp, yp ) ); geos::unique_ptr point( GEOSGeom_createPointFromXY_r( geosctxt, xp, yp ) );
contains = ( GEOSPreparedContainsProperly_r( geosctxt, mPreparedOuterBoundsGeos, point.get() ) == 1 ); contains = ( GEOSPreparedContainsProperly_r( geosctxt, mPreparedOuterBoundsGeos, point.get() ) == 1 );
} }
catch ( GEOSException & ) catch ( QgsGeosException & )
{ {
contains = false; contains = false;
} }
@ -747,7 +747,7 @@ double LabelPosition::getDistanceToPoint( double xp, double yp, bool useOuterBou
distance = QgsGeometryUtilsBase::sqrDistance2D( xp, yp, nx, ny ); distance = QgsGeometryUtilsBase::sqrDistance2D( xp, yp, nx, ny );
} }
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -788,7 +788,7 @@ bool LabelPosition::crossesLine( PointSet *line ) const
return mNextPart->crossesLine( line ); return mNextPart->crossesLine( line );
} }
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -820,7 +820,7 @@ bool LabelPosition::crossesBoundary( PointSet *polygon ) const
return mNextPart->crossesBoundary( polygon ); return mNextPart->crossesBoundary( polygon );
} }
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -855,7 +855,7 @@ bool LabelPosition::intersectsWithPolygon( PointSet *polygon ) const
return true; return true;
} }
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -914,7 +914,7 @@ double LabelPosition::polygonIntersectionCostForParts( PointSet *polygon ) const
cost += 4; cost += 4;
} }
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );

View File

@ -790,7 +790,7 @@ bool Pal::candidatesAreConflicting( const LabelPosition *lp1, const LabelPositio
QgsMessageLog::logMessage( QStringLiteral( "label margin distance requires GEOS 3.10+" ) ); QgsMessageLog::logMessage( QStringLiteral( "label margin distance requires GEOS 3.10+" ) );
#endif #endif
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) ); QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) );
} }

View File

@ -278,7 +278,7 @@ bool PointSet::containsPoint( double x, double y ) const
return result; return result;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -617,7 +617,7 @@ void PointSet::offsetCurveByDistance( double distance )
x = std::move( newX ); x = std::move( newX );
y = std::move( newY ); y = std::move( newY );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -907,7 +907,7 @@ double PointSet::minDistanceToPoint( double px, double py, double *rx, double *r
return QgsGeometryUtilsBase::sqrDistance2D( px, py, nx, ny ); return QgsGeometryUtilsBase::sqrDistance2D( px, py, nx, ny );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -954,7 +954,7 @@ void PointSet::getCentroid( double &px, double &py, bool forceInside ) const
} }
} }
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -1023,7 +1023,7 @@ geos::unique_ptr PointSet::interpolatePoint( double distance ) const
geos::unique_ptr res( GEOSInterpolate_r( QgsGeosContext::get(), thisGeos, distance ) ); geos::unique_ptr res( GEOSInterpolate_r( QgsGeosContext::get(), thisGeos, distance ) );
return res; return res;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
return nullptr; return nullptr;
@ -1041,7 +1041,7 @@ double PointSet::lineLocatePoint( const GEOSGeometry *point ) const
{ {
distance = GEOSProject_r( QgsGeosContext::get(), thisGeos, point ); distance = GEOSProject_r( QgsGeosContext::get(), thisGeos, point );
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
return -1; return -1;
@ -1076,7 +1076,7 @@ double PointSet::length() const
( void )GEOSLength_r( geosctxt, mGeos, &mLength ); ( void )GEOSLength_r( geosctxt, mGeos, &mLength );
return mLength; return mLength;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -1103,7 +1103,7 @@ double PointSet::area() const
mArea = std::fabs( mArea ); mArea = std::fabs( mArea );
return mArea; return mArea;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -1137,7 +1137,7 @@ QString PointSet::toWkt() const
return res; return res;
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
qWarning( "GEOS exception: %s", e.what() ); qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) ); QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );

View File

@ -34,6 +34,7 @@
#include <iostream> #include <iostream>
#include <memory>
#define LEFT(x) (2*x+1) #define LEFT(x) (2*x+1)
#define RIGHT(x) (2*x+2) #define RIGHT(x) (2*x+2)

View File

@ -830,6 +830,20 @@ void QgsOgrProvider::loadFields()
QMutexLocker locker( mutex ); QMutexLocker locker( mutex );
mOGRGeomType = getOgrGeomType( mGDALDriverName, ogrLayer ); mOGRGeomType = getOgrGeomType( mGDALDriverName, ogrLayer );
} }
mCrs = QgsCoordinateReferenceSystem();
if ( mOGRGeomType != wkbNone )
{
if ( OGRSpatialReferenceH spatialRefSys = mOgrLayer->GetSpatialRef() )
{
mCrs = QgsOgrUtils::OGRSpatialReferenceToCrs( spatialRefSys );
}
else
{
QgsDebugMsgLevel( QStringLiteral( "no spatial reference found" ), 2 );
}
}
QgsOgrFeatureDefn &fdef = mOgrLayer->GetLayerDefn(); QgsOgrFeatureDefn &fdef = mOgrLayer->GetLayerDefn();
// Expose the OGR FID if it comes from a "real" column (typically GPKG) // Expose the OGR FID if it comes from a "real" column (typically GPKG)
@ -3864,20 +3878,10 @@ QString QgsOgrProvider::description() const
QgsCoordinateReferenceSystem QgsOgrProvider::crs() const QgsCoordinateReferenceSystem QgsOgrProvider::crs() const
{ {
QgsCoordinateReferenceSystem srs;
if ( !mValid || ( mOGRGeomType == wkbNone ) ) if ( !mValid || ( mOGRGeomType == wkbNone ) )
return srs; return QgsCoordinateReferenceSystem();
if ( OGRSpatialReferenceH spatialRefSys = mOgrLayer->GetSpatialRef() ) return mCrs;
{
srs = QgsOgrUtils::OGRSpatialReferenceToCrs( spatialRefSys );
}
else
{
QgsDebugMsgLevel( QStringLiteral( "no spatial reference found" ), 2 );
}
return srs;
} }
QString QgsOgrProvider::dataComment() const QString QgsOgrProvider::dataComment() const

View File

@ -304,6 +304,7 @@ class QgsOgrProvider final: public QgsVectorDataProvider
bool mValid = false; bool mValid = false;
OGRwkbGeometryType mOGRGeomType = wkbUnknown; OGRwkbGeometryType mOGRGeomType = wkbUnknown;
QgsCoordinateReferenceSystem mCrs;
//! Whether the next call to featureCount() should refresh the feature count //! Whether the next call to featureCount() should refresh the feature count
mutable bool mRefreshFeatureCount = true; mutable bool mRefreshFeatureCount = true;

View File

@ -1075,7 +1075,7 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
const int localNameLen = ( pszSep ) ? ( int )( elLen - nsLen ) - 1 : elLen; const int localNameLen = ( pszSep ) ? ( int )( elLen - nsLen ) - 1 : elLen;
const ParseMode parseMode( mParseModeStack.isEmpty() ? None : mParseModeStack.top() ); const ParseMode parseMode( mParseModeStack.isEmpty() ? None : mParseModeStack.top() );
const int lastDimension = mDimensionStack.isEmpty() ? 0 : mDimensionStack.pop(); const int lastDimension = mDimensionStack.isEmpty() ? 2 : mDimensionStack.pop();
const bool isGMLNS = ( nsLen == mGMLNameSpaceURI.size() && mGMLNameSpaceURIPtr && memcmp( el, mGMLNameSpaceURIPtr, nsLen ) == 0 ); const bool isGMLNS = ( nsLen == mGMLNameSpaceURI.size() && mGMLNameSpaceURIPtr && memcmp( el, mGMLNameSpaceURIPtr, nsLen ) == 0 );
@ -1215,7 +1215,7 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
} }
else if ( parseMode == LowerCorner && isGMLNS && LOCALNAME_EQUALS( "lowerCorner" ) ) else if ( parseMode == LowerCorner && isGMLNS && LOCALNAME_EQUALS( "lowerCorner" ) )
{ {
QList<QgsPointXY> points; QList<QgsPoint> points;
pointsFromPosListString( points, mStringCash, 2 ); pointsFromPosListString( points, mStringCash, 2 );
if ( points.size() == 1 ) if ( points.size() == 1 )
{ {
@ -1226,7 +1226,7 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
} }
else if ( parseMode == UpperCorner && isGMLNS && LOCALNAME_EQUALS( "upperCorner" ) ) else if ( parseMode == UpperCorner && isGMLNS && LOCALNAME_EQUALS( "upperCorner" ) )
{ {
QList<QgsPointXY> points; QList<QgsPoint> points;
pointsFromPosListString( points, mStringCash, 2 ); pointsFromPosListString( points, mStringCash, 2 );
if ( points.size() == 1 ) if ( points.size() == 1 )
{ {
@ -1279,12 +1279,14 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
} }
else if ( !mAttributeValIsNested && isGMLNS && LOCALNAME_EQUALS( "Point" ) ) else if ( !mAttributeValIsNested && isGMLNS && LOCALNAME_EQUALS( "Point" ) )
{ {
QList<QgsPointXY> pointList; QList<QgsPoint> pointList;
if ( pointsFromString( pointList, mStringCash ) != 0 ) int dimension = 0;
if ( pointsFromString( pointList, mStringCash, &dimension ) != 0 )
{ {
//error //error
} }
mStringCash.clear(); mStringCash.clear();
mDimension = dimension;
if ( pointList.isEmpty() ) if ( pointList.isEmpty() )
return; // error return; // error
@ -1292,20 +1294,21 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
if ( parseMode == QgsGmlStreamingParser::Geometry ) if ( parseMode == QgsGmlStreamingParser::Geometry )
{ {
//directly add WKB point to the feature //directly add WKB point to the feature
if ( getPointWKB( mCurrentWKB, *( pointList.constBegin() ) ) != 0 ) if ( getPointWKB( mCurrentWKB, *( pointList.constBegin() ), dimension ) != 0 )
{ {
//error //error
} }
if ( mWkbType != Qgis::WkbType::MultiPoint ) //keep multitype in case of geometry type mix if ( QgsWkbTypes::flatType( mWkbType ) != Qgis::WkbType::MultiPoint ) //keep multitype in case of geometry type mix
{ {
mWkbType = Qgis::WkbType::Point; mWkbType = dimension > 2 ? Qgis::WkbType::PointZ : Qgis::WkbType::Point;
} }
} }
else //multipoint, add WKB as fragment else //multipoint, add WKB as fragment
{ {
QByteArray wkbPtr; QByteArray wkbPtr;
if ( getPointWKB( wkbPtr, *( pointList.constBegin() ) ) != 0 ) if ( getPointWKB( wkbPtr, *( pointList.constBegin() ), dimension ) != 0 )
{ {
//error //error
} }
@ -1324,32 +1327,40 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
{ {
//add WKB point to the feature //add WKB point to the feature
QList<QgsPointXY> pointList; QList<QgsPoint> pointList;
if ( pointsFromString( pointList, mStringCash ) != 0 ) int dimension = 0;
if ( pointsFromString( pointList, mStringCash, &dimension ) != 0 )
{ {
//error //error
} }
mStringCash.clear(); mStringCash.clear();
mDimension = dimension;
if ( parseMode == QgsGmlStreamingParser::Geometry ) if ( parseMode == QgsGmlStreamingParser::Geometry )
{ {
if ( getLineWKB( mCurrentWKB, pointList ) != 0 ) if ( getLineWKB( mCurrentWKB, pointList, dimension ) != 0 )
{ {
//error //error
} }
if ( mWkbType != Qgis::WkbType::MultiLineString )//keep multitype in case of geometry type mix if ( QgsWkbTypes::flatType( mWkbType ) != Qgis::WkbType::MultiLineString )//keep multitype in case of geometry type mix
{ {
mWkbType = Qgis::WkbType::LineString; mWkbType = dimension > 2 ? Qgis::WkbType::LineStringZ : Qgis::WkbType::LineString;
} }
else if ( dimension > 2 )
{
mWkbType = Qgis::WkbType::MultiLineStringZ;
}
mDimension = dimension;
} }
else //multiline, add WKB as fragment else //multiline, add WKB as fragment
{ {
QByteArray wkbPtr; QByteArray wkbPtr;
if ( getLineWKB( wkbPtr, pointList ) != 0 ) if ( getLineWKB( wkbPtr, pointList, dimension ) != 0 )
{ {
//error //error
} }
mDimension = dimension;
if ( !mCurrentWKBFragments.isEmpty() ) if ( !mCurrentWKBFragments.isEmpty() )
{ {
mCurrentWKBFragments.last().push_back( wkbPtr ); mCurrentWKBFragments.last().push_back( wkbPtr );
@ -1363,15 +1374,17 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
else if ( ( parseMode == Geometry || parseMode == MultiPolygon ) && else if ( ( parseMode == Geometry || parseMode == MultiPolygon ) &&
isGMLNS && LOCALNAME_EQUALS( "LinearRing" ) ) isGMLNS && LOCALNAME_EQUALS( "LinearRing" ) )
{ {
QList<QgsPointXY> pointList; QList<QgsPoint> pointList;
if ( pointsFromString( pointList, mStringCash ) != 0 ) int dimension = 0;
if ( pointsFromString( pointList, mStringCash, &dimension ) != 0 )
{ {
//error //error
} }
mStringCash.clear(); mStringCash.clear();
mDimension = dimension;
QByteArray wkbPtr; QByteArray wkbPtr;
if ( getRingWKB( wkbPtr, pointList ) != 0 ) if ( getRingWKB( wkbPtr, pointList, dimension ) != 0 )
{ {
//error //error
} }
@ -1388,9 +1401,9 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
else if ( ( parseMode == Geometry || parseMode == MultiPolygon ) && isGMLNS && else if ( ( parseMode == Geometry || parseMode == MultiPolygon ) && isGMLNS &&
LOCALNAME_EQUALS( "Polygon" ) ) LOCALNAME_EQUALS( "Polygon" ) )
{ {
if ( mWkbType != Qgis::WkbType::MultiPolygon )//keep multitype in case of geometry type mix if ( QgsWkbTypes::flatType( mWkbType ) != Qgis::WkbType::MultiPolygon ) //keep multitype in case of geometry type mix
{ {
mWkbType = Qgis::WkbType::Polygon; mWkbType = mDimension > 2 ? Qgis::WkbType::PolygonZ : Qgis::WkbType::Polygon;
} }
if ( parseMode == Geometry ) if ( parseMode == Geometry )
@ -1401,21 +1414,21 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
else if ( parseMode == MultiPoint && isGMLNS && else if ( parseMode == MultiPoint && isGMLNS &&
LOCALNAME_EQUALS( "MultiPoint" ) ) LOCALNAME_EQUALS( "MultiPoint" ) )
{ {
mWkbType = Qgis::WkbType::MultiPoint; mWkbType = mDimension > 2 ? Qgis::WkbType::MultiPointZ : Qgis::WkbType::MultiPoint;
mParseModeStack.pop(); mParseModeStack.pop();
createMultiPointFromFragments(); createMultiPointFromFragments();
} }
else if ( parseMode == MultiLine && isGMLNS && else if ( parseMode == MultiLine && isGMLNS &&
( LOCALNAME_EQUALS( "MultiLineString" ) || LOCALNAME_EQUALS( "MultiCurve" ) ) ) ( LOCALNAME_EQUALS( "MultiLineString" ) || LOCALNAME_EQUALS( "MultiCurve" ) ) )
{ {
mWkbType = Qgis::WkbType::MultiLineString; mWkbType = mDimension > 2 ? Qgis::WkbType::MultiLineStringZ : Qgis::WkbType::MultiLineString;
mParseModeStack.pop(); mParseModeStack.pop();
createMultiLineFromFragments(); createMultiLineFromFragments();
} }
else if ( parseMode == MultiPolygon && isGMLNS && else if ( parseMode == MultiPolygon && isGMLNS &&
( LOCALNAME_EQUALS( "MultiPolygon" ) || LOCALNAME_EQUALS( "MultiSurface" ) ) ) ( LOCALNAME_EQUALS( "MultiPolygon" ) || LOCALNAME_EQUALS( "MultiSurface" ) ) )
{ {
mWkbType = Qgis::WkbType::MultiPolygon; mWkbType = mDimension > 2 ? Qgis::WkbType::MultiPolygonZ : Qgis::WkbType::MultiPolygon;
mParseModeStack.pop(); mParseModeStack.pop();
createMultiPolygonFromFragments(); createMultiPolygonFromFragments();
} }
@ -1584,7 +1597,7 @@ QString QgsGmlStreamingParser::readAttribute( const QString &attributeName, cons
bool QgsGmlStreamingParser::createBBoxFromCoordinateString( QgsRectangle &r, const QString &coordString ) const bool QgsGmlStreamingParser::createBBoxFromCoordinateString( QgsRectangle &r, const QString &coordString ) const
{ {
QList<QgsPointXY> points; QList<QgsPoint> points;
if ( pointsFromCoordinateString( points, coordString ) != 0 ) if ( pointsFromCoordinateString( points, coordString ) != 0 )
{ {
return false; return false;
@ -1600,18 +1613,25 @@ bool QgsGmlStreamingParser::createBBoxFromCoordinateString( QgsRectangle &r, con
return true; return true;
} }
int QgsGmlStreamingParser::pointsFromCoordinateString( QList<QgsPointXY> &points, const QString &coordString ) const int QgsGmlStreamingParser::pointsFromCoordinateString( QList<QgsPoint> &points, const QString &coordString, int *dimension ) const
{ {
//tuples are separated by space, x/y by ',' //tuples are separated by space, x/y by ','
const QStringList tuples = coordString.split( mTupleSeparator, Qt::SkipEmptyParts ); const QStringList tuples = coordString.split( mTupleSeparator, Qt::SkipEmptyParts );
QStringList tuples_coordinates; QStringList tuples_coordinates;
double x, y; double x, y, z;
bool conversionSuccess; bool conversionSuccess;
if ( dimension )
*dimension = 0;
QStringList::const_iterator tupleIterator; QStringList::const_iterator tupleIterator;
for ( tupleIterator = tuples.constBegin(); tupleIterator != tuples.constEnd(); ++tupleIterator ) for ( tupleIterator = tuples.constBegin(); tupleIterator != tuples.constEnd(); ++tupleIterator )
{ {
tuples_coordinates = tupleIterator->split( mCoordinateSeparator, Qt::SkipEmptyParts ); tuples_coordinates = tupleIterator->split( mCoordinateSeparator, Qt::SkipEmptyParts );
if ( dimension )
{
*dimension = std::max( *dimension, static_cast<int>( tuples_coordinates.size() ) );
}
if ( tuples_coordinates.size() < 2 ) if ( tuples_coordinates.size() < 2 )
{ {
continue; continue;
@ -1626,12 +1646,30 @@ int QgsGmlStreamingParser::pointsFromCoordinateString( QList<QgsPointXY> &points
{ {
continue; continue;
} }
points.push_back( ( mInvertAxisOrientation ) ? QgsPointXY( y, x ) : QgsPointXY( x, y ) ); if ( tuples_coordinates.size() > 2 )
{
z = tuples_coordinates.at( 2 ).toDouble( &conversionSuccess );
if ( !conversionSuccess )
{
continue;
} }
}
else
{
z = std::numeric_limits<double>::quiet_NaN(); // no Z coordinate
}
points.push_back( ( mInvertAxisOrientation ) ? QgsPoint( y, x, z ) : QgsPoint( x, y, z ) );
}
if ( dimension && *dimension == 0 )
{
*dimension = 2; // default dimension is 2D
}
return 0; return 0;
} }
int QgsGmlStreamingParser::pointsFromPosListString( QList<QgsPointXY> &points, const QString &coordString, int dimension ) const int QgsGmlStreamingParser::pointsFromPosListString( QList<QgsPoint> &points, const QString &coordString, int dimension ) const
{ {
// coordinates separated by spaces // coordinates separated by spaces
const QStringList coordinates = coordString.split( ' ', Qt::SkipEmptyParts ); const QStringList coordinates = coordString.split( ' ', Qt::SkipEmptyParts );
@ -1655,66 +1693,91 @@ int QgsGmlStreamingParser::pointsFromPosListString( QList<QgsPointXY> &points, c
{ {
continue; continue;
} }
points.append( ( mInvertAxisOrientation ) ? QgsPointXY( y, x ) : QgsPointXY( x, y ) ); double z = std::numeric_limits<double>::quiet_NaN();
if ( dimension > 2 )
{
z = coordinates.value( i * dimension + 2 ).toDouble( &conversionSuccess );
if ( !conversionSuccess )
{
continue;
}
}
points.append( mInvertAxisOrientation ? QgsPoint( y, x, z ) : QgsPoint( x, y, z ) );
} }
return 0; return 0;
} }
int QgsGmlStreamingParser::pointsFromString( QList<QgsPointXY> &points, const QString &coordString ) const int QgsGmlStreamingParser::pointsFromString( QList<QgsPoint> &points, const QString &coordString, int *dimension ) const
{ {
if ( mCoorMode == QgsGmlStreamingParser::Coordinate ) if ( mCoorMode == QgsGmlStreamingParser::Coordinate )
{ {
return pointsFromCoordinateString( points, coordString ); return pointsFromCoordinateString( points, coordString, dimension );
} }
else if ( mCoorMode == QgsGmlStreamingParser::PosList ) else if ( mCoorMode == QgsGmlStreamingParser::PosList )
{ {
if ( dimension )
{
*dimension = mDimension ? mDimension : 2; // default dimension is 2D
}
return pointsFromPosListString( points, coordString, mDimension ? mDimension : 2 ); return pointsFromPosListString( points, coordString, mDimension ? mDimension : 2 );
} }
return 1; return 1;
} }
int QgsGmlStreamingParser::getPointWKB( QByteArray &wkbPtr, const QgsPointXY &point ) const int QgsGmlStreamingParser::getPointWKB( QByteArray &wkbPtr, const QgsPoint &point, int dimension ) const
{ {
const int wkbSize = 1 + sizeof( int ) + 2 * sizeof( double ); const int wkbSize = 1 + static_cast<int>( sizeof( int ) ) + dimension * static_cast<int>( sizeof( double ) );
wkbPtr = QByteArray( wkbSize, Qt::Uninitialized ); wkbPtr = QByteArray( wkbSize, Qt::Uninitialized );
QgsWkbPtr fillPtr( wkbPtr ); QgsWkbPtr fillPtr( wkbPtr );
fillPtr << mEndian << Qgis::WkbType::Point << point.x() << point.y(); fillPtr << mEndian << ( dimension > 2 ? Qgis::WkbType::PointZ : Qgis::WkbType::Point ) << point.x() << point.y();
if ( dimension > 2 )
return 0;
}
int QgsGmlStreamingParser::getLineWKB( QByteArray &wkbPtr, const QList<QgsPointXY> &lineCoordinates ) const
{
const int wkbSize = 1 + 2 * sizeof( int ) + lineCoordinates.size() * 2 * sizeof( double );
wkbPtr = QByteArray( wkbSize, Qt::Uninitialized );
QgsWkbPtr fillPtr( wkbPtr );
fillPtr << mEndian << Qgis::WkbType::LineString << lineCoordinates.size();
QList<QgsPointXY>::const_iterator iter;
for ( iter = lineCoordinates.constBegin(); iter != lineCoordinates.constEnd(); ++iter )
{ {
fillPtr << iter->x() << iter->y(); fillPtr << point.z(); // add Z coordinate if available
} }
return 0; return 0;
} }
int QgsGmlStreamingParser::getRingWKB( QByteArray &wkbPtr, const QList<QgsPointXY> &ringCoordinates ) const int QgsGmlStreamingParser::getLineWKB( QByteArray &wkbPtr, const QList<QgsPoint> &lineCoordinates, int dimension ) const
{ {
const int wkbSize = sizeof( int ) + ringCoordinates.size() * 2 * sizeof( double ); const int wkbSize = 1 + 2 * static_cast<int>( sizeof( int ) ) + static_cast<int>( lineCoordinates.size() ) * dimension * static_cast<int>( sizeof( double ) );
wkbPtr = QByteArray( wkbSize, Qt::Uninitialized );
QgsWkbPtr fillPtr( wkbPtr );
fillPtr << mEndian << ( dimension > 2 ? Qgis::WkbType::LineStringZ : Qgis::WkbType::LineString ) << lineCoordinates.size();
QList<QgsPoint>::const_iterator iter;
for ( iter = lineCoordinates.constBegin(); iter != lineCoordinates.constEnd(); ++iter )
{
fillPtr << iter->x() << iter->y();
if ( dimension > 2 )
{
fillPtr << iter->z(); // add Z coordinate if available
}
}
return 0;
}
int QgsGmlStreamingParser::getRingWKB( QByteArray &wkbPtr, const QList<QgsPoint> &ringCoordinates, int dimension ) const
{
const int wkbSize = static_cast<int>( sizeof( int ) ) + static_cast<int>( ringCoordinates.size() ) * dimension * static_cast<int>( sizeof( double ) );
wkbPtr = QByteArray( wkbSize, Qt::Uninitialized ); wkbPtr = QByteArray( wkbSize, Qt::Uninitialized );
QgsWkbPtr fillPtr( wkbPtr ); QgsWkbPtr fillPtr( wkbPtr );
fillPtr << ringCoordinates.size(); fillPtr << ringCoordinates.size();
QList<QgsPointXY>::const_iterator iter; QList<QgsPoint>::const_iterator iter;
for ( iter = ringCoordinates.constBegin(); iter != ringCoordinates.constEnd(); ++iter ) for ( iter = ringCoordinates.constBegin(); iter != ringCoordinates.constEnd(); ++iter )
{ {
fillPtr << iter->x() << iter->y(); fillPtr << iter->x() << iter->y();
if ( dimension > 2 )
{
fillPtr << iter->z(); // add Z coordinate if available
}
} }
return 0; return 0;
@ -1722,12 +1785,12 @@ int QgsGmlStreamingParser::getRingWKB( QByteArray &wkbPtr, const QList<QgsPointX
int QgsGmlStreamingParser::createMultiLineFromFragments() int QgsGmlStreamingParser::createMultiLineFromFragments()
{ {
const int size = 1 + 2 * sizeof( int ) + totalWKBFragmentSize(); const int size = 1 + ( mDimension > 2 ? mDimension : 2 ) * static_cast<int>( sizeof( int ) ) + totalWKBFragmentSize();
mCurrentWKB = QByteArray( size, Qt::Uninitialized ); mCurrentWKB = QByteArray( size, Qt::Uninitialized );
QgsWkbPtr wkbPtr( mCurrentWKB ); QgsWkbPtr wkbPtr( mCurrentWKB );
wkbPtr << mEndian << Qgis::WkbType::MultiLineString << mCurrentWKBFragments.constBegin()->size(); wkbPtr << mEndian << ( mDimension > 2 ? Qgis::WkbType::MultiLineStringZ : Qgis::WkbType::MultiLineString ) << mCurrentWKBFragments.constBegin()->size();
//copy (and delete) all the wkb fragments //copy (and delete) all the wkb fragments
auto wkbIt = mCurrentWKBFragments.constBegin()->constBegin(); auto wkbIt = mCurrentWKBFragments.constBegin()->constBegin();
@ -1738,17 +1801,17 @@ int QgsGmlStreamingParser::createMultiLineFromFragments()
} }
mCurrentWKBFragments.clear(); mCurrentWKBFragments.clear();
mWkbType = Qgis::WkbType::MultiLineString; mWkbType = mDimension > 2 ? Qgis::WkbType::MultiLineStringZ : Qgis::WkbType::MultiLineString;
return 0; return 0;
} }
int QgsGmlStreamingParser::createMultiPointFromFragments() int QgsGmlStreamingParser::createMultiPointFromFragments()
{ {
const int size = 1 + 2 * sizeof( int ) + totalWKBFragmentSize(); const int size = 1 + ( mDimension > 2 ? mDimension : 2 ) * static_cast<int>( sizeof( int ) ) + totalWKBFragmentSize();
mCurrentWKB = QByteArray( size, Qt::Uninitialized ); mCurrentWKB = QByteArray( size, Qt::Uninitialized );
QgsWkbPtr wkbPtr( mCurrentWKB ); QgsWkbPtr wkbPtr( mCurrentWKB );
wkbPtr << mEndian << Qgis::WkbType::MultiPoint << mCurrentWKBFragments.constBegin()->size(); wkbPtr << mEndian << ( mDimension > 2 ? Qgis::WkbType::MultiPointZ : Qgis::WkbType::MultiPoint ) << mCurrentWKBFragments.constBegin()->size();
auto wkbIt = mCurrentWKBFragments.constBegin()->constBegin(); auto wkbIt = mCurrentWKBFragments.constBegin()->constBegin();
for ( ; wkbIt != mCurrentWKBFragments.constBegin()->constEnd(); ++wkbIt ) for ( ; wkbIt != mCurrentWKBFragments.constBegin()->constEnd(); ++wkbIt )
@ -1758,18 +1821,18 @@ int QgsGmlStreamingParser::createMultiPointFromFragments()
} }
mCurrentWKBFragments.clear(); mCurrentWKBFragments.clear();
mWkbType = Qgis::WkbType::MultiPoint; mWkbType = mDimension > 2 ? Qgis::WkbType::MultiPointZ : Qgis::WkbType::MultiPoint;
return 0; return 0;
} }
int QgsGmlStreamingParser::createPolygonFromFragments() int QgsGmlStreamingParser::createPolygonFromFragments()
{ {
const int size = 1 + 2 * sizeof( int ) + totalWKBFragmentSize(); const int size = 1 + ( mDimension > 2 ? mDimension : 2 ) * static_cast<int>( sizeof( int ) ) + totalWKBFragmentSize();
mCurrentWKB = QByteArray( size, Qt::Uninitialized ); mCurrentWKB = QByteArray( size, Qt::Uninitialized );
QgsWkbPtr wkbPtr( mCurrentWKB ); QgsWkbPtr wkbPtr( mCurrentWKB );
wkbPtr << mEndian << Qgis::WkbType::Polygon << mCurrentWKBFragments.constBegin()->size(); wkbPtr << mEndian << ( mDimension > 2 ? Qgis::WkbType::PolygonZ : Qgis::WkbType::Polygon ) << mCurrentWKBFragments.constBegin()->size();
auto wkbIt = mCurrentWKBFragments.constBegin()->constBegin(); auto wkbIt = mCurrentWKBFragments.constBegin()->constBegin();
for ( ; wkbIt != mCurrentWKBFragments.constBegin()->constEnd(); ++wkbIt ) for ( ; wkbIt != mCurrentWKBFragments.constBegin()->constEnd(); ++wkbIt )
@ -1779,21 +1842,21 @@ int QgsGmlStreamingParser::createPolygonFromFragments()
} }
mCurrentWKBFragments.clear(); mCurrentWKBFragments.clear();
mWkbType = Qgis::WkbType::Polygon; mWkbType = mDimension > 2 ? Qgis::WkbType::PolygonZ : Qgis::WkbType::Polygon;
return 0; return 0;
} }
int QgsGmlStreamingParser::createMultiPolygonFromFragments() int QgsGmlStreamingParser::createMultiPolygonFromFragments()
{ {
int size = 0; int size = 0;
size += 1 + 2 * sizeof( int ); size += 1 + ( mDimension > 2 ? mDimension : 2 ) * static_cast<int>( sizeof( int ) );
size += totalWKBFragmentSize(); size += totalWKBFragmentSize();
size += mCurrentWKBFragments.size() * ( 1 + 2 * sizeof( int ) ); //fragments are just the rings size += mCurrentWKBFragments.size() * ( 1 + ( mDimension > 2 ? mDimension : 2 ) * static_cast<int>( sizeof( int ) ) ); //fragments are just the rings
mCurrentWKB = QByteArray( size, Qt::Uninitialized ); mCurrentWKB = QByteArray( size, Qt::Uninitialized );
QgsWkbPtr wkbPtr( mCurrentWKB ); QgsWkbPtr wkbPtr( mCurrentWKB );
wkbPtr << ( char ) mEndian << Qgis::WkbType::MultiPolygon << mCurrentWKBFragments.size(); wkbPtr << ( char ) mEndian << ( mDimension > 2 ? Qgis::WkbType::MultiPolygonZ : Qgis::WkbType::MultiPolygon ) << mCurrentWKBFragments.size();
//have outer and inner iterators //have outer and inner iterators
auto outerWkbIt = mCurrentWKBFragments.constBegin(); auto outerWkbIt = mCurrentWKBFragments.constBegin();
@ -1801,7 +1864,7 @@ int QgsGmlStreamingParser::createMultiPolygonFromFragments()
for ( ; outerWkbIt != mCurrentWKBFragments.constEnd(); ++outerWkbIt ) for ( ; outerWkbIt != mCurrentWKBFragments.constEnd(); ++outerWkbIt )
{ {
//new polygon //new polygon
wkbPtr << ( char ) mEndian << Qgis::WkbType::Polygon << outerWkbIt->size(); wkbPtr << ( char ) mEndian << ( mDimension > 2 ? Qgis::WkbType::PolygonZ : Qgis::WkbType::Polygon ) << outerWkbIt->size();
auto innerWkbIt = outerWkbIt->constBegin(); auto innerWkbIt = outerWkbIt->constBegin();
for ( ; innerWkbIt != outerWkbIt->constEnd(); ++innerWkbIt ) for ( ; innerWkbIt != outerWkbIt->constEnd(); ++innerWkbIt )
@ -1812,7 +1875,7 @@ int QgsGmlStreamingParser::createMultiPolygonFromFragments()
} }
mCurrentWKBFragments.clear(); mCurrentWKBFragments.clear();
mWkbType = Qgis::WkbType::MultiPolygon; mWkbType = mDimension > 2 ? Qgis::WkbType::MultiPolygonZ : Qgis::WkbType::MultiPolygon;
return 0; return 0;
} }

View File

@ -230,9 +230,10 @@ class CORE_EXPORT QgsGmlStreamingParser
* Creates a set of points from a coordinate string. * Creates a set of points from a coordinate string.
* \param points list that will contain the created points * \param points list that will contain the created points
* \param coordString the text containing the coordinates * \param coordString the text containing the coordinates
* \param dimension number of dimensions determined from the coordinate string
* \returns 0 in case of success * \returns 0 in case of success
*/ */
int pointsFromCoordinateString( QList<QgsPointXY> &points, const QString &coordString ) const; int pointsFromCoordinateString( QList<QgsPoint> &points, const QString &coordString, int *dimension = nullptr ) const;
/** /**
* Creates a set of points from a gml:posList or gml:pos coordinate string. * Creates a set of points from a gml:posList or gml:pos coordinate string.
@ -241,12 +242,12 @@ class CORE_EXPORT QgsGmlStreamingParser
* \param dimension number of dimensions * \param dimension number of dimensions
* \returns 0 in case of success * \returns 0 in case of success
*/ */
int pointsFromPosListString( QList<QgsPointXY> &points, const QString &coordString, int dimension ) const; int pointsFromPosListString( QList<QgsPoint> &points, const QString &coordString, int dimension ) const;
int pointsFromString( QList<QgsPointXY> &points, const QString &coordString ) const; int pointsFromString( QList<QgsPoint> &points, const QString &coordString, int *dimension = nullptr ) const;
int getPointWKB( QByteArray &wkbPtr, const QgsPointXY & ) const; int getPointWKB( QByteArray &wkbPtr, const QgsPoint &, int dimension ) const;
int getLineWKB( QByteArray &wkbPtr, const QList<QgsPointXY> &lineCoordinates ) const; int getLineWKB( QByteArray &wkbPtr, const QList<QgsPoint> &lineCoordinates, int dimension ) const;
int getRingWKB( QByteArray &wkbPtr, const QList<QgsPointXY> &ringCoordinates ) const; int getRingWKB( QByteArray &wkbPtr, const QList<QgsPoint> &ringCoordinates, int dimension ) const;
/** /**
* Creates a multiline from the information in mCurrentWKBFragments and * Creates a multiline from the information in mCurrentWKBFragments and

View File

@ -2657,30 +2657,46 @@ bool QgsMapLayer::deleteStyleFromDatabase( const QString &styleId, QString &msgE
void QgsMapLayer::saveStyleToDatabase( const QString &name, const QString &description, void QgsMapLayer::saveStyleToDatabase( const QString &name, const QString &description,
bool useAsDefault, const QString &uiFileContent, QString &msgError, QgsMapLayer::StyleCategories categories ) bool useAsDefault, const QString &uiFileContent, QString &msgError, QgsMapLayer::StyleCategories categories )
{
saveStyleToDatabaseV2( name, description, useAsDefault, uiFileContent, msgError, categories );
}
QgsMapLayer::SaveStyleResults QgsMapLayer::saveStyleToDatabaseV2( const QString &name, const QString &description, bool useAsDefault, const QString &uiFileContent, QString &msgError, QgsMapLayer::StyleCategories categories )
{ {
QGIS_PROTECT_QOBJECT_THREAD_ACCESS QGIS_PROTECT_QOBJECT_THREAD_ACCESS
QgsMapLayer::SaveStyleResults results;
QString sldStyle, qmlStyle; QString sldStyle, qmlStyle;
QDomDocument qmlDocument; QDomDocument qmlDocument;
QgsReadWriteContext context; QgsReadWriteContext context;
exportNamedStyle( qmlDocument, msgError, context, categories ); exportNamedStyle( qmlDocument, msgError, context, categories );
if ( !msgError.isNull() ) if ( !msgError.isEmpty() )
{ {
return; results.setFlag( QgsMapLayer::SaveStyleResult::QmlGenerationFailed );
} }
else
{
qmlStyle = qmlDocument.toString(); qmlStyle = qmlDocument.toString();
}
QgsSldExportContext sldContext; QgsSldExportContext sldContext;
QDomDocument sldDocument = this->exportSldStyleV3( sldContext ); QDomDocument sldDocument = this->exportSldStyleV3( sldContext );
if ( !sldContext.errors().empty() ) if ( !sldContext.errors().empty() )
{ {
return; results.setFlag( QgsMapLayer::SaveStyleResult::SldGenerationFailed );
} }
else
{
sldStyle = sldDocument.toString(); sldStyle = sldDocument.toString();
}
QgsProviderRegistry::instance()->saveStyle( mProviderKey, if ( !QgsProviderRegistry::instance()->saveStyle( mProviderKey,
mDataSource, qmlStyle, sldStyle, name, mDataSource, qmlStyle, sldStyle, name, description, uiFileContent, useAsDefault, msgError ) )
description, uiFileContent, useAsDefault, msgError ); {
results.setFlag( QgsMapLayer::SaveStyleResult::DatabaseWriteFailed );
}
return results;
} }
QString QgsMapLayer::loadNamedStyle( const QString &theURI, bool &resultFlag, bool loadFromLocalDB, QgsMapLayer::StyleCategories categories, Qgis::LoadStyleFlags flags ) QString QgsMapLayer::loadNamedStyle( const QString &theURI, bool &resultFlag, bool loadFromLocalDB, QgsMapLayer::StyleCategories categories, Qgis::LoadStyleFlags flags )

View File

@ -758,7 +758,29 @@ class CORE_EXPORT QgsMapLayer : public QObject
virtual bool deleteStyleFromDatabase( const QString &styleId, QString &msgError SIP_OUT ); virtual bool deleteStyleFromDatabase( const QString &styleId, QString &msgError SIP_OUT );
/** /**
* Saves named and sld style of the layer to the style table in the db. * Results of saving styles to database.
*
* \since QGIS 4.0
*/
enum class SaveStyleResult SIP_ENUM_BASETYPE( IntFlag )
{
Success = 0, //!< Both QML and SLD formats were successfully written to the database.
QmlGenerationFailed = 1 << 0, //!< Generation of the QML failed, and was not written to the database.
SldGenerationFailed = 1 << 1, //!< Generation of the SLD failed, and was not written to the database.
DatabaseWriteFailed = 1 << 2, //!< An error occurred when attempting to write to the database.
};
Q_ENUM( SaveStyleResult )
/**
* Results of saving styles to database.
*
* \since QGIS 4.0
*/
Q_DECLARE_FLAGS( SaveStyleResults, SaveStyleResult )
Q_FLAG( SaveStyleResults )
/**
* Saves QML and SLD representations of the layer's style to a table in the database.
* \param name Style name * \param name Style name
* \param description A description of the style * \param description A description of the style
* \param useAsDefault Set to TRUE if style should be used as the default style for the layer * \param useAsDefault Set to TRUE if style should be used as the default style for the layer
@ -766,19 +788,37 @@ class CORE_EXPORT QgsMapLayer : public QObject
* \param msgError will be set to a descriptive error message if any occurs * \param msgError will be set to a descriptive error message if any occurs
* \param categories the style categories to be saved. * \param categories the style categories to be saved.
* *
*
* \note Prior to QGIS 3.24, this method would show a message box warning when a * \note Prior to QGIS 3.24, this method would show a message box warning when a
* style with the same \a styleName already existed to confirm replacing the style with the user. * style with the same \a styleName already existed to confirm replacing the style with the user.
* Since 3.24, calling this method will ALWAYS overwrite any existing style with the same name. * Since 3.24, calling this method will ALWAYS overwrite any existing style with the same name.
* Use QgsProviderRegistry::styleExists() to test in advance if a style already exists and handle this appropriately * Use QgsProviderRegistry::styleExists() to test in advance if a style already exists and handle this appropriately
* in your client code. * in your client code.
*
* \deprecated QGIS 4.0. Use saveStyleToDatabaseV2() instead.
*/ */
virtual void saveStyleToDatabase( const QString &name, const QString &description, Q_DECL_DEPRECATED virtual void saveStyleToDatabase( const QString &name, const QString &description,
bool useAsDefault, const QString &uiFileContent,
QString &msgError SIP_OUT,
QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories ) SIP_DEPRECATED;
/**
* Saves QML and SLD representations of the layer's style to a table in the database.
* \param name Style name
* \param description A description of the style
* \param useAsDefault Set to TRUE if style should be used as the default style for the layer
* \param uiFileContent
* \param msgError will be set to a descriptive error message if any occurs
* \param categories the style categories to be saved.
*
* \returns flags representing whether QML or SLD storing was successful
*
* \since QGIS 4.0
*/
QgsMapLayer::SaveStyleResults saveStyleToDatabaseV2( const QString &name, const QString &description,
bool useAsDefault, const QString &uiFileContent, bool useAsDefault, const QString &uiFileContent,
QString &msgError SIP_OUT, QString &msgError SIP_OUT,
QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories ); QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories );
// TODO QGIS 4.0 -- fix this. We incorrectly have a single boolean flag which in which false is used inconsistently for "a style WAS found but an error occurred loading it" vs "no style was found". // TODO QGIS 4.0 -- fix this. We incorrectly have a single boolean flag which in which false is used inconsistently for "a style WAS found but an error occurred loading it" vs "no style was found".
// The first (style found, error occurred loading it) should trigger a user-facing warning, whereas the second (no style found) isn't reflective of an error at all. // The first (style found, error occurred loading it) should trigger a user-facing warning, whereas the second (no style found) isn't reflective of an error at all.

View File

@ -26,6 +26,9 @@
#include "qgsexpressioncontextutils.h" #include "qgsexpressioncontextutils.h"
#include "qgslogger.h" #include "qgslogger.h"
#include "qgsstringutils.h" #include "qgsstringutils.h"
#include "qgsmultipolygon.h"
#include "qgspolygon.h"
#include "qgsogrutils.h"
#include <QColor> #include <QColor>
#include <QStringList> #include <QStringList>
@ -33,6 +36,9 @@
#include <QObject> #include <QObject>
#include <QRegularExpression> #include <QRegularExpression>
#include "ogr_api.h"
#ifndef Q_OS_WIN #ifndef Q_OS_WIN
#include <netinet/in.h> #include <netinet/in.h>
#else #else
@ -92,7 +98,7 @@ QgsGeometry QgsOgcUtils::geometryFromGML( const QDomNode &geometryNode, const Co
if ( !( geomType == QLatin1String( "Point" ) || geomType == QLatin1String( "LineString" ) || geomType == QLatin1String( "Polygon" ) || if ( !( geomType == QLatin1String( "Point" ) || geomType == QLatin1String( "LineString" ) || geomType == QLatin1String( "Polygon" ) ||
geomType == QLatin1String( "MultiPoint" ) || geomType == QLatin1String( "MultiLineString" ) || geomType == QLatin1String( "MultiPolygon" ) || geomType == QLatin1String( "MultiPoint" ) || geomType == QLatin1String( "MultiLineString" ) || geomType == QLatin1String( "MultiPolygon" ) ||
geomType == QLatin1String( "Box" ) || geomType == QLatin1String( "Envelope" ) ) ) geomType == QLatin1String( "Box" ) || geomType == QLatin1String( "Envelope" ) || geomType == QLatin1String( "MultiCurve" ) ) )
{ {
const QDomNode geometryChild = geometryNode.firstChild(); const QDomNode geometryChild = geometryNode.firstChild();
if ( geometryChild.isNull() ) if ( geometryChild.isNull() )
@ -105,7 +111,7 @@ QgsGeometry QgsOgcUtils::geometryFromGML( const QDomNode &geometryNode, const Co
if ( !( geomType == QLatin1String( "Point" ) || geomType == QLatin1String( "LineString" ) || geomType == QLatin1String( "Polygon" ) || if ( !( geomType == QLatin1String( "Point" ) || geomType == QLatin1String( "LineString" ) || geomType == QLatin1String( "Polygon" ) ||
geomType == QLatin1String( "MultiPoint" ) || geomType == QLatin1String( "MultiLineString" ) || geomType == QLatin1String( "MultiPolygon" ) || geomType == QLatin1String( "MultiPoint" ) || geomType == QLatin1String( "MultiLineString" ) || geomType == QLatin1String( "MultiPolygon" ) ||
geomType == QLatin1String( "Box" ) || geomType == QLatin1String( "Envelope" ) ) ) geomType == QLatin1String( "Box" ) || geomType == QLatin1String( "Envelope" ) || geomType == QLatin1String( "MultiCurve" ) ) )
return QgsGeometry(); return QgsGeometry();
if ( geomType == QLatin1String( "Point" ) ) if ( geomType == QLatin1String( "Point" ) )
@ -128,6 +134,10 @@ QgsGeometry QgsOgcUtils::geometryFromGML( const QDomNode &geometryNode, const Co
{ {
geometry = geometryFromGMLMultiLineString( geometryTypeElement ); geometry = geometryFromGMLMultiLineString( geometryTypeElement );
} }
else if ( geomType == QLatin1String( "MultiCurve" ) )
{
geometry = geometryFromGMLMultiCurve( geometryTypeElement );
}
else if ( geomType == QLatin1String( "MultiPolygon" ) ) else if ( geomType == QLatin1String( "MultiPolygon" ) )
{ {
geometry = geometryFromGMLMultiPolygon( geometryTypeElement ); geometry = geometryFromGMLMultiPolygon( geometryTypeElement );
@ -142,6 +152,7 @@ QgsGeometry QgsOgcUtils::geometryFromGML( const QDomNode &geometryNode, const Co
} }
else //unknown type else //unknown type
{ {
QgsDebugMsgLevel( QStringLiteral( "Unknown geometry type %1" ).arg( geomType ), 2 );
return geometry; return geometry;
} }
@ -208,7 +219,7 @@ QgsGeometry QgsOgcUtils::geometryFromGML( const QString &xmlString, const Contex
QgsGeometry QgsOgcUtils::geometryFromGMLPoint( const QDomElement &geometryElement ) QgsGeometry QgsOgcUtils::geometryFromGMLPoint( const QDomElement &geometryElement )
{ {
QgsPolylineXY pointCoordinate; QgsPolyline pointCoordinate;
const QDomNodeList coordList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) ); const QDomNodeList coordList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) );
if ( !coordList.isEmpty() ) if ( !coordList.isEmpty() )
@ -238,13 +249,14 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPoint( const QDomElement &geometryElemen
return QgsGeometry(); return QgsGeometry();
} }
QgsPolylineXY::const_iterator point_it = pointCoordinate.constBegin(); const bool hasZ { !std::isnan( pointCoordinate.first().z() ) };
char e = htonl( 1 ) != 1; QgsPolyline::const_iterator point_it = pointCoordinate.constBegin();
double x = point_it->x(); const char e = static_cast<char>( htonl( 1 ) != 1 );
double y = point_it->y(); const double x = point_it->x();
const int size = 1 + sizeof( int ) + 2 * sizeof( double ); const double y = point_it->y();
const int size = 1 + static_cast<int>( sizeof( int ) ) + ( hasZ ? 3 : 2 ) * static_cast<int>( sizeof( double ) );
Qgis::WkbType type = Qgis::WkbType::Point; const Qgis::WkbType type { hasZ ? Qgis::WkbType::PointZ : Qgis::WkbType::Point };
unsigned char *wkb = new unsigned char[size]; unsigned char *wkb = new unsigned char[size];
int wkbPosition = 0; //current offset from wkb beginning (in bytes) int wkbPosition = 0; //current offset from wkb beginning (in bytes)
@ -256,6 +268,13 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPoint( const QDomElement &geometryElemen
wkbPosition += sizeof( double ); wkbPosition += sizeof( double );
memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) ); memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) );
if ( hasZ )
{
wkbPosition += sizeof( double );
double z = point_it->z();
memcpy( &( wkb )[wkbPosition], &z, sizeof( double ) );
}
QgsGeometry g; QgsGeometry g;
g.fromWkb( wkb, size ); g.fromWkb( wkb, size );
return g; return g;
@ -263,7 +282,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPoint( const QDomElement &geometryElemen
QgsGeometry QgsOgcUtils::geometryFromGMLLineString( const QDomElement &geometryElement ) QgsGeometry QgsOgcUtils::geometryFromGMLLineString( const QDomElement &geometryElement )
{ {
QgsPolylineXY lineCoordinates; QgsPolyline lineCoordinates;
const QDomNodeList coordList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) ); const QDomNodeList coordList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) );
if ( !coordList.isEmpty() ) if ( !coordList.isEmpty() )
@ -288,10 +307,12 @@ QgsGeometry QgsOgcUtils::geometryFromGMLLineString( const QDomElement &geometryE
} }
} }
char e = htonl( 1 ) != 1; const bool hasZ { !std::isnan( lineCoordinates.first().z() ) };
const int size = 1 + 2 * sizeof( int ) + lineCoordinates.size() * 2 * sizeof( double );
Qgis::WkbType type = Qgis::WkbType::LineString; char e = static_cast<char>( htonl( 1 ) != 1 );
const int size = 1 + 2 * static_cast<int>( sizeof( int ) + lineCoordinates.size() ) * ( hasZ ? 3 : 2 ) * static_cast<int>( sizeof( double ) );
const Qgis::WkbType type{ hasZ ? Qgis::WkbType::LineStringZ : Qgis::WkbType::LineString };
unsigned char *wkb = new unsigned char[size]; unsigned char *wkb = new unsigned char[size];
int wkbPosition = 0; //current offset from wkb beginning (in bytes) int wkbPosition = 0; //current offset from wkb beginning (in bytes)
@ -306,7 +327,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLLineString( const QDomElement &geometryE
memcpy( &( wkb )[wkbPosition], &nPoints, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &nPoints, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
QgsPolylineXY::const_iterator iter; QgsPolyline::const_iterator iter;
for ( iter = lineCoordinates.constBegin(); iter != lineCoordinates.constEnd(); ++iter ) for ( iter = lineCoordinates.constBegin(); iter != lineCoordinates.constEnd(); ++iter )
{ {
x = iter->x(); x = iter->x();
@ -315,6 +336,14 @@ QgsGeometry QgsOgcUtils::geometryFromGMLLineString( const QDomElement &geometryE
wkbPosition += sizeof( double ); wkbPosition += sizeof( double );
memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) ); memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) );
wkbPosition += sizeof( double ); wkbPosition += sizeof( double );
if ( hasZ )
{
double z = iter->z();
memcpy( &( wkb )[wkbPosition], &z, sizeof( double ) );
wkbPosition += sizeof( double );
}
} }
QgsGeometry g; QgsGeometry g;
@ -325,10 +354,10 @@ QgsGeometry QgsOgcUtils::geometryFromGMLLineString( const QDomElement &geometryE
QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElement ) QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElement )
{ {
//read all the coordinates (as QgsPoint) into memory. Each linear ring has an entry in the vector //read all the coordinates (as QgsPoint) into memory. Each linear ring has an entry in the vector
QgsMultiPolylineXY ringCoordinates; QgsMultiPolyline ringCoordinates;
//read coordinates for outer boundary //read coordinates for outer boundary
QgsPolylineXY exteriorPointList; QgsPolyline exteriorPointList;
const QDomNodeList outerBoundaryList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "outerBoundaryIs" ) ); const QDomNodeList outerBoundaryList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "outerBoundaryIs" ) );
if ( !outerBoundaryList.isEmpty() ) //outer ring is necessary if ( !outerBoundaryList.isEmpty() ) //outer ring is necessary
{ {
@ -347,7 +376,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElem
const QDomNodeList innerBoundaryList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "innerBoundaryIs" ) ); const QDomNodeList innerBoundaryList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "innerBoundaryIs" ) );
for ( int i = 0; i < innerBoundaryList.size(); ++i ) for ( int i = 0; i < innerBoundaryList.size(); ++i )
{ {
QgsPolylineXY interiorPointList; QgsPolyline interiorPointList;
coordinatesElement = innerBoundaryList.at( i ).firstChild().firstChild().toElement(); coordinatesElement = innerBoundaryList.at( i ).firstChild().firstChild().toElement();
if ( coordinatesElement.isNull() ) if ( coordinatesElement.isNull() )
{ {
@ -383,7 +412,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElem
const QDomNodeList interiorList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "interior" ) ); const QDomNodeList interiorList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "interior" ) );
for ( int i = 0; i < interiorList.size(); ++i ) for ( int i = 0; i < interiorList.size(); ++i )
{ {
QgsPolylineXY interiorPointList; QgsPolyline interiorPointList;
const QDomElement posElement = interiorList.at( i ).firstChild().firstChild().toElement(); const QDomElement posElement = interiorList.at( i ).firstChild().firstChild().toElement();
if ( posElement.isNull() ) if ( posElement.isNull() )
{ {
@ -404,20 +433,23 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElem
return QgsGeometry(); return QgsGeometry();
int npoints = 0;//total number of points int npoints = 0;//total number of points
for ( QgsMultiPolylineXY::const_iterator it = ringCoordinates.constBegin(); it != ringCoordinates.constEnd(); ++it ) for ( QgsMultiPolyline::const_iterator it = ringCoordinates.constBegin(); it != ringCoordinates.constEnd(); ++it )
{ {
npoints += it->size(); npoints += it->size();
} }
const int size = 1 + 2 * sizeof( int ) + nrings * sizeof( int ) + 2 * npoints * sizeof( double );
Qgis::WkbType type = Qgis::WkbType::Polygon; const bool hasZ { !std::isnan( ringCoordinates.first().first().z() ) };
const int size = 1 + 2 * static_cast<int>( sizeof( int ) ) + nrings * static_cast<int>( sizeof( int ) ) + ( hasZ ? 3 : 2 ) * npoints * static_cast<int>( sizeof( double ) );
const Qgis::WkbType type { hasZ ? Qgis::WkbType::PolygonZ : Qgis::WkbType::Polygon };
unsigned char *wkb = new unsigned char[size]; unsigned char *wkb = new unsigned char[size];
//char e = QgsApplication::endian(); //char e = QgsApplication::endian();
char e = htonl( 1 ) != 1; char e = static_cast<char>( htonl( 1 ) != 1 );
int wkbPosition = 0; //current offset from wkb beginning (in bytes) int wkbPosition = 0; //current offset from wkb beginning (in bytes)
int nPointsInRing = 0; int nPointsInRing = 0;
double x, y; double x, y, z;
//fill the contents into *wkb //fill the contents into *wkb
memcpy( &( wkb )[wkbPosition], &e, 1 ); memcpy( &( wkb )[wkbPosition], &e, 1 );
@ -426,13 +458,13 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElem
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
memcpy( &( wkb )[wkbPosition], &nrings, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &nrings, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
for ( QgsMultiPolylineXY::const_iterator it = ringCoordinates.constBegin(); it != ringCoordinates.constEnd(); ++it ) for ( QgsMultiPolyline::const_iterator it = ringCoordinates.constBegin(); it != ringCoordinates.constEnd(); ++it )
{ {
nPointsInRing = it->size(); nPointsInRing = it->size();
memcpy( &( wkb )[wkbPosition], &nPointsInRing, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &nPointsInRing, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
//iterate through the string list converting the strings to x-/y- doubles //iterate through the string list converting the strings to x-/y- doubles
QgsPolylineXY::const_iterator iter; QgsPolyline::const_iterator iter;
for ( iter = it->begin(); iter != it->end(); ++iter ) for ( iter = it->begin(); iter != it->end(); ++iter )
{ {
x = iter->x(); x = iter->x();
@ -442,6 +474,13 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElem
wkbPosition += sizeof( double ); wkbPosition += sizeof( double );
memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) ); memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) );
wkbPosition += sizeof( double ); wkbPosition += sizeof( double );
if ( hasZ )
{
z = iter->z();
memcpy( &( wkb )[wkbPosition], &z, sizeof( double ) );
wkbPosition += sizeof( double );
}
} }
} }
@ -452,8 +491,8 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElem
QgsGeometry QgsOgcUtils::geometryFromGMLMultiPoint( const QDomElement &geometryElement ) QgsGeometry QgsOgcUtils::geometryFromGMLMultiPoint( const QDomElement &geometryElement )
{ {
QgsPolylineXY pointList; QgsPolyline pointList;
QgsPolylineXY currentPoint; QgsPolyline currentPoint;
const QDomNodeList pointMemberList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "pointMember" ) ); const QDomNodeList pointMemberList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "pointMember" ) );
if ( pointMemberList.size() < 1 ) if ( pointMemberList.size() < 1 )
{ {
@ -512,28 +551,30 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPoint( const QDomElement &geometryE
if ( nPoints < 1 ) if ( nPoints < 1 )
return QgsGeometry(); return QgsGeometry();
//calculate the required wkb size const bool hasZ { !std::isnan( pointList.first().z() ) };
const int size = 1 + 2 * sizeof( int ) + pointList.size() * ( 2 * sizeof( double ) + 1 + sizeof( int ) );
Qgis::WkbType type = Qgis::WkbType::MultiPoint; //calculate the required wkb size
const int size = 1 + 2 * static_cast<int>( sizeof( int ) ) + static_cast<int>( pointList.size() ) * ( ( hasZ ? 3 : 2 ) * static_cast<int>( sizeof( double ) ) + 1 + static_cast<int>( sizeof( int ) ) );
const Qgis::WkbType type { hasZ ? Qgis::WkbType::MultiPointZ : Qgis::WkbType::MultiPoint };
unsigned char *wkb = new unsigned char[size]; unsigned char *wkb = new unsigned char[size];
//fill the wkb content //fill the wkb content
char e = htonl( 1 ) != 1; char e = static_cast<char>( htonl( 1 ) != 1 );
int wkbPosition = 0; //current offset from wkb beginning (in bytes) int wkbPosition = 0; //current offset from wkb beginning (in bytes)
double x, y; double x, y, z;
memcpy( &( wkb )[wkbPosition], &e, 1 ); memcpy( &( wkb )[wkbPosition], &e, 1 );
wkbPosition += 1; wkbPosition += 1;
memcpy( &( wkb )[wkbPosition], &type, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &type, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
memcpy( &( wkb )[wkbPosition], &nPoints, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &nPoints, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
type = Qgis::WkbType::Point; const Qgis::WkbType pointType { hasZ ? Qgis::WkbType::PointZ : Qgis::WkbType::Point };
for ( QgsPolylineXY::const_iterator it = pointList.constBegin(); it != pointList.constEnd(); ++it ) for ( QgsPolyline::const_iterator it = pointList.constBegin(); it != pointList.constEnd(); ++it )
{ {
memcpy( &( wkb )[wkbPosition], &e, 1 ); memcpy( &( wkb )[wkbPosition], &e, 1 );
wkbPosition += 1; wkbPosition += 1;
memcpy( &( wkb )[wkbPosition], &type, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &pointType, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
x = it->x(); x = it->x();
memcpy( &( wkb )[wkbPosition], &x, sizeof( double ) ); memcpy( &( wkb )[wkbPosition], &x, sizeof( double ) );
@ -541,6 +582,13 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPoint( const QDomElement &geometryE
y = it->y(); y = it->y();
memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) ); memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) );
wkbPosition += sizeof( double ); wkbPosition += sizeof( double );
if ( hasZ )
{
z = it->z();
memcpy( &( wkb )[wkbPosition], &z, sizeof( double ) );
wkbPosition += sizeof( double );
}
} }
QgsGeometry g; QgsGeometry g;
@ -559,7 +607,8 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
//<gml:MultiLineString //<gml:MultiLineString
//<gml:LineString //<gml:LineString
QList< QgsPolylineXY > lineCoordinates; //first list: lines, second list: points of one line
QList< QgsPolyline > lineCoordinates; //first list: lines, second list: points of one line
QDomElement currentLineStringElement; QDomElement currentLineStringElement;
QDomNodeList currentCoordList; QDomNodeList currentCoordList;
QDomNodeList currentPosList; QDomNodeList currentPosList;
@ -578,7 +627,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
currentCoordList = currentLineStringElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) ); currentCoordList = currentLineStringElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) );
if ( !currentCoordList.isEmpty() ) if ( !currentCoordList.isEmpty() )
{ {
QgsPolylineXY currentPointList; QgsPolyline currentPointList;
if ( readGMLCoordinates( currentPointList, currentCoordList.at( 0 ).toElement() ) != 0 ) if ( readGMLCoordinates( currentPointList, currentCoordList.at( 0 ).toElement() ) != 0 )
{ {
return QgsGeometry(); return QgsGeometry();
@ -592,7 +641,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
{ {
return QgsGeometry(); return QgsGeometry();
} }
QgsPolylineXY currentPointList; QgsPolyline currentPointList;
if ( readGMLPositions( currentPointList, currentPosList.at( 0 ).toElement() ) != 0 ) if ( readGMLPositions( currentPointList, currentPosList.at( 0 ).toElement() ) != 0 )
{ {
return QgsGeometry(); return QgsGeometry();
@ -612,7 +661,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
currentCoordList = currentLineStringElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) ); currentCoordList = currentLineStringElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) );
if ( !currentCoordList.isEmpty() ) if ( !currentCoordList.isEmpty() )
{ {
QgsPolylineXY currentPointList; QgsPolyline currentPointList;
if ( readGMLCoordinates( currentPointList, currentCoordList.at( 0 ).toElement() ) != 0 ) if ( readGMLCoordinates( currentPointList, currentCoordList.at( 0 ).toElement() ) != 0 )
{ {
return QgsGeometry(); return QgsGeometry();
@ -627,7 +676,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
{ {
return QgsGeometry(); return QgsGeometry();
} }
QgsPolylineXY currentPointList; QgsPolyline currentPointList;
if ( readGMLPositions( currentPointList, currentPosList.at( 0 ).toElement() ) != 0 ) if ( readGMLPositions( currentPointList, currentPosList.at( 0 ).toElement() ) != 0 )
{ {
return QgsGeometry(); return QgsGeometry();
@ -646,38 +695,41 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
if ( nLines < 1 ) if ( nLines < 1 )
return QgsGeometry(); return QgsGeometry();
const bool hasZ { !std::isnan( lineCoordinates.first().first().z() ) };
const int coordSize { hasZ ? 3 : 2 };
//calculate the required wkb size //calculate the required wkb size
int size = ( lineCoordinates.size() + 1 ) * ( 1 + 2 * sizeof( int ) ); int size = static_cast<int>( lineCoordinates.size() + 1 ) * ( 1 + 2 * sizeof( int ) );
for ( QList< QgsPolylineXY >::const_iterator it = lineCoordinates.constBegin(); it != lineCoordinates.constEnd(); ++it ) for ( QList< QgsPolyline >::const_iterator it = lineCoordinates.constBegin(); it != lineCoordinates.constEnd(); ++it )
{ {
size += it->size() * 2 * sizeof( double ); size += it->size() * coordSize * sizeof( double );
} }
Qgis::WkbType type = Qgis::WkbType::MultiLineString; const Qgis::WkbType type { hasZ ? Qgis::WkbType::MultiLineStringZ : Qgis::WkbType::MultiLineString };
unsigned char *wkb = new unsigned char[size]; unsigned char *wkb = new unsigned char[size];
//fill the wkb content //fill the wkb content
char e = htonl( 1 ) != 1; char e = static_cast<char>( htonl( 1 ) != 1 );
int wkbPosition = 0; //current offset from wkb beginning (in bytes) int wkbPosition = 0; //current offset from wkb beginning (in bytes)
int nPoints; //number of points in a line int nPoints; //number of points in a line
double x, y; double x, y, z;
memcpy( &( wkb )[wkbPosition], &e, 1 ); memcpy( &( wkb )[wkbPosition], &e, 1 );
wkbPosition += 1; wkbPosition += 1;
memcpy( &( wkb )[wkbPosition], &type, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &type, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
memcpy( &( wkb )[wkbPosition], &nLines, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &nLines, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
type = Qgis::WkbType::LineString; const Qgis::WkbType lineType { hasZ ? Qgis::WkbType::LineStringZ : Qgis::WkbType::LineString };
for ( QList< QgsPolylineXY >::const_iterator it = lineCoordinates.constBegin(); it != lineCoordinates.constEnd(); ++it ) for ( QList< QgsPolyline >::const_iterator it = lineCoordinates.constBegin(); it != lineCoordinates.constEnd(); ++it )
{ {
memcpy( &( wkb )[wkbPosition], &e, 1 ); memcpy( &( wkb )[wkbPosition], &e, 1 );
wkbPosition += 1; wkbPosition += 1;
memcpy( &( wkb )[wkbPosition], &type, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &lineType, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
nPoints = it->size(); nPoints = it->size();
memcpy( &( wkb )[wkbPosition], &nPoints, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &nPoints, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
for ( QgsPolylineXY::const_iterator iter = it->begin(); iter != it->end(); ++iter ) for ( QgsPolyline::const_iterator iter = it->begin(); iter != it->end(); ++iter )
{ {
x = iter->x(); x = iter->x();
y = iter->y(); y = iter->y();
@ -686,6 +738,13 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
wkbPosition += sizeof( double ); wkbPosition += sizeof( double );
memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) ); memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) );
wkbPosition += sizeof( double ); wkbPosition += sizeof( double );
if ( hasZ )
{
z = iter->z();
memcpy( &( wkb )[wkbPosition], &z, sizeof( double ) );
wkbPosition += sizeof( double );
}
} }
} }
@ -697,21 +756,19 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometryElement ) QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometryElement )
{ {
//first list: different polygons, second list: different rings, third list: different points //first list: different polygons, second list: different rings, third list: different points
QgsMultiPolygonXY multiPolygonPoints; QVector<QgsMultiPolyline> multiPolygonPoints;
QDomElement currentPolygonMemberElement; QDomElement currentPolygonMemberElement;
QDomNodeList polygonList; QDomNodeList polygonList;
QDomElement currentPolygonElement; QDomElement currentPolygonElement;
// rings in GML2 // rings in GML2
QDomNodeList outerBoundaryList; QDomNodeList outerBoundaryList;
QDomElement currentOuterBoundaryElement; QDomElement currentOuterBoundaryElement;
const QDomNodeList innerBoundaryList;
QDomElement currentInnerBoundaryElement; QDomElement currentInnerBoundaryElement;
// rings in GML3 // rings in GML3
QDomNodeList exteriorList; QDomNodeList exteriorList;
QDomElement currentExteriorElement; QDomElement currentExteriorElement;
QDomElement currentInteriorElement; QDomElement currentInteriorElement;
const QDomNodeList interiorList; // linear ring
// lienar ring
QDomNodeList linearRingNodeList; QDomNodeList linearRingNodeList;
QDomElement currentLinearRingElement; QDomElement currentLinearRingElement;
// Coordinates or position list // Coordinates or position list
@ -719,7 +776,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
QDomNodeList currentPosList; QDomNodeList currentPosList;
const QDomNodeList polygonMemberList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "polygonMember" ) ); const QDomNodeList polygonMemberList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "polygonMember" ) );
QgsPolygonXY currentPolygonList; QgsMultiPolyline currentPolygonList;
for ( int i = 0; i < polygonMemberList.size(); ++i ) for ( int i = 0; i < polygonMemberList.size(); ++i )
{ {
currentPolygonList.resize( 0 ); // preserve capacity - don't use clear currentPolygonList.resize( 0 ); // preserve capacity - don't use clear
@ -736,7 +793,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
if ( !outerBoundaryList.isEmpty() ) if ( !outerBoundaryList.isEmpty() )
{ {
currentOuterBoundaryElement = outerBoundaryList.at( 0 ).toElement(); currentOuterBoundaryElement = outerBoundaryList.at( 0 ).toElement();
QgsPolylineXY ringCoordinates; QgsPolyline ringCoordinates;
linearRingNodeList = currentOuterBoundaryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) ); linearRingNodeList = currentOuterBoundaryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) );
if ( linearRingNodeList.size() < 1 ) if ( linearRingNodeList.size() < 1 )
@ -759,7 +816,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
const QDomNodeList innerBoundaryList = currentPolygonElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "innerBoundaryIs" ) ); const QDomNodeList innerBoundaryList = currentPolygonElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "innerBoundaryIs" ) );
for ( int j = 0; j < innerBoundaryList.size(); ++j ) for ( int j = 0; j < innerBoundaryList.size(); ++j )
{ {
QgsPolylineXY ringCoordinates; QgsPolyline ringCoordinates;
currentInnerBoundaryElement = innerBoundaryList.at( j ).toElement(); currentInnerBoundaryElement = innerBoundaryList.at( j ).toElement();
linearRingNodeList = currentInnerBoundaryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) ); linearRingNodeList = currentInnerBoundaryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) );
if ( linearRingNodeList.size() < 1 ) if ( linearRingNodeList.size() < 1 )
@ -789,7 +846,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
} }
currentExteriorElement = exteriorList.at( 0 ).toElement(); currentExteriorElement = exteriorList.at( 0 ).toElement();
QgsPolylineXY ringPositions; QgsPolyline ringPositions;
linearRingNodeList = currentExteriorElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) ); linearRingNodeList = currentExteriorElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) );
if ( linearRingNodeList.size() < 1 ) if ( linearRingNodeList.size() < 1 )
@ -812,7 +869,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
const QDomNodeList interiorList = currentPolygonElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "interior" ) ); const QDomNodeList interiorList = currentPolygonElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "interior" ) );
for ( int j = 0; j < interiorList.size(); ++j ) for ( int j = 0; j < interiorList.size(); ++j )
{ {
QgsPolylineXY ringPositions; QgsPolyline ringPositions;
currentInteriorElement = interiorList.at( j ).toElement(); currentInteriorElement = interiorList.at( j ).toElement();
linearRingNodeList = currentInteriorElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) ); linearRingNodeList = currentInteriorElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) );
if ( linearRingNodeList.size() < 1 ) if ( linearRingNodeList.size() < 1 )
@ -839,21 +896,24 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
if ( nPolygons < 1 ) if ( nPolygons < 1 )
return QgsGeometry(); return QgsGeometry();
const bool hasZ { !std::isnan( multiPolygonPoints.first().first().first().z() ) };
int size = 1 + 2 * sizeof( int ); int size = 1 + 2 * sizeof( int );
//calculate the wkb size //calculate the wkb size
for ( QgsMultiPolygonXY::const_iterator it = multiPolygonPoints.constBegin(); it != multiPolygonPoints.constEnd(); ++it )
for ( auto it = multiPolygonPoints.constBegin(); it != multiPolygonPoints.constEnd(); ++it )
{ {
size += 1 + 2 * sizeof( int ); size += 1 + 2 * sizeof( int );
for ( QgsPolygonXY::const_iterator iter = it->begin(); iter != it->end(); ++iter ) for ( auto iter = it->begin(); iter != it->end(); ++iter )
{ {
size += sizeof( int ) + 2 * iter->size() * sizeof( double ); size += static_cast<int>( sizeof( int ) ) + ( hasZ ? 3 : 2 ) * static_cast<int>( iter->size() * sizeof( double ) );
} }
} }
Qgis::WkbType type = Qgis::WkbType::MultiPolygon; Qgis::WkbType type = hasZ ? Qgis::WkbType::MultiPolygonZ : Qgis::WkbType::MultiPolygon;
unsigned char *wkb = new unsigned char[size]; unsigned char *wkb = new unsigned char[size];
char e = htonl( 1 ) != 1; char e = static_cast<char>( htonl( 1 ) != 1 );
int wkbPosition = 0; //current offset from wkb beginning (in bytes) int wkbPosition = 0; //current offset from wkb beginning (in bytes)
double x, y; double x, y;
int nRings; int nRings;
@ -867,9 +927,9 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
memcpy( &( wkb )[wkbPosition], &nPolygons, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &nPolygons, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
type = Qgis::WkbType::Polygon; type = hasZ ? Qgis::WkbType::PolygonZ : Qgis::WkbType::Polygon;
for ( QgsMultiPolygonXY::const_iterator it = multiPolygonPoints.constBegin(); it != multiPolygonPoints.constEnd(); ++it ) for ( auto it = multiPolygonPoints.constBegin(); it != multiPolygonPoints.constEnd(); ++it )
{ {
memcpy( &( wkb )[wkbPosition], &e, 1 ); memcpy( &( wkb )[wkbPosition], &e, 1 );
wkbPosition += 1; wkbPosition += 1;
@ -878,12 +938,12 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
nRings = it->size(); nRings = it->size();
memcpy( &( wkb )[wkbPosition], &nRings, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &nRings, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
for ( QgsPolygonXY::const_iterator iter = it->begin(); iter != it->end(); ++iter ) for ( auto iter = it->begin(); iter != it->end(); ++iter )
{ {
nPointsInRing = iter->size(); nPointsInRing = iter->size();
memcpy( &( wkb )[wkbPosition], &nPointsInRing, sizeof( int ) ); memcpy( &( wkb )[wkbPosition], &nPointsInRing, sizeof( int ) );
wkbPosition += sizeof( int ); wkbPosition += sizeof( int );
for ( QgsPolylineXY::const_iterator iterator = iter->begin(); iterator != iter->end(); ++iterator ) for ( auto iterator = iter->begin(); iterator != iter->end(); ++iterator )
{ {
x = iterator->x(); x = iterator->x();
y = iterator->y(); y = iterator->y();
@ -891,6 +951,12 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
wkbPosition += sizeof( double ); wkbPosition += sizeof( double );
memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) ); memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) );
wkbPosition += sizeof( double ); wkbPosition += sizeof( double );
if ( hasZ )
{
double z = iterator->z();
memcpy( &( wkb )[wkbPosition], &z, sizeof( double ) );
wkbPosition += sizeof( double );
}
} }
} }
} }
@ -920,7 +986,7 @@ QDomElement QgsOgcUtils::filterElement( QDomDocument &doc, GMLVersion gmlVersion
} }
bool QgsOgcUtils::readGMLCoordinates( QgsPolylineXY &coords, const QDomElement &elem ) bool QgsOgcUtils::readGMLCoordinates( QgsPolyline &coords, const QDomElement &elem )
{ {
QString coordSeparator = QStringLiteral( "," ); QString coordSeparator = QStringLiteral( "," );
QString tupleSeparator = QStringLiteral( " " ); QString tupleSeparator = QStringLiteral( " " );
@ -939,7 +1005,7 @@ bool QgsOgcUtils::readGMLCoordinates( QgsPolylineXY &coords, const QDomElement &
const QStringList tupels = elem.text().split( tupleSeparator, Qt::SkipEmptyParts ); const QStringList tupels = elem.text().split( tupleSeparator, Qt::SkipEmptyParts );
QStringList tuple_coords; QStringList tuple_coords;
double x, y; double x, y, z;
bool conversionSuccess; bool conversionSuccess;
QStringList::const_iterator it; QStringList::const_iterator it;
@ -960,7 +1026,19 @@ bool QgsOgcUtils::readGMLCoordinates( QgsPolylineXY &coords, const QDomElement &
{ {
return true; return true;
} }
coords.push_back( QgsPointXY( x, y ) ); if ( tuple_coords.size() > 2 )
{
z = tuple_coords.at( 2 ).toDouble( &conversionSuccess );
if ( !conversionSuccess )
{
return true;
}
}
else
{
z = std::numeric_limits<double>::quiet_NaN();
}
coords.append( QgsPoint( x, y, z ) );
} }
return false; return false;
} }
@ -1001,12 +1079,12 @@ QgsRectangle QgsOgcUtils::rectangleFromGMLBox( const QDomNode &boxNode )
return rect; return rect;
} }
bool QgsOgcUtils::readGMLPositions( QgsPolylineXY &coords, const QDomElement &elem ) bool QgsOgcUtils::readGMLPositions( QgsPolyline &coords, const QDomElement &elem )
{ {
coords.clear(); coords.clear();
const QStringList pos = elem.text().split( ' ', Qt::SkipEmptyParts ); const QStringList pos = elem.text().split( ' ', Qt::SkipEmptyParts );
double x, y; double x, y, z;
bool conversionSuccess; bool conversionSuccess;
const int posSize = pos.size(); const int posSize = pos.size();
@ -1040,7 +1118,19 @@ bool QgsOgcUtils::readGMLPositions( QgsPolylineXY &coords, const QDomElement &el
{ {
return true; return true;
} }
coords.push_back( QgsPointXY( x, y ) ); if ( srsDimension > 2 )
{
z = pos.at( i * srsDimension + 2 ).toDouble( &conversionSuccess );
if ( !conversionSuccess )
{
return true;
}
}
else
{
z = std::numeric_limits<double>::quiet_NaN();
}
coords.append( QgsPoint( x, y, z ) );
} }
return false; return false;
} }
@ -1250,7 +1340,9 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
{ {
case Qgis::WkbType::Point25D: case Qgis::WkbType::Point25D:
case Qgis::WkbType::Point: case Qgis::WkbType::Point:
case Qgis::WkbType::PointZ:
case Qgis::WkbType::MultiPoint25D: case Qgis::WkbType::MultiPoint25D:
case Qgis::WkbType::MultiPointZ:
case Qgis::WkbType::MultiPoint: case Qgis::WkbType::MultiPoint:
baseCoordElem = doc.createElement( QStringLiteral( "gml:pos" ) ); baseCoordElem = doc.createElement( QStringLiteral( "gml:pos" ) );
break; break;
@ -1258,7 +1350,6 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
baseCoordElem = doc.createElement( QStringLiteral( "gml:posList" ) ); baseCoordElem = doc.createElement( QStringLiteral( "gml:posList" ) );
break; break;
} }
baseCoordElem.setAttribute( QStringLiteral( "srsDimension" ), QStringLiteral( "2" ) );
cs = ' '; cs = ' ';
} }
else else
@ -1273,6 +1364,10 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
switch ( geometry.wkbType() ) switch ( geometry.wkbType() )
{ {
case Qgis::WkbType::Point25D: case Qgis::WkbType::Point25D:
case Qgis::WkbType::PointZ:
hasZValue = true;
//intentional fall-through
[[fallthrough]];
case Qgis::WkbType::Point: case Qgis::WkbType::Point:
{ {
QDomElement pointElem = doc.createElement( QStringLiteral( "gml:Point" ) ); QDomElement pointElem = doc.createElement( QStringLiteral( "gml:Point" ) );
@ -1288,13 +1383,26 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
wkbPtr >> y >> x; wkbPtr >> y >> x;
else else
wkbPtr >> x >> y; wkbPtr >> x >> y;
const QDomText coordText = doc.createTextNode( qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision ) );
QString coordString = qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision );
// Add Z
if ( hasZValue && gmlVersion != GML_2_1_2 )
{
double z = 0;
wkbPtr >> z;
coordString += cs + qgsDoubleToString( z, precision );
}
const QDomText coordText = doc.createTextNode( coordString );
coordElem.appendChild( coordText ); coordElem.appendChild( coordText );
if ( gmlVersion != GML_2_1_2 )
coordElem.setAttribute( QStringLiteral( "srsDimension" ), hasZValue ? QStringLiteral( "3" ) : QStringLiteral( "2" ) );
pointElem.appendChild( coordElem ); pointElem.appendChild( coordElem );
return pointElem; return pointElem;
} }
case Qgis::WkbType::MultiPoint25D: case Qgis::WkbType::MultiPoint25D:
case Qgis::WkbType::MultiPointZ:
hasZValue = true; hasZValue = true;
//intentional fall-through //intentional fall-through
[[fallthrough]]; [[fallthrough]];
@ -1325,21 +1433,38 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
wkbPtr >> y >> x; wkbPtr >> y >> x;
else else
wkbPtr >> x >> y; wkbPtr >> x >> y;
const QDomText coordText = doc.createTextNode( qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision ) );
coordElem.appendChild( coordText );
pointElem.appendChild( coordElem );
QString coordString = qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision );
// Add Z
if ( hasZValue ) if ( hasZValue )
{
if ( gmlVersion != GML_2_1_2 )
{
double z = 0;
wkbPtr >> z;
coordString += cs + qgsDoubleToString( z, precision );
}
else
{ {
wkbPtr += sizeof( double ); wkbPtr += sizeof( double );
} }
}
const QDomText coordText = doc.createTextNode( coordString );
coordElem.appendChild( coordText );
if ( gmlVersion != GML_2_1_2 )
coordElem.setAttribute( QStringLiteral( "srsDimension" ), hasZValue ? QStringLiteral( "3" ) : QStringLiteral( "2" ) );
pointElem.appendChild( coordElem );
pointMemberElem.appendChild( pointElem ); pointMemberElem.appendChild( pointElem );
multiPointElem.appendChild( pointMemberElem ); multiPointElem.appendChild( pointMemberElem );
} }
return multiPointElem; return multiPointElem;
} }
case Qgis::WkbType::LineString25D: case Qgis::WkbType::LineString25D:
case Qgis::WkbType::LineStringZ:
hasZValue = true; hasZValue = true;
//intentional fall-through //intentional fall-through
[[fallthrough]]; [[fallthrough]];
@ -1373,16 +1498,29 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
coordString += qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision ); coordString += qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision );
if ( hasZValue ) if ( hasZValue )
{
if ( gmlVersion != GML_2_1_2 )
{
double z = 0;
wkbPtr >> z;
coordString += cs + qgsDoubleToString( z, precision );
}
else
{ {
wkbPtr += sizeof( double ); wkbPtr += sizeof( double );
} }
} }
}
const QDomText coordText = doc.createTextNode( coordString ); const QDomText coordText = doc.createTextNode( coordString );
coordElem.appendChild( coordText ); coordElem.appendChild( coordText );
if ( gmlVersion != GML_2_1_2 )
coordElem.setAttribute( QStringLiteral( "srsDimension" ), hasZValue ? QStringLiteral( "3" ) : QStringLiteral( "2" ) );
lineStringElem.appendChild( coordElem ); lineStringElem.appendChild( coordElem );
return lineStringElem; return lineStringElem;
} }
case Qgis::WkbType::MultiLineString25D: case Qgis::WkbType::MultiLineString25D:
case Qgis::WkbType::MultiLineStringZ:
hasZValue = true; hasZValue = true;
//intentional fall-through //intentional fall-through
[[fallthrough]]; [[fallthrough]];
@ -1428,12 +1566,23 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
coordString += qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision ); coordString += qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision );
if ( hasZValue ) if ( hasZValue )
{
if ( gmlVersion != GML_2_1_2 )
{
double z = 0;
wkbPtr >> z;
coordString += cs + qgsDoubleToString( z, precision );
}
else
{ {
wkbPtr += sizeof( double ); wkbPtr += sizeof( double );
} }
} }
}
const QDomText coordText = doc.createTextNode( coordString ); const QDomText coordText = doc.createTextNode( coordString );
coordElem.appendChild( coordText ); coordElem.appendChild( coordText );
if ( gmlVersion != GML_2_1_2 )
coordElem.setAttribute( QStringLiteral( "srsDimension" ), hasZValue ? QStringLiteral( "3" ) : QStringLiteral( "2" ) );
lineStringElem.appendChild( coordElem ); lineStringElem.appendChild( coordElem );
lineStringMemberElem.appendChild( lineStringElem ); lineStringMemberElem.appendChild( lineStringElem );
multiLineStringElem.appendChild( lineStringMemberElem ); multiLineStringElem.appendChild( lineStringMemberElem );
@ -1441,6 +1590,7 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
return multiLineStringElem; return multiLineStringElem;
} }
case Qgis::WkbType::Polygon25D: case Qgis::WkbType::Polygon25D:
case Qgis::WkbType::PolygonZ:
hasZValue = true; hasZValue = true;
//intentional fall-through //intentional fall-through
[[fallthrough]]; [[fallthrough]];
@ -1489,20 +1639,35 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
wkbPtr >> x >> y; wkbPtr >> x >> y;
coordString += qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision ); coordString += qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision );
if ( hasZValue ) if ( hasZValue )
{
if ( gmlVersion != GML_2_1_2 )
{
// Add Z
double z = 0;
wkbPtr >> z;
coordString += cs + qgsDoubleToString( z, precision );
}
else
{ {
wkbPtr += sizeof( double ); wkbPtr += sizeof( double );
} }
} }
}
const QDomText coordText = doc.createTextNode( coordString ); const QDomText coordText = doc.createTextNode( coordString );
coordElem.appendChild( coordText ); coordElem.appendChild( coordText );
if ( gmlVersion != GML_2_1_2 )
coordElem.setAttribute( QStringLiteral( "srsDimension" ), hasZValue ? QStringLiteral( "3" ) : QStringLiteral( "2" ) );
ringElem.appendChild( coordElem ); ringElem.appendChild( coordElem );
boundaryElem.appendChild( ringElem ); boundaryElem.appendChild( ringElem );
polygonElem.appendChild( boundaryElem ); polygonElem.appendChild( boundaryElem );
} }
return polygonElem; return polygonElem;
} }
case Qgis::WkbType::MultiPolygon25D: case Qgis::WkbType::MultiPolygon25D:
case Qgis::WkbType::MultiPolygonZ:
hasZValue = true; hasZValue = true;
//intentional fall-through //intentional fall-through
[[fallthrough]]; [[fallthrough]];
@ -1561,12 +1726,25 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
coordString += qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision ); coordString += qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision );
if ( hasZValue ) if ( hasZValue )
{
if ( gmlVersion != GML_2_1_2 )
{
// Add Z
double z = 0;
wkbPtr >> z;
coordString += cs + qgsDoubleToString( z, precision );
}
else
{ {
wkbPtr += sizeof( double ); wkbPtr += sizeof( double );
} }
} }
}
const QDomText coordText = doc.createTextNode( coordString ); const QDomText coordText = doc.createTextNode( coordString );
coordElem.appendChild( coordText ); coordElem.appendChild( coordText );
if ( gmlVersion != GML_2_1_2 )
coordElem.setAttribute( QStringLiteral( "srsDimension" ), hasZValue ? QStringLiteral( "3" ) : QStringLiteral( "2" ) );
ringElem.appendChild( coordElem ); ringElem.appendChild( coordElem );
boundaryElem.appendChild( ringElem ); boundaryElem.appendChild( ringElem );
polygonElem.appendChild( boundaryElem ); polygonElem.appendChild( boundaryElem );
@ -3823,3 +4001,17 @@ QgsOgcCrsUtils::CRSFlavor QgsOgcCrsUtils::parseCrsName( const QString &crsName,
return CRSFlavor::UNKNOWN; return CRSFlavor::UNKNOWN;
} }
QgsGeometry QgsOgcUtils::geometryFromGMLUsingGdal( const QDomElement &geometryElement )
{
QString gml;
QTextStream gmlStream( &gml );
geometryElement.save( gmlStream, 0 );
gdal::ogr_geometry_unique_ptr ogrGeom { OGR_G_CreateFromGML( gml.toUtf8().constData() ) };
return QgsOgrUtils::ogrGeometryToQgsGeometry( ogrGeom.get() );
}
QgsGeometry QgsOgcUtils::geometryFromGMLMultiCurve( const QDomElement &geometryElement )
{
return geometryFromGMLUsingGdal( geometryElement );
}

View File

@ -311,8 +311,12 @@ class CORE_EXPORT QgsOgcUtils
static QgsGeometry geometryFromGMLMultiPoint( const QDomElement &geometryElement ); static QgsGeometry geometryFromGMLMultiPoint( const QDomElement &geometryElement );
//! Static method that creates geometry from GML MultiLineString //! Static method that creates geometry from GML MultiLineString
static QgsGeometry geometryFromGMLMultiLineString( const QDomElement &geometryElement ); static QgsGeometry geometryFromGMLMultiLineString( const QDomElement &geometryElement );
//! Static method that creates geometry from GML MultiCurve
static QgsGeometry geometryFromGMLMultiCurve( const QDomElement &geometryElement );
//! Static method that creates geometry from GML MultiPolygon //! Static method that creates geometry from GML MultiPolygon
static QgsGeometry geometryFromGMLMultiPolygon( const QDomElement &geometryElement ); static QgsGeometry geometryFromGMLMultiPolygon( const QDomElement &geometryElement );
//! Static method that creates geometry from GML using GDAL GML parser
static QgsGeometry geometryFromGMLUsingGdal( const QDomElement &geometryElement );
/** /**
* Creates an empty \verbatim <Filter> \endverbatim QDomElement * Creates an empty \verbatim <Filter> \endverbatim QDomElement
@ -330,7 +334,7 @@ class CORE_EXPORT QgsOgcUtils
* \param elem the \verbatim <gml:coordinates> \endverbatim element * \param elem the \verbatim <gml:coordinates> \endverbatim element
* \returns boolean FALSE on success * \returns boolean FALSE on success
*/ */
static bool readGMLCoordinates( QgsPolylineXY &coords, const QDomElement &elem ); static bool readGMLCoordinates( QgsPolyline &coords, const QDomElement &elem );
/** /**
* Reads the \verbatim <gml:pos> \endverbatim or \verbatim <gml:posList> \endverbatim * Reads the \verbatim <gml:pos> \endverbatim or \verbatim <gml:posList> \endverbatim
@ -340,8 +344,7 @@ class CORE_EXPORT QgsOgcUtils
* \verbatim <gml:posList> \endverbatim element * \verbatim <gml:posList> \endverbatim element
* \returns boolean FALSE on success * \returns boolean FALSE on success
*/ */
static bool readGMLPositions( QgsPolylineXY &coords, const QDomElement &elem ); static bool readGMLPositions( QgsPolyline &coords, const QDomElement &elem );
/** /**
* Create a GML coordinates element from a point list. * Create a GML coordinates element from a point list.
@ -379,6 +382,8 @@ class CORE_EXPORT QgsOgcUtils
static QgsExpressionNodeBinaryOperator *nodePropertyIsNullFromOgcFilter( QDomElement &element, QString &errorMessage ); static QgsExpressionNodeBinaryOperator *nodePropertyIsNullFromOgcFilter( QDomElement &element, QString &errorMessage );
}; };
#ifndef SIP_RUN #ifndef SIP_RUN
/** /**

View File

@ -579,7 +579,7 @@ bool QgsTracer::initGraph()
mpl = noded.asMultiPolyline(); mpl = noded.asMultiPolyline();
} }
catch ( GEOSException &e ) catch ( QgsGeosException &e )
{ {
// no big deal... we will just not have nicely noded linework, potentially // no big deal... we will just not have nicely noded linework, potentially
// missing some intersections // missing some intersections

View File

@ -199,7 +199,7 @@ class CORE_EXPORT QgsTracer : public QObject
//! Extent for graph building (empty extent means no limit) //! Extent for graph building (empty extent means no limit)
QgsRectangle mExtent; QgsRectangle mExtent;
//! If FALSE, no vertices will be added on intersections unless they exist in the original layers //! If FALSE, no vertices will be added on intersections unless they exist in the original layers
bool mAddPointsOnIntersections = false; bool mAddPointsOnIntersections = true;
//! Holds the input layers' intersections. Only populated when mAddPointsOnIntersections == false //! Holds the input layers' intersections. Only populated when mAddPointsOnIntersections == false
QgsGeometry mIntersections; QgsGeometry mIntersections;

View File

@ -2162,6 +2162,33 @@ class QgsVectorFileWriterMetadataContainer
QString() // Default value QString() // Default value
) ); ) );
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,11,0)
datasetOptions.insert( QStringLiteral( "INSUNITS" ), new QgsVectorFileWriter::SetOption(
QObject::tr( "Drawing units for the model space ($INSUNITS system variable)." ),
QStringList()
<< QStringLiteral( "AUTO" )
<< QStringLiteral( "HEADER_VALUE" )
<< QStringLiteral( "UNITLESS" )
<< QStringLiteral( "INCHES" )
<< QStringLiteral( "FEET" )
<< QStringLiteral( "MILLIMETERS" )
<< QStringLiteral( "CENTIMETERS" )
<< QStringLiteral( "METERS" )
<< QStringLiteral( "US_SURVEY_FEET" ),
QStringLiteral( "AUTO" ) // Default value
) );
datasetOptions.insert( QStringLiteral( "MEASUREMENT" ), new QgsVectorFileWriter::SetOption(
QObject::tr( "Whether the current drawing uses imperial or metric hatch "
"pattern and linetype ($MEASUREMENT system variable)." ),
QStringList()
<< QStringLiteral( "HEADER_VALUE" )
<< QStringLiteral( "IMPERIAL" )
<< QStringLiteral( "METRIC" ),
QStringLiteral( "HEADER_VALUE" ) // Default value
) );
#endif
driverMetadata.insert( QStringLiteral( "DXF" ), driverMetadata.insert( QStringLiteral( "DXF" ),
QgsVectorFileWriter::MetaData( QgsVectorFileWriter::MetaData(
QStringLiteral( "AutoCAD DXF" ), QStringLiteral( "AutoCAD DXF" ),

View File

@ -113,10 +113,9 @@ QgsRasterBlock *QgsHueSaturationFilter::block( int bandNo, QgsRectangle const &
Q_UNUSED( bandNo ) Q_UNUSED( bandNo )
QgsDebugMsgLevel( QStringLiteral( "width = %1 height = %2 extent = %3" ).arg( width ).arg( height ).arg( extent.toString() ), 4 ); QgsDebugMsgLevel( QStringLiteral( "width = %1 height = %2 extent = %3" ).arg( width ).arg( height ).arg( extent.toString() ), 4 );
auto outputBlock = std::make_unique<QgsRasterBlock>();
if ( !mInput ) if ( !mInput )
{ {
return outputBlock.release(); return nullptr;
} }
// At this moment we know that we read rendered image // At this moment we know that we read rendered image
@ -125,7 +124,7 @@ QgsRasterBlock *QgsHueSaturationFilter::block( int bandNo, QgsRectangle const &
if ( !inputBlock || inputBlock->isEmpty() ) if ( !inputBlock || inputBlock->isEmpty() )
{ {
QgsDebugError( QStringLiteral( "No raster data!" ) ); QgsDebugError( QStringLiteral( "No raster data!" ) );
return outputBlock.release(); return nullptr;
} }
if ( !mInvertColors && mSaturation == 0 && mGrayscaleMode == GrayscaleOff && !mColorizeOn ) if ( !mInvertColors && mSaturation == 0 && mGrayscaleMode == GrayscaleOff && !mColorizeOn )
@ -134,37 +133,50 @@ QgsRasterBlock *QgsHueSaturationFilter::block( int bandNo, QgsRectangle const &
return inputBlock.release(); return inputBlock.release();
} }
auto outputBlock = std::make_unique<QgsRasterBlock>();
if ( !outputBlock->reset( Qgis::DataType::ARGB32_Premultiplied, width, height ) ) if ( !outputBlock->reset( Qgis::DataType::ARGB32_Premultiplied, width, height ) )
{ {
return outputBlock.release(); return nullptr;
} }
// adjust image // adjust image
QRgb myNoDataColor = qRgba( 0, 0, 0, 0 ); const QRgb myNoDataColor = qRgba( 0, 0, 0, 0 );
QRgb myRgb;
QColor myColor;
int h, s, l; int h, s, l;
int r, g, b, alpha; int r, g, b;
double alphaFactor = 1.0; double alphaFactor = 1.0;
for ( qgssize i = 0; i < ( qgssize )width * height; i++ ) const QRgb *inputColorData = inputBlock->colorData();
const int imageHeight = inputBlock->image().height();
const int imageWidth = inputBlock->image().width();
QRgb *outputColorData = outputBlock->colorData();
for ( int row = 0; row < height; ++row )
{ {
if ( inputBlock->color( i ) == myNoDataColor ) if ( feedback->isCanceled() )
return nullptr;
for ( int col = 0; col < width; ++col )
{ {
outputBlock->setColor( i, myNoDataColor ); const qgssize i = static_cast< qgssize >( row ) * width + static_cast< qgssize >( col );
if ( !inputColorData || row >= imageHeight || col >= imageWidth || inputColorData[i] == myNoDataColor )
{
outputColorData[i] = myNoDataColor;
continue; continue;
} }
myRgb = inputBlock->color( i ); const QRgb inputColor = inputColorData[i];
myColor = QColor( myRgb ); QColor myColor = QColor( inputColor );
// Alpha must be taken from QRgb, since conversion from QRgb->QColor loses alpha // Alpha must be taken from QRgb, since conversion from QRgb->QColor loses alpha
alpha = qAlpha( myRgb ); const int alpha = qAlpha( inputColor );
if ( alpha == 0 ) if ( alpha == 0 )
{ {
// totally transparent, no changes required // totally transparent, no changes required
outputBlock->setColor( i, myRgb ); outputColorData[i] = inputColor;
continue; continue;
} }
@ -214,7 +226,8 @@ QgsRasterBlock *QgsHueSaturationFilter::block( int bandNo, QgsRectangle const &
b *= alphaFactor; b *= alphaFactor;
} }
outputBlock->setColor( i, qRgba( r, g, b, alpha ) ); outputColorData[i] = qRgba( r, g, b, alpha );
}
} }
return outputBlock.release(); return outputBlock.release();

View File

@ -572,13 +572,22 @@ void QgsVectorLayer::selectByExpression( const QString &expression, Qgis::Select
defaultContext.emplace( QgsExpressionContextUtils::globalProjectLayerScopes( this ) ); defaultContext.emplace( QgsExpressionContextUtils::globalProjectLayerScopes( this ) );
context = &defaultContext.value(); context = &defaultContext.value();
} }
else
{
context->appendScope( QgsExpressionContextUtils::layerScope( this ) );
}
QgsExpression exp( expression );
exp.prepare( context );
if ( behavior == Qgis::SelectBehavior::SetSelection || behavior == Qgis::SelectBehavior::AddToSelection ) if ( behavior == Qgis::SelectBehavior::SetSelection || behavior == Qgis::SelectBehavior::AddToSelection )
{ {
QgsFeatureRequest request = QgsFeatureRequest().setFilterExpression( expression ) QgsFeatureRequest request = QgsFeatureRequest().setFilterExpression( expression )
.setExpressionContext( *context ) .setExpressionContext( *context );
.setFlags( Qgis::FeatureRequestFlag::NoGeometry ) request.setSubsetOfAttributes( exp.referencedColumns(), fields() );
.setNoAttributes();
if ( !exp.needsGeometry() )
request.setFlags( Qgis::FeatureRequestFlag::NoGeometry );
QgsFeatureIterator features = getFeatures( request ); QgsFeatureIterator features = getFeatures( request );
@ -595,8 +604,6 @@ void QgsVectorLayer::selectByExpression( const QString &expression, Qgis::Select
} }
else if ( behavior == Qgis::SelectBehavior::IntersectSelection || behavior == Qgis::SelectBehavior::RemoveFromSelection ) else if ( behavior == Qgis::SelectBehavior::IntersectSelection || behavior == Qgis::SelectBehavior::RemoveFromSelection )
{ {
QgsExpression exp( expression );
exp.prepare( context );
QgsFeatureIds oldSelection = selectedFeatureIds(); QgsFeatureIds oldSelection = selectedFeatureIds();
QgsFeatureRequest request = QgsFeatureRequest().setFilterFids( oldSelection ); QgsFeatureRequest request = QgsFeatureRequest().setFilterFids( oldSelection );

View File

@ -111,10 +111,21 @@ QgsLayoutMapWidget::QgsLayoutMapWidget( QgsLayoutItemMap *item, QgsMapCanvas *ma
mDockToolbar->setIconSize( QgsGuiUtils::iconSize( true ) ); mDockToolbar->setIconSize( QgsGuiUtils::iconSize( true ) );
mLayersMenu = new QMenu( this );
QToolButton *btnLayers = new QToolButton( this );
btnLayers->setAutoRaise( true );
btnLayers->setToolTip( tr( "Set Map Extent to Layer Extent" ) );
btnLayers->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionLayers.svg" ) ) );
btnLayers->setPopupMode( QToolButton::InstantPopup );
btnLayers->setMenu( mLayersMenu );
mDockToolbar->insertWidget( mActionMoveContent, btnLayers );
connect( mLayersMenu, &QMenu::aboutToShow, this, &QgsLayoutMapWidget::aboutToShowLayersMenu );
mBookmarkMenu = new QMenu( this ); mBookmarkMenu = new QMenu( this );
QToolButton *btnBookmarks = new QToolButton( this ); QToolButton *btnBookmarks = new QToolButton( this );
btnBookmarks->setAutoRaise( true ); btnBookmarks->setAutoRaise( true );
btnBookmarks->setToolTip( tr( "Bookmarks" ) ); btnBookmarks->setToolTip( tr( "Set Map Extent to Bookmark Extent" ) );
btnBookmarks->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionShowBookmarks.svg" ) ) ); btnBookmarks->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionShowBookmarks.svg" ) ) );
btnBookmarks->setPopupMode( QToolButton::InstantPopup ); btnBookmarks->setPopupMode( QToolButton::InstantPopup );
btnBookmarks->setMenu( mBookmarkMenu ); btnBookmarks->setMenu( mBookmarkMenu );
@ -459,6 +470,44 @@ void QgsLayoutMapWidget::switchToMoveContentTool()
mInterface->activateTool( QgsLayoutDesignerInterface::ToolMoveItemContent ); mInterface->activateTool( QgsLayoutDesignerInterface::ToolMoveItemContent );
} }
void QgsLayoutMapWidget::aboutToShowLayersMenu()
{
mLayersMenu->clear();
if ( !mMapLayerModel )
{
mMapLayerModel = new QgsMapLayerProxyModel( this );
mMapLayerModel->setFilters( Qgis::LayerFilter::SpatialLayer );
}
if ( mMapLayerModel->rowCount() == 0 )
{
QAction *action = new QAction( tr( "No spatial layers available" ) );
action->setEnabled( false );
mLayersMenu->addAction( action );
return;
}
for ( int i = 0; i < mMapLayerModel->rowCount(); ++i )
{
const QModelIndex index = mMapLayerModel->index( i, 0 );
const QIcon icon = qvariant_cast<QIcon>( mMapLayerModel->data( index, Qt::DecorationRole ) );
const QString text = mMapLayerModel->data( index, Qt::DisplayRole ).toString();
const QString tooltip = mMapLayerModel->data( index, Qt::ToolTipRole ).toString();
const QString layerId = mMapLayerModel->data( index, static_cast<int>( QgsMapLayerModel::CustomRole::LayerId ) ).toString();
QAction *action = new QAction( icon, text, mLayersMenu );
action->setToolTip( tooltip );
connect( action, &QAction::triggered, this, [this, layerId] {
if ( QgsMapLayer *layer = QgsProject::instance()->mapLayer( layerId ) )
{
setToCustomExtent( QgsReferencedRectangle( layer->extent(), layer->crs() ) );
}
} );
mLayersMenu->addAction( action );
}
}
void QgsLayoutMapWidget::aboutToShowBookmarkMenu() void QgsLayoutMapWidget::aboutToShowBookmarkMenu()
{ {
mBookmarkMenu->clear(); mBookmarkMenu->clear();
@ -466,7 +515,17 @@ void QgsLayoutMapWidget::aboutToShowBookmarkMenu()
// query the bookmarks now? or once during widget creation... Hmm. Either way, there's potentially a // query the bookmarks now? or once during widget creation... Hmm. Either way, there's potentially a
// delay if there's LOTS of bookmarks. Let's avoid the cost until bookmarks are actually required. // delay if there's LOTS of bookmarks. Let's avoid the cost until bookmarks are actually required.
if ( !mBookmarkModel ) if ( !mBookmarkModel )
{
mBookmarkModel = new QgsBookmarkManagerProxyModel( QgsApplication::bookmarkManager(), QgsProject::instance()->bookmarkManager(), this ); mBookmarkModel = new QgsBookmarkManagerProxyModel( QgsApplication::bookmarkManager(), QgsProject::instance()->bookmarkManager(), this );
}
if ( mBookmarkModel->rowCount() == 0 )
{
QAction *action = new QAction( tr( "No bookmarks available" ) );
action->setEnabled( false );
mBookmarkMenu->addAction( action );
return;
}
QMap<QString, QMenu *> groupMenus; QMap<QString, QMenu *> groupMenus;
for ( int i = 0; i < mBookmarkModel->rowCount(); ++i ) for ( int i = 0; i < mBookmarkModel->rowCount(); ++i )
@ -485,32 +544,7 @@ void QgsLayoutMapWidget::aboutToShowBookmarkMenu()
QAction *action = new QAction( mBookmarkModel->data( mBookmarkModel->index( i, 0 ), static_cast<int>( QgsBookmarkManagerModel::CustomRole::Name ) ).toString(), mBookmarkMenu ); QAction *action = new QAction( mBookmarkModel->data( mBookmarkModel->index( i, 0 ), static_cast<int>( QgsBookmarkManagerModel::CustomRole::Name ) ).toString(), mBookmarkMenu );
const QgsReferencedRectangle extent = mBookmarkModel->data( mBookmarkModel->index( i, 0 ), static_cast<int>( QgsBookmarkManagerModel::CustomRole::Extent ) ).value<QgsReferencedRectangle>(); const QgsReferencedRectangle extent = mBookmarkModel->data( mBookmarkModel->index( i, 0 ), static_cast<int>( QgsBookmarkManagerModel::CustomRole::Extent ) ).value<QgsReferencedRectangle>();
connect( action, &QAction::triggered, this, [=] { connect( action, &QAction::triggered, this, [=] {
if ( !mMapItem ) setToCustomExtent( extent );
{
return;
}
QgsRectangle newExtent = extent;
//transform?
if ( extent.crs() != mMapItem->crs() )
{
try
{
QgsCoordinateTransform xForm( extent.crs(), mMapItem->crs(), QgsProject::instance() );
xForm.setBallparkTransformsAreAppropriate( true );
newExtent = xForm.transformBoundingBox( newExtent );
}
catch ( QgsCsException & )
{
//transform failed, better not proceed
return;
}
}
mMapItem->layout()->undoStack()->beginCommand( mMapItem, tr( "Change Map Extent" ) );
mMapItem->zoomToExtent( newExtent );
mMapItem->layout()->undoStack()->endCommand();
} ); } );
destMenu->addAction( action ); destMenu->addAction( action );
} }
@ -526,6 +560,34 @@ void QgsLayoutMapWidget::aboutToShowBookmarkMenu()
} }
} }
void QgsLayoutMapWidget::setToCustomExtent( const QgsReferencedRectangle &referencedExtent )
{
if ( !mMapItem || referencedExtent.isEmpty() )
{
return;
}
QgsRectangle extent = referencedExtent;
if ( referencedExtent.crs() != mMapItem->crs() )
{
try
{
QgsCoordinateTransform coordinateTransform( referencedExtent.crs(), mMapItem->crs(), QgsProject::instance() );
coordinateTransform.setBallparkTransformsAreAppropriate( true );
extent = coordinateTransform.transformBoundingBox( extent );
}
catch ( QgsCsException & )
{
//transform failed, better not proceed
return;
}
}
mMapItem->layout()->undoStack()->beginCommand( mMapItem, tr( "Change Map Extent" ) );
mMapItem->zoomToExtent( extent );
mMapItem->layout()->undoStack()->endCommand();
}
void QgsLayoutMapWidget::mTemporalCheckBox_toggled( bool checked ) void QgsLayoutMapWidget::mTemporalCheckBox_toggled( bool checked )
{ {
if ( !mMapItem ) if ( !mMapItem )

View File

@ -34,6 +34,7 @@ class QgsLayoutItemMapOverview;
class QgsLayoutMapLabelingWidget; class QgsLayoutMapLabelingWidget;
class QgsLayoutMapClippingWidget; class QgsLayoutMapClippingWidget;
class QgsBookmarkManagerProxyModel; class QgsBookmarkManagerProxyModel;
class QgsReferencedRectangle;
/** /**
* \ingroup gui * \ingroup gui
@ -144,6 +145,7 @@ class GUI_EXPORT QgsLayoutMapWidget : public QgsLayoutItemBaseWidget, private Ui
void showLabelSettings(); void showLabelSettings();
void showClipSettings(); void showClipSettings();
void switchToMoveContentTool(); void switchToMoveContentTool();
void aboutToShowLayersMenu();
void aboutToShowBookmarkMenu(); void aboutToShowBookmarkMenu();
private: private:
@ -153,7 +155,9 @@ class GUI_EXPORT QgsLayoutMapWidget : public QgsLayoutItemBaseWidget, private Ui
QgsLayoutDesignerInterface *mInterface = nullptr; QgsLayoutDesignerInterface *mInterface = nullptr;
QPointer<QgsLayoutMapLabelingWidget> mLabelWidget; QPointer<QgsLayoutMapLabelingWidget> mLabelWidget;
QPointer<QgsLayoutMapClippingWidget> mClipWidget; QPointer<QgsLayoutMapClippingWidget> mClipWidget;
QMenu *mLayersMenu = nullptr;
QMenu *mBookmarkMenu = nullptr; QMenu *mBookmarkMenu = nullptr;
QgsMapLayerProxyModel *mMapLayerModel = nullptr;
QgsBookmarkManagerProxyModel *mBookmarkModel = nullptr; QgsBookmarkManagerProxyModel *mBookmarkModel = nullptr;
QString mReportTypeString; QString mReportTypeString;
int mBlockThemeComboChanges = 0; int mBlockThemeComboChanges = 0;
@ -190,6 +194,8 @@ class GUI_EXPORT QgsLayoutMapWidget : public QgsLayoutItemBaseWidget, private Ui
* The order will match the layer order from the map canvas * The order will match the layer order from the map canvas
*/ */
QList<QgsMapLayer *> orderedPresetVisibleLayers( const QString &name ) const; QList<QgsMapLayer *> orderedPresetVisibleLayers( const QString &name ) const;
void setToCustomExtent( const QgsReferencedRectangle &extent );
}; };
/** /**

View File

@ -50,6 +50,8 @@ void QgsMapToolShapeAbstract::clean()
void QgsMapToolShapeAbstract::undo() void QgsMapToolShapeAbstract::undo()
{ {
if ( mPoints.count() > 0 ) if ( mPoints.count() == 1 )
clean();
else if ( mPoints.count() > 1 )
mPoints.removeLast(); mPoints.removeLast();
} }

View File

@ -382,7 +382,7 @@ void QgsLayerPropertiesDialog::saveDefaultStyle()
return; return;
} }
mLayer->saveStyleToDatabase( QString(), QString(), true, QString(), errorMsg ); mLayer->saveStyleToDatabaseV2( QString(), QString(), true, QString(), errorMsg );
if ( errorMsg.isNull() ) if ( errorMsg.isNull() )
{ {
return; return;
@ -457,7 +457,7 @@ void QgsLayerPropertiesDialog::saveStyleAs()
return; return;
} }
mLayer->saveStyleToDatabase( dbSettings.name, dbSettings.description, dbSettings.isDefault, dbSettings.uiFileContent, errorMessage, dlg.styleCategories() ); mLayer->saveStyleToDatabaseV2( dbSettings.name, dbSettings.description, dbSettings.isDefault, dbSettings.uiFileContent, errorMessage, dlg.styleCategories() );
if ( !errorMessage.isNull() ) if ( !errorMessage.isNull() )
{ {

View File

@ -1073,7 +1073,7 @@ void QgsVectorLayerProperties::saveMultipleStylesAs()
return; return;
} }
mLayer->saveStyleToDatabase( name, dbSettings.description, dbSettings.isDefault, dbSettings.uiFileContent, msgError, dlg.styleCategories() ); mLayer->saveStyleToDatabaseV2( name, dbSettings.description, dbSettings.isDefault, dbSettings.uiFileContent, msgError, dlg.styleCategories() );
if ( !msgError.isNull() ) if ( !msgError.isNull() )
{ {

View File

@ -16,6 +16,7 @@
#include "qgstest.h" #include "qgstest.h"
#include "qgs3d.h" #include "qgs3d.h"
#include "qgs3dmapcanvas.h"
#include "qgs3dmapscene.h" #include "qgs3dmapscene.h"
#include "qgs3dmapsettings.h" #include "qgs3dmapsettings.h"
#include "qgs3dutils.h" #include "qgs3dutils.h"
@ -29,6 +30,8 @@
#include "qgsvectorlayer.h" #include "qgsvectorlayer.h"
#include "qgsvectorlayer3drenderer.h" #include "qgsvectorlayer3drenderer.h"
#include <memory>
class TestQgs3DCameraController : public QgsTest class TestQgs3DCameraController : public QgsTest
{ {
@ -54,6 +57,7 @@ class TestQgs3DCameraController : public QgsTest
void testRotationCenterRotationCameraRotationCenter(); void testRotationCenterRotationCameraRotationCenter();
void testResetViewRaster(); void testResetViewRaster();
void testResetViewPointCloud(); void testResetViewPointCloud();
void testChangeNavigationMode();
private: private:
void waitForNearPlane( QgsOffscreen3DEngine &engine, Qgs3DMapScene *scene, float atLeast ); //#spellok void waitForNearPlane( QgsOffscreen3DEngine &engine, Qgs3DMapScene *scene, float atLeast ); //#spellok
@ -1213,6 +1217,9 @@ void TestQgs3DCameraController::testResetViewRaster()
Qgs3DMapScene *scene = new Qgs3DMapScene( *mapSettings, &engine ); Qgs3DMapScene *scene = new Qgs3DMapScene( *mapSettings, &engine );
engine.setRootEntity( scene ); engine.setRootEntity( scene );
// This ensures that the OpenGL context is properly created
Qgs3DUtils::captureSceneImage( engine, scene );
// compare raster layer + vector layer // compare raster layer + vector layer
scene->viewZoomFull(); scene->viewZoomFull();
QGSCOMPARENEAR( scene->cameraController()->distance(), 2172, 1 ); QGSCOMPARENEAR( scene->cameraController()->distance(), 2172, 1 );
@ -1243,6 +1250,9 @@ void TestQgs3DCameraController::testResetViewPointCloud()
Qgs3DMapScene *scene = new Qgs3DMapScene( *mapSettings, &engine ); Qgs3DMapScene *scene = new Qgs3DMapScene( *mapSettings, &engine );
engine.setRootEntity( scene ); engine.setRootEntity( scene );
// This ensures that the OpenGL context is properly created
Qgs3DUtils::captureSceneImage( engine, scene );
// compare virtual point cloud layer // compare virtual point cloud layer
scene->viewZoomFull(); scene->viewZoomFull();
QGSCOMPARENEAR( scene->cameraController()->distance(), 86, 1 ); QGSCOMPARENEAR( scene->cameraController()->distance(), 86, 1 );
@ -1264,5 +1274,28 @@ void TestQgs3DCameraController::testResetViewPointCloud()
delete pcLayer; delete pcLayer;
} }
void TestQgs3DCameraController::testChangeNavigationMode()
{
auto canvas3D = std::unique_ptr<Qgs3DMapCanvas>( new Qgs3DMapCanvas() );
canvas3D->show();
QVERIFY( QTest::qWaitForWindowExposed( canvas3D.get() ) );
Qgs3DMapSettings *mapSettings = new Qgs3DMapSettings;
canvas3D->setMapSettings( mapSettings );
QCOMPARE( mapSettings->cameraNavigationMode(), Qgis::NavigationMode::TerrainBased );
QCOMPARE( canvas3D->cameraController()->cameraNavigationMode(), Qgis::NavigationMode::TerrainBased );
QKeyEvent changeNavigationModeEvent( QEvent::ShortcutOverride, Qt::Key_QuoteLeft, Qt::ControlModifier );
QApplication::sendEvent( canvas3D.get(), &changeNavigationModeEvent );
QCOMPARE( canvas3D->cameraController()->cameraNavigationMode(), Qgis::NavigationMode::Walk );
QCOMPARE( mapSettings->cameraNavigationMode(), Qgis::NavigationMode::Walk );
QApplication::sendEvent( canvas3D.get(), &changeNavigationModeEvent );
QCOMPARE( canvas3D->cameraController()->cameraNavigationMode(), Qgis::NavigationMode::TerrainBased );
QCOMPARE( mapSettings->cameraNavigationMode(), Qgis::NavigationMode::TerrainBased );
}
QGSTEST_MAIN( TestQgs3DCameraController ) QGSTEST_MAIN( TestQgs3DCameraController )
#include "testqgs3dcameracontroller.moc" #include "testqgs3dcameracontroller.moc"

View File

@ -27,6 +27,8 @@
#include "qgsmapcanvastracer.h" #include "qgsmapcanvastracer.h"
#include "testqgsmaptoolutils.h" #include "testqgsmaptoolutils.h"
#include <QSignalSpy>
/** /**
* \ingroup UnitTests * \ingroup UnitTests
@ -42,14 +44,18 @@ class TestQgsMapToolReshape : public QObject
void initTestCase(); // will be called before the first testfunction is executed. void initTestCase(); // will be called before the first testfunction is executed.
void cleanupTestCase(); // will be called after the last testfunction was executed. void cleanupTestCase(); // will be called after the last testfunction was executed.
void testReshapeNotEnoughPoints();
void testReshapeNoChange(); void testReshapeNoChange();
void testReshapeZ(); void testReshapeZ();
void testTopologicalEditing(); void testTopologicalEditing();
void testTopologicalEditingNoSnap(); void testTopologicalEditingNoSnap();
void testAvoidIntersectionAndTopoEdit(); void testAvoidIntersectionAndTopoEdit();
void testAvoidIntersectionAndTopoEditSameLayer();
void testAvoidIntersectionAndTopoEditSameLayerSelection();
void reshapeWithBindingLine(); void reshapeWithBindingLine();
void testWithTracing(); void testWithTracing();
void testKeepDirection(); void testKeepDirection();
void testWithSnapToSegment();
private: private:
QgisApp *mQgisApp = nullptr; QgisApp *mQgisApp = nullptr;
@ -220,6 +226,27 @@ void TestQgsMapToolReshape::cleanupTestCase()
QgsApplication::exitQgis(); QgsApplication::exitQgis();
} }
void TestQgsMapToolReshape::testReshapeNotEnoughPoints()
{
TestQgsMapToolAdvancedDigitizingUtils utils( mCaptureTool );
// no snapping for this test
QgsSnappingConfig cfg = mCanvas->snappingUtils()->config();
cfg.setEnabled( false );
mCanvas->snappingUtils()->setConfig( cfg );
const QSignalSpy editCommandSpy( mLayerLineZ, &QgsVectorLayer::editCommandStarted );
utils.mouseClick( 2, 2, Qt::LeftButton );
utils.mouseClick( 3, 2, Qt::RightButton );
// activate back snapping
cfg.setEnabled( true );
mCanvas->snappingUtils()->setConfig( cfg );
QCOMPARE( editCommandSpy.count(), 0 );
QCOMPARE( mLayerLineZ->undoStack()->index(), 0 );
}
void TestQgsMapToolReshape::testReshapeNoChange() void TestQgsMapToolReshape::testReshapeNoChange()
{ {
TestQgsMapToolAdvancedDigitizingUtils utils( mCaptureTool ); TestQgsMapToolAdvancedDigitizingUtils utils( mCaptureTool );
@ -385,6 +412,97 @@ void TestQgsMapToolReshape::testAvoidIntersectionAndTopoEdit()
mCaptureTool->setAutoSnapEnabled( isAutoSnapEnabled ); mCaptureTool->setAutoSnapEnabled( isAutoSnapEnabled );
} }
void TestQgsMapToolReshape::testAvoidIntersectionAndTopoEditSameLayer()
{
QList<QgsMapLayer *> layers = { mLayerTopo, mLayerTopo2 };
QgsProject::instance()->addMapLayers( layers );
mCanvas->setLayers( layers );
// backup project settings
const bool topologicalEditing = QgsProject::instance()->topologicalEditing();
const Qgis::AvoidIntersectionsMode mode( QgsProject::instance()->avoidIntersectionsMode() );
const QList<QgsVectorLayer *> vlayers = QgsProject::instance()->avoidIntersectionsLayers();
const bool isAutoSnapEnabled = mCaptureTool->isAutoSnapEnabled();
QgsProject::instance()->setAvoidIntersectionsMode( Qgis::AvoidIntersectionsMode::AvoidIntersectionsLayers );
QgsProject::instance()->setAvoidIntersectionsLayers( { mLayerTopo, mLayerTopo2 } );
QgsProject::instance()->setTopologicalEditing( true );
mCanvas->setCurrentLayer( mLayerTopo );
mCaptureTool->setAutoSnapEnabled( false );
TestQgsMapToolAdvancedDigitizingUtils utils( mCaptureTool );
// reshape mLayerTopo feature 1 with two points inside mLayerTopo feature 2, both features should be reshaped
utils.mouseClick( 4, 4, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 7, 4, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 7.5, 3, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 7.5, 1, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 7, 0, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 4, 0, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 4, 0, Qt::RightButton );
QCOMPARE( mLayerTopo2->getFeature( 1 ).geometry().asWkt(), QStringLiteral( "Polygon ((0 5, 4 5, 4 7, 0 7, 0 5))" ) );
QCOMPARE( mLayerTopo->getFeature( 1 ).geometry().asWkt(), QStringLiteral( "Polygon ((4 0, 7 0, 7.5 1, 7.5 3, 7 4, 4 4, 0 4, 0 0, 4 0))" ) );
QCOMPARE( mLayerTopo->getFeature( 2 ).geometry().asWkt(), QStringLiteral( "Polygon ((7 0, 8 0, 8 4, 7 4, 7.5 3, 7.5 1, 7 0))" ) );
mLayerTopo->undoStack()->undo();
QCOMPARE( mLayerTopo2->getFeature( 1 ).geometry().asWkt(), QStringLiteral( "Polygon ((0 5, 4 5, 4 7, 0 7, 0 5))" ) );
QCOMPARE( mLayerTopo->getFeature( 1 ).geometry().asWkt(), QStringLiteral( "Polygon ((0 0, 4 0, 4 4, 0 4, 0 0))" ) );
QCOMPARE( mLayerTopo->getFeature( 2 ).geometry().asWkt(), QStringLiteral( "Polygon ((7 0, 8 0, 8 4, 7 4, 7 0))" ) );
QgsProject::instance()->setTopologicalEditing( topologicalEditing );
QgsProject::instance()->setAvoidIntersectionsMode( mode );
QgsProject::instance()->setAvoidIntersectionsLayers( vlayers );
mCaptureTool->setAutoSnapEnabled( isAutoSnapEnabled );
}
void TestQgsMapToolReshape::testAvoidIntersectionAndTopoEditSameLayerSelection()
{
QList<QgsMapLayer *> layers = { mLayerTopo, mLayerTopo2 };
QgsProject::instance()->addMapLayers( layers );
mCanvas->setLayers( layers );
// backup project settings
const bool topologicalEditing = QgsProject::instance()->topologicalEditing();
const Qgis::AvoidIntersectionsMode mode( QgsProject::instance()->avoidIntersectionsMode() );
const QList<QgsVectorLayer *> vlayers = QgsProject::instance()->avoidIntersectionsLayers();
const bool isAutoSnapEnabled = mCaptureTool->isAutoSnapEnabled();
QgsProject::instance()->setAvoidIntersectionsMode( Qgis::AvoidIntersectionsMode::AvoidIntersectionsLayers );
QgsProject::instance()->setAvoidIntersectionsLayers( { mLayerTopo, mLayerTopo2 } );
QgsProject::instance()->setTopologicalEditing( true );
mCanvas->setCurrentLayer( mLayerTopo );
mCaptureTool->setAutoSnapEnabled( false );
TestQgsMapToolAdvancedDigitizingUtils utils( mCaptureTool );
mLayerTopo->selectByIds( { 1 } );
// reshape mLayerTopo feature 1 with two points inside mLayerTopo feature 2, only the selected feature should be reshaped
utils.mouseClick( 4, 4, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 7, 4, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 7.5, 3, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 7.5, 1, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 7, 0, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 4, 0, Qt::LeftButton, Qt::KeyboardModifiers() );
utils.mouseClick( 4, 0, Qt::RightButton );
QCOMPARE( mLayerTopo2->getFeature( 1 ).geometry().asWkt(), QStringLiteral( "Polygon ((0 5, 4 5, 4 7, 0 7, 0 5))" ) );
QCOMPARE( mLayerTopo->getFeature( 1 ).geometry().asWkt(), QStringLiteral( "Polygon ((4 0, 0 0, 0 4, 4 4, 7 4, 7 0, 4 0))" ) );
QCOMPARE( mLayerTopo->getFeature( 2 ).geometry().asWkt(), QStringLiteral( "Polygon ((7 0, 8 0, 8 4, 7 4, 7 0))" ) );
mLayerTopo->undoStack()->undo();
QCOMPARE( mLayerTopo2->getFeature( 1 ).geometry().asWkt(), QStringLiteral( "Polygon ((0 5, 4 5, 4 7, 0 7, 0 5))" ) );
QCOMPARE( mLayerTopo->getFeature( 1 ).geometry().asWkt(), QStringLiteral( "Polygon ((0 0, 4 0, 4 4, 0 4, 0 0))" ) );
QCOMPARE( mLayerTopo->getFeature( 2 ).geometry().asWkt(), QStringLiteral( "Polygon ((7 0, 8 0, 8 4, 7 4, 7 0))" ) );
mLayerTopo->removeSelection();
QgsProject::instance()->setTopologicalEditing( topologicalEditing );
QgsProject::instance()->setAvoidIntersectionsMode( mode );
QgsProject::instance()->setAvoidIntersectionsLayers( vlayers );
mCaptureTool->setAutoSnapEnabled( isAutoSnapEnabled );
}
void TestQgsMapToolReshape::reshapeWithBindingLine() void TestQgsMapToolReshape::reshapeWithBindingLine()
{ {
// prepare vector layer // prepare vector layer
@ -531,11 +649,42 @@ void TestQgsMapToolReshape::testKeepDirection()
QString wkt3 = QStringLiteral( "LineString (13 1, 12 1, 12 3, 13 3, 14 3, 14 5, 13 5, 12 5, 12 7, 13 7, 13 8, 19 11, 25 8, 25 0, 13 0, 13 1)" ); QString wkt3 = QStringLiteral( "LineString (13 1, 12 1, 12 3, 13 3, 14 3, 14 5, 13 5, 12 5, 12 7, 13 7, 13 8, 19 11, 25 8, 25 0, 13 0, 13 1)" );
QCOMPARE( mLayerLine->getFeature( 3 ).geometry().asWkt(), wkt3 ); QCOMPARE( mLayerLine->getFeature( 3 ).geometry().asWkt(), wkt3 );
// undo the three changes
mLayerLine->undoStack()->undo();
mLayerLine->undoStack()->undo();
mLayerLine->undoStack()->undo();
// activate back snapping // activate back snapping
cfg.setEnabled( true ); cfg.setEnabled( true );
mCanvas->snappingUtils()->setConfig( cfg ); mCanvas->snappingUtils()->setConfig( cfg );
} }
void TestQgsMapToolReshape::testWithSnapToSegment()
{
TestQgsMapToolAdvancedDigitizingUtils utils( mCaptureTool );
mCanvas->setLayers( { mLayerPolygonZ } );
mCanvas->setCurrentLayer( mLayerPolygonZ );
mCanvas->setDestinationCrs( mLayerPolygonZ->crs() );
QgsSnappingConfig cfg = mCanvas->snappingUtils()->config();
cfg.setTypeFlag( static_cast<Qgis::SnappingTypes>( Qgis::SnappingType::Segment ) );
mCanvas->snappingUtils()->setConfig( cfg );
QCOMPARE( mLayerPolygonZ->getFeature( 1 ).geometry().asWkt(), QStringLiteral( "Polygon Z ((7 5 4, 3 2 1, 0 1 2, 7 5 4))" ) );
// snap to segment on a diagonal
utils.mouseClick( 5.5, 4.5, Qt::LeftButton, {}, true );
utils.mouseClick( 1, 5, Qt::LeftButton );
utils.mouseClick( 1, 2, Qt::LeftButton, {}, true );
utils.mouseClick( 1, 2, Qt::RightButton );
QCOMPARE( mLayerPolygonZ->getFeature( 1 ).geometry().asWkt( 1 ), QStringLiteral( "Polygon Z ((1.2 1.7 333, 1 5 333, 5.7 4.2 333, 7 5 4, 3 2 1, 0 1 2, 1.2 1.7 333))" ) );
mLayerLine->undoStack()->undo();
cfg.setTypeFlag( static_cast<Qgis::SnappingTypes>( Qgis::SnappingType::Vertex | Qgis::SnappingType::Segment ) );
mCanvas->snappingUtils()->setConfig( cfg );
}
QGSTEST_MAIN( TestQgsMapToolReshape ) QGSTEST_MAIN( TestQgsMapToolReshape )
#include "testqgsmaptoolreshape.moc" #include "testqgsmaptoolreshape.moc"

View File

@ -64,6 +64,9 @@ void TestQgsAuthCertUtils::cleanupTestCase()
void TestQgsAuthCertUtils::testValidationUtils() void TestQgsAuthCertUtils::testValidationUtils()
{ {
// FIXME
QSKIP( "Broken test. See https://github.com/qgis/QGIS/issues/62373", SkipSingle );
// null cert // null cert
QSslCertificate cert; QSslCertificate cert;
QVERIFY( !QgsAuthCertUtils::certIsCurrent( cert ) ); QVERIFY( !QgsAuthCertUtils::certIsCurrent( cert ) );

View File

@ -125,6 +125,9 @@ void TestQgsAuthConfig::testMethodConfig()
void TestQgsAuthConfig::testPkiBundle() void TestQgsAuthConfig::testPkiBundle()
{ {
// FIXME
QSKIP( "Broken test. See https://github.com/qgis/QGIS/issues/62373", SkipSingle );
QgsPkiBundle bundle; QgsPkiBundle bundle;
QVERIFY( bundle.isNull() ); QVERIFY( bundle.isNull() );
QVERIFY( !bundle.isValid() ); QVERIFY( !bundle.isValid() );

View File

@ -53,6 +53,7 @@ class TestQgsGML : public QObject
void testStreamingParser(); void testStreamingParser();
void testStreamingParserInvalidGML(); void testStreamingParserInvalidGML();
void testPointGML2(); void testPointGML2();
void testPointZGML2();
void testLineStringGML2(); void testLineStringGML2();
void testPolygonGML2(); void testPolygonGML2();
void testMultiPointGML2(); void testMultiPointGML2();
@ -90,6 +91,8 @@ class TestQgsGML : public QObject
void testUnknownEncoding(); void testUnknownEncoding();
void testUnhandledEncoding(); void testUnhandledEncoding();
void testXPath(); void testXPath();
void testZ();
void testZ_data();
}; };
const QString data1( "<myns:FeatureCollection " const QString data1( "<myns:FeatureCollection "
@ -225,6 +228,34 @@ void TestQgsGML::testPointGML2()
delete features[0].first; delete features[0].first;
} }
void TestQgsGML::testPointZGML2()
{
const QgsFields fields;
QgsGmlStreamingParser gmlParser( QStringLiteral( "mytypename" ), QStringLiteral( "mygeom" ), fields );
QCOMPARE( gmlParser.processData( QByteArray( "<myns:FeatureCollection "
"xmlns:myns='http://myns' "
"xmlns:gml='http://www.opengis.net/gml'>"
"<gml:featureMember>"
"<myns:mytypename fid='mytypename.1'>"
"<myns:mygeom>"
"<gml:Point srsName='EPSG:4326'>"
"<gml:coordinates>1,2,3</gml:coordinates>"
"</gml:Point>"
"</myns:mygeom>"
"</myns:mytypename>"
"</gml:featureMember>"
"</myns:FeatureCollection>" ),
true ),
true );
QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::PointZ );
QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures();
QCOMPARE( features.size(), 1 );
QVERIFY( features[0].first->hasGeometry() );
QCOMPARE( features[0].first->geometry().wkbType(), Qgis::WkbType::PointZ );
QCOMPARE( features[0].first->geometry().asPoint(), QgsPoint( 1, 2, 3 ) );
delete features[0].first;
}
void TestQgsGML::testLineStringGML2() void TestQgsGML::testLineStringGML2()
{ {
const QgsFields fields; const QgsFields fields;
@ -749,11 +780,11 @@ void TestQgsGML::testPolygonGML3_srsDimension_on_Polygon()
"</myns:FeatureCollection>" ), "</myns:FeatureCollection>" ),
true ), true ),
true ); true );
QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::Polygon ); QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::PolygonZ );
QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures(); QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures();
QCOMPARE( features.size(), 1 ); QCOMPARE( features.size(), 1 );
QVERIFY( features[0].first->hasGeometry() ); QVERIFY( features[0].first->hasGeometry() );
QCOMPARE( features[0].first->geometry().wkbType(), Qgis::WkbType::Polygon ); QCOMPARE( features[0].first->geometry().wkbType(), Qgis::WkbType::PolygonZ );
QgsPolygonXY poly = features[0].first->geometry().asPolygon(); QgsPolygonXY poly = features[0].first->geometry().asPolygon();
QCOMPARE( poly.size(), 1 ); QCOMPARE( poly.size(), 1 );
QCOMPARE( poly[0].size(), 5 ); QCOMPARE( poly[0].size(), 5 );
@ -783,11 +814,11 @@ void TestQgsGML::testPolygonGML3_srsDimension_on_posList()
"</myns:FeatureCollection>" ), "</myns:FeatureCollection>" ),
true ), true ),
true ); true );
QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::Polygon ); QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::PolygonZ );
QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures(); QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures();
QCOMPARE( features.size(), 1 ); QCOMPARE( features.size(), 1 );
QVERIFY( features[0].first->hasGeometry() ); QVERIFY( features[0].first->hasGeometry() );
QCOMPARE( features[0].first->geometry().wkbType(), Qgis::WkbType::Polygon ); QCOMPARE( features[0].first->geometry().wkbType(), Qgis::WkbType::PolygonZ );
QgsPolygonXY poly = features[0].first->geometry().asPolygon(); QgsPolygonXY poly = features[0].first->geometry().asPolygon();
QCOMPARE( poly.size(), 1 ); QCOMPARE( poly.size(), 1 );
QCOMPARE( poly[0].size(), 5 ); QCOMPARE( poly[0].size(), 5 );
@ -821,11 +852,11 @@ void TestQgsGML::testPolygonGML3_pos()
"</myns:FeatureCollection>" ), "</myns:FeatureCollection>" ),
true ), true ),
true ); true );
QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::Polygon ); QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::PolygonZ );
QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures(); QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures();
QCOMPARE( features.size(), 1 ); QCOMPARE( features.size(), 1 );
QVERIFY( features[0].first->hasGeometry() ); QVERIFY( features[0].first->hasGeometry() );
QCOMPARE( features[0].first->geometry().wkbType(), Qgis::WkbType::Polygon ); QCOMPARE( features[0].first->geometry().wkbType(), Qgis::WkbType::PolygonZ );
QgsPolygonXY poly = features[0].first->geometry().asPolygon(); QgsPolygonXY poly = features[0].first->geometry().asPolygon();
QCOMPARE( poly.size(), 1 ); QCOMPARE( poly.size(), 1 );
QCOMPARE( poly[0].size(), 5 ); QCOMPARE( poly[0].size(), 5 );
@ -1604,5 +1635,90 @@ void TestQgsGML::testXPath()
QCOMPARE( f.attribute( QStringLiteral( "complex_repeated" ) ).toString(), QStringLiteral( "[\"foo\",\"bar\"]" ) ); QCOMPARE( f.attribute( QStringLiteral( "complex_repeated" ) ).toString(), QStringLiteral( "[\"foo\",\"bar\"]" ) );
} }
void TestQgsGML::testZ_data()
{
QTest::addColumn<QString>( "xml" );
QTest::addColumn<int>( "expectedWkbType" );
QTest::addColumn<QString>( "expectedWkt" );
QTest::newRow( "point with z gml 2" ) << QStringLiteral( R"gml(<gml:Point srsName="EPSG:4326"><gml:coordinates>0,1,2</gml:coordinates></gml:Point>)gml" )
<< static_cast<int>( Qgis::WkbType::PointZ )
<< QStringLiteral( "POINT Z (0 1 2)" );
QTest::newRow( "point with z gml 3" ) << QStringLiteral( R"gml(<gml:Point srsName="EPSG:4326"><gml:pos srsDimension="3">0 1 2</gml:pos></gml:Point>)gml" )
<< static_cast<int>( Qgis::WkbType::PointZ )
<< QStringLiteral( "POINT Z (0 1 2)" );
// Note: this is not supported "point with z gml 3 no srsDimension" <gml:Point srsName="EPSG:4326"><gml:pos>0 1 2</gml:pos></gml:Point>
QTest::newRow( "linestring with z gml 2" ) << QStringLiteral( R"gml(<gml:LineString srsName="EPSG:4326"><gml:coordinates>0,1,2 3,4,5</gml:coordinates></gml:LineString>)gml" )
<< static_cast<int>( Qgis::WkbType::LineStringZ )
<< QStringLiteral( "LINESTRING Z (0 1 2, 3 4 5)" );
QTest::newRow( "linestring with z gml 3" ) << QStringLiteral( R"gml(<gml:Curve srsName="EPSG:4326"><gml:segments><gml:LineStringSegment><gml:posList srsDimension="3">0 1 2 3 4 5</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve>)gml" )
<< static_cast<int>( Qgis::WkbType::LineStringZ )
<< QStringLiteral( "LINESTRING Z (0 1 2, 3 4 5)" );
QTest::newRow( "polygon with z gml 2" ) << QStringLiteral( R"gml(<gml:Polygon srsName="EPSG:4326"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0,1,2 3,4,5 6,7,8 0,1,2</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>)gml" )
<< static_cast<int>( Qgis::WkbType::PolygonZ )
<< QStringLiteral( "POLYGON Z ((0 1 2, 3 4 5, 6 7 8, 0 1 2))" );
QTest::newRow( "polygon with z gml 3" ) << QStringLiteral( R"gml(<gml:Polygon srsName="EPSG:4326"><gml:exterior><gml:LinearRing><gml:posList srsDimension="3">0 1 2 3 4 5 6 7 8 0 1 2</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>)gml" )
<< static_cast<int>( Qgis::WkbType::PolygonZ )
<< QStringLiteral( "POLYGON Z ((0 1 2, 3 4 5, 6 7 8, 0 1 2))" );
// Multi-geometries
QTest::newRow( "multipoint with z gml 2" ) << QStringLiteral( R"gml(<gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>0,1,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>3,4,5</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint>)gml" )
<< static_cast<int>( Qgis::WkbType::MultiPointZ )
<< QStringLiteral( "MULTIPOINT Z ((0 1 2),(3 4 5))" );
QTest::newRow( "multipoint with z gml 3" ) << QStringLiteral( R"gml(<gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:pos srsDimension="3">0 1 2</gml:pos></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:pos srsDimension="3">3 4 5</gml:pos></gml:Point></gml:pointMember></gml:MultiPoint>)gml" )
<< static_cast<int>( Qgis::WkbType::MultiPointZ )
<< QStringLiteral( "MULTIPOINT Z ((0 1 2),(3 4 5))" );
QTest::newRow( "multilinestring with z gml 2" ) << QStringLiteral( R"gml(<gml:MultiLineString srsName="EPSG:4326"><gml:lineStringMember><gml:LineString><gml:coordinates>0,1,2 3,4,5</gml:coordinates></gml:LineString></gml:lineStringMember><gml:lineStringMember><gml:LineString><gml:coordinates>6,7,8 9,10,11</gml:coordinates></gml:LineString></gml:lineStringMember></gml:MultiLineString>)gml" )
<< static_cast<int>( Qgis::WkbType::MultiLineStringZ )
<< QStringLiteral( "MULTILINESTRING Z ((0 1 2, 3 4 5),(6 7 8, 9 10 11))" );
QTest::newRow( "multilinestring with z gml 3" ) << QStringLiteral( R"gml(<gml:MultiCurve srsName="EPSG:4326"><gml:curveMember><gml:Curve><gml:segments><gml:LineStringSegment><gml:posList srsDimension="3">0 1 2 3 4 5</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve></gml:curveMember><gml:curveMember><gml:Curve><gml:segments><gml:LineStringSegment><gml:posList srsDimension="3">6 7 8 9 10 11</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve></gml:curveMember></gml:MultiCurve>)gml" )
<< static_cast<int>( Qgis::WkbType::MultiLineStringZ )
<< QStringLiteral( "MULTILINESTRING Z ((0 1 2, 3 4 5),(6 7 8, 9 10 11))" );
QTest::newRow( "multipolygon with z gml 2" ) << QStringLiteral( R"gml(<gml:MultiPolygon srsName="EPSG:4326"><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0,1,2 3,4,5 6,7,8 0,1,2</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>9,10,11 12,13,14 15,16,17 9,10,11</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon>)gml" )
<< static_cast<int>( Qgis::WkbType::MultiPolygonZ )
<< QStringLiteral( "MULTIPOLYGON Z (((0 1 2, 3 4 5, 6 7 8, 0 1 2)),((9 10 11, 12 13 14, 15 16 17, 9 10 11)))" );
QTest::newRow( "multipolygon with z gml 3" ) << QStringLiteral( R"gml(<gml:MultiPolygon srsName="EPSG:4326"><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0,1,2 3,4,5 6,7,8 0,1,2</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>9,10,11 12,13,14 15,16,17 9,10,11</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon>)gml" )
<< static_cast<int>( Qgis::WkbType::MultiPolygonZ )
<< QStringLiteral( "MULTIPOLYGON Z (((0 1 2, 3 4 5, 6 7 8, 0 1 2)),((9 10 11, 12 13 14, 15 16 17, 9 10 11)))" );
}
void TestQgsGML::testZ()
{
QFETCH( QString, xml );
QFETCH( int, expectedWkbType );
QFETCH( QString, expectedWkt );
const QString wrappedXml = QStringLiteral( R"gml(
<myns:FeatureCollection xmlns:myns="http://myns" xmlns:gml="http://www.opengis.net/gml">
<gml:featureMember>
<myns:mytypename fid="mytypename.1">
<myns:mygeom>%1</myns:mygeom>
</myns:mytypename>
</gml:featureMember>
</myns:FeatureCollection>)gml" )
.arg( xml );
const QgsFields fields;
QgsGmlStreamingParser gmlParser( QString::fromUtf8( QByteArray( "mytypename" ) ), QString::fromUtf8( QByteArray( "mygeom" ) ), fields );
QCOMPARE( gmlParser.processData( wrappedXml.toUtf8(), true ), true );
QCOMPARE( gmlParser.wkbType(), static_cast<Qgis::WkbType>( expectedWkbType ) );
QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures();
QCOMPARE( features.size(), 1 );
QVERIFY( features[0].first->hasGeometry() );
QCOMPARE( features[0].first->geometry().wkbType(), static_cast<Qgis::WkbType>( expectedWkbType ) );
QCOMPARE( features[0].first->geometry().asWkt().toUpper(), expectedWkt );
}
QGSTEST_MAIN( TestQgsGML ) QGSTEST_MAIN( TestQgsGML )
#include "testqgsgml.moc" #include "testqgsgml.moc"

View File

@ -54,8 +54,15 @@ class TestQgsOgcUtils : public QObject
} }
void testGeometryFromGML(); void testGeometryFromGML();
void testGeometryFromGMLWithZ_data();
void testGeometryFromGMLWithZ();
void testGeometryToGML(); void testGeometryToGML();
void testGeometryZToGML();
void testGeometryZToGML_data();
void testExpressionFromOgcFilter(); void testExpressionFromOgcFilter();
void testExpressionFromOgcFilter_data(); void testExpressionFromOgcFilter_data();
@ -108,6 +115,82 @@ void TestQgsOgcUtils::testGeometryFromGML()
geomBox = QgsOgcUtils::geometryFromGML( QStringLiteral( "<gml:Envelope srsName=\"foo\"><gml:lowerCorner>135.2239 34.4879</gml:lowerCorner><gml:upperCorner>135.8578 34.8471</gml:upperCorner></gml:Envelope>" ) ); geomBox = QgsOgcUtils::geometryFromGML( QStringLiteral( "<gml:Envelope srsName=\"foo\"><gml:lowerCorner>135.2239 34.4879</gml:lowerCorner><gml:upperCorner>135.8578 34.8471</gml:upperCorner></gml:Envelope>" ) );
QVERIFY( !geomBox.isNull() ); QVERIFY( !geomBox.isNull() );
QVERIFY( geomBox.wkbType() == Qgis::WkbType::Polygon ); QVERIFY( geomBox.wkbType() == Qgis::WkbType::Polygon );
// Test point GML3 Z
geom = QgsOgcUtils::geometryFromGML( QStringLiteral( "<gml:Point srsName=\"EPSG:4326\"><gml:pos srsDimension=\"3\">0 1 2</gml:pos></gml:Point>" ) );
QVERIFY( !geom.isNull() );
QVERIFY( geom.wkbType() == Qgis::WkbType::PointZ );
QVERIFY( geom.equals( QgsGeometry::fromWkt( QStringLiteral( "POINTZ(0 1 2)" ) ) ) );
// Test polygon GML3 Z
geom = QgsOgcUtils::geometryFromGML( QStringLiteral( R"GML(<gml:Polygon srsName="EPSG:4326"><gml:exterior><gml:LinearRing><gml:posList srsDimension="3">0 0 1200 0 1 1250 1 1 1230 1 0 1210 0 0 1200</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>)GML" ) );
QVERIFY( !geom.isNull() );
QVERIFY( geom.wkbType() == Qgis::WkbType::PolygonZ );
QVERIFY( geom.equals( QgsGeometry::fromWkt( QStringLiteral( "POLYGONZ((0 0 1200, 0 1 1250, 1 1 1230, 1 0 1210, 0 0 1200))" ) ) ) );
// Test linestring GML3 Z
geom = QgsOgcUtils::geometryFromGML( QStringLiteral( R"GML(<gml:LineString srsName="EPSG:4326"><gml:posList srsDimension="3">0 0 1200 0 1 1250 1 1 1230 1 0 1210</gml:posList></gml:LineString>)GML" ) );
QVERIFY( !geom.isNull() );
QVERIFY( geom.wkbType() == Qgis::WkbType::LineStringZ );
QVERIFY( geom.equals( QgsGeometry::fromWkt( QStringLiteral( "LINESTRINGZ(0 0 1200, 0 1 1250, 1 1 1230, 1 0 1210)" ) ) ) );
}
void TestQgsOgcUtils::testGeometryFromGMLWithZ_data()
{
QTest::addColumn<QString>( "xmlText" );
QTest::addColumn<Qgis::WkbType>( "type" );
QTest::addColumn<QString>( "WKT" );
QTest::newRow( "PointZ" )
<< QStringLiteral( "<gml:Point srsName=\"EPSG:4326\"><gml:pos srsDimension=\"3\">0 1 2</gml:pos></gml:Point>" )
<< Qgis::WkbType::PointZ
<< QStringLiteral( "POINTZ( 0 1 2)" );
QTest::newRow( "LineStringZ" )
<< QStringLiteral( R"GML(<gml:LineString srsName="EPSG:4326"><gml:posList srsDimension="3">0 0 1200 0 1 1250 1 1 1230 1 0 1210</gml:posList></gml:LineString>)GML" )
<< Qgis::WkbType::LineStringZ
<< QStringLiteral( "LINESTRINGZ(0 0 1200, 0 1 1250, 1 1 1230, 1 0 1210)" );
QTest::newRow( "PolygonZ" )
<< QStringLiteral( R"GML(<gml:Polygon srsName="EPSG:4326"><gml:exterior><gml:LinearRing><gml:posList srsDimension="3">0 0 1200 0 1 1250 1 1 1230 1 0 1210 0 0 1200</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>)GML" )
<< Qgis::WkbType::PolygonZ
<< QStringLiteral( "POLYGONZ((0 0 1200, 0 1 1250, 1 1 1230, 1 0 1210, 0 0 1200))" );
// Test multipoint GML3 Z
QTest::newRow( "MultiPointZ" )
<< QStringLiteral( R"GML(<gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:pos srsDimension="3">0 1 2</gml:pos></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:pos srsDimension="3">3 4 5</gml:pos></gml:Point></gml:pointMember></gml:MultiPoint>)GML" )
<< Qgis::WkbType::MultiPointZ
<< QStringLiteral( "MULTIPOINTZ((0 1 2), (3 4 5))" );
// Test multilinestring GML2 Z
QTest::newRow( "MultiLineStringZ GML2" )
<< QStringLiteral( R"GML(<gml:MultiLineString srsName="EPSG:4326"><gml:lineStringMember><gml:LineString><gml:coordinates>0,0,1200 0,1,1250 1,1,1230 1,0,1210</gml:coordinates></gml:LineString></gml:lineStringMember><gml:lineStringMember><gml:LineString><gml:coordinates>2,2,2200 2,3,2250 3,3,2230 3,2,2210</gml:coordinates></gml:LineString></gml:lineStringMember></gml:MultiLineString>)GML" )
<< Qgis::WkbType::MultiLineStringZ
<< QStringLiteral( "MULTILINESTRINGZ((0 0 1200, 0 1 1250, 1 1 1230, 1 0 1210), (2 2 2200, 2 3 2250, 3 3 2230, 3 2 2210))" );
QTest::newRow( "MultiLineStringZ no curve" )
<< QStringLiteral( R"GML(<gml:MultiCurve srsName="EPSG:4326"><gml:curveMember><gml:LineString><gml:posList srsDimension="3">0 0 1200 0 1 1250 1 1 1230 1 0 1210</gml:posList></gml:LineString></gml:curveMember><gml:curveMember><gml:LineString><gml:posList srsDimension="3">2 2 2200 2 3 2250 3 3 2230 3 2 2210</gml:posList></gml:LineString></gml:curveMember></gml:MultiCurve>)GML" )
<< Qgis::WkbType::MultiLineStringZ
<< QStringLiteral( "MULTILINESTRINGZ((0 0 1200, 0 1 1250, 1 1 1230, 1 0 1210), (2 2 2200, 2 3 2250, 3 3 2230, 3 2 2210))" );
// Test multilinestring GML3 Z
QTest::newRow( "MultiLineStringZ" )
<< QStringLiteral( R"GML(<gml:MultiCurve srsName="EPSG:4326"><gml:curveMember><gml:Curve><gml:segments><gml:LineStringSegment><gml:posList srsDimension="3">0 0 1200 0 1 1250 1 1 1230 1 0 1210</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve></gml:curveMember><gml:curveMember><gml:Curve><gml:segments><gml:LineStringSegment><gml:posList srsDimension="3">2 2 2200 2 3 2250 3 3 2230 3 2 2210</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve></gml:curveMember></gml:MultiCurve>)GML" )
<< Qgis::WkbType::MultiLineStringZ
<< QStringLiteral( "MULTILINESTRINGZ((0 0 1200, 0 1 1250, 1 1 1230, 1 0 1210), (2 2 2200, 2 3 2250, 3 3 2230, 3 2 2210))" );
}
void TestQgsOgcUtils::testGeometryFromGMLWithZ()
{
QFETCH( QString, xmlText );
QFETCH( Qgis::WkbType, type );
QFETCH( QString, WKT );
QgsGeometry geom = QgsOgcUtils::geometryFromGML( xmlText );
QVERIFY( !geom.isNull() );
QCOMPARE( geom.wkbType(), type );
QVERIFY( geom.equals( QgsGeometry::fromWkt( WKT ) ) );
} }
static QDomElement comparableElement( const QString &xmlText ) static QDomElement comparableElement( const QString &xmlText )
@ -174,6 +257,44 @@ void TestQgsOgcUtils::testGeometryToGML()
doc.removeChild( elemLine ); doc.removeChild( elemLine );
} }
void TestQgsOgcUtils::testGeometryZToGML_data()
{
QTest::addColumn<QString>( "wkt" );
QTest::newRow( "PointZ" ) << QStringLiteral( "POINT Z(0 1 2)" );
QTest::newRow( "LineStringZ" ) << QStringLiteral( "LINESTRING Z(0 0 1200, 0 1 1250, 1 1 1230, 1 0 1210)" );
QTest::newRow( "PolygonZ" ) << QStringLiteral( "POLYGON Z((0 0 1200, 0 1 1250, 1 1 1230, 1 0 1210, 0 0 1200))" );
// Multi
QTest::newRow( "MultiPointZ" ) << QStringLiteral( "MULTIPOINT Z((0 1 2), (3 4 5))" );
QTest::newRow( "MultiLineStringZ" ) << QStringLiteral( "MULTILINESTRING Z((0 0 1200, 0 1 1250, 1 1 1230, 1 0 1210), (2 2 2200, 2 3 2250, 3 3 2230, 3 2 2210))" );
QTest::newRow( "MultiPolygonZ" ) << QStringLiteral( "MULTIPOLYGON Z(((0 0 1200, 0 1 1250, 1 1 1230, 1 0 1210, 0 0 1200)), ((2 2 2200, 2 3 2250, 3 3 2230, 3 2 2210, 2 2 2200)))" );
}
void TestQgsOgcUtils::testGeometryZToGML()
{
// Round trip test
QFETCH( QString, wkt );
const QgsGeometry geom( QgsGeometry::fromWkt( wkt ) );
QVERIFY( !geom.isNull() );
QVERIFY( QgsWkbTypes::hasZ( geom.wkbType() ) );
// Test GML3
QDomDocument doc;
QDomElement elem = QgsOgcUtils::geometryToGML( geom, doc, QStringLiteral( "GML3" ) );
QVERIFY( !elem.isNull() );
// Dump element to string
QString str;
QTextStream stream( &str );
elem.save( stream, 0 /*indent*/ );
QCOMPARE( QgsOgcUtils::geometryFromGML( str ).asWkt(), geom.asWkt() );
}
void TestQgsOgcUtils::testExpressionFromOgcFilterWFS20_data() void TestQgsOgcUtils::testExpressionFromOgcFilterWFS20_data()
{ {
QTest::addColumn<QString>( "xmlText" ); QTest::addColumn<QString>( "xmlText" );
@ -227,8 +348,8 @@ void TestQgsOgcUtils::testExpressionFromOgcFilterWFS20()
std::unique_ptr<QgsExpression> expr( QgsOgcUtils::expressionFromOgcFilter( rootElem, QgsOgcUtils::FILTER_FES_2_0, &layer ) ); std::unique_ptr<QgsExpression> expr( QgsOgcUtils::expressionFromOgcFilter( rootElem, QgsOgcUtils::FILTER_FES_2_0, &layer ) );
QVERIFY( expr.get() ); QVERIFY( expr.get() );
qDebug( "OGC XML : %s", xmlText.toLatin1().data() ); //qDebug( "OGC XML : %s", xmlText.toLatin1().data() );
qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() ); //qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() );
if ( expr->hasParserError() ) if ( expr->hasParserError() )
qDebug( "ERROR: %s ", expr->parserErrorString().toLatin1().data() ); qDebug( "ERROR: %s ", expr->parserErrorString().toLatin1().data() );
@ -432,8 +553,8 @@ void TestQgsOgcUtils::testExpressionFromOgcFilter()
std::unique_ptr<QgsExpression> expr( QgsOgcUtils::expressionFromOgcFilter( rootElem, &layer ) ); std::unique_ptr<QgsExpression> expr( QgsOgcUtils::expressionFromOgcFilter( rootElem, &layer ) );
QVERIFY( expr.get() ); QVERIFY( expr.get() );
qDebug( "OGC XML : %s", xmlText.toLatin1().data() ); //qDebug( "OGC XML : %s", xmlText.toLatin1().data() );
qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() ); //qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() );
if ( expr->hasParserError() ) if ( expr->hasParserError() )
qDebug( "ERROR: %s ", expr->parserErrorString().toLatin1().data() ); qDebug( "ERROR: %s ", expr->parserErrorString().toLatin1().data() );
@ -485,8 +606,8 @@ void TestQgsOgcUtils::testExpressionFromOgcFilterWithLongLong()
std::unique_ptr<QgsExpression> expr( QgsOgcUtils::expressionFromOgcFilter( rootElem, &layer ) ); std::unique_ptr<QgsExpression> expr( QgsOgcUtils::expressionFromOgcFilter( rootElem, &layer ) );
QVERIFY( expr.get() ); QVERIFY( expr.get() );
qDebug( "OGC XML : %s", xmlText.toLatin1().data() ); //qDebug( "OGC XML : %s", xmlText.toLatin1().data() );
qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() ); //qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() );
if ( expr->hasParserError() ) if ( expr->hasParserError() )
qDebug( "ERROR: %s ", expr->parserErrorString().toLatin1().data() ); qDebug( "ERROR: %s ", expr->parserErrorString().toLatin1().data() );
@ -514,8 +635,8 @@ void TestQgsOgcUtils::testExpressionToOgcFilter()
doc.appendChild( filterElem ); doc.appendChild( filterElem );
qDebug( "EXPR: %s", exp.expression().toLatin1().data() ); //qDebug( "EXPR: %s", exp.expression().toLatin1().data() );
qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() ); //qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
QDomElement xmlElem = comparableElement( xmlText ); QDomElement xmlElem = comparableElement( xmlText );
@ -702,9 +823,9 @@ void TestQgsOgcUtils::testExpressionToOgcFilterWFS11()
doc.appendChild( filterElem ); doc.appendChild( filterElem );
qDebug( "EXPR: %s", exp.expression().toLatin1().data() ); //qDebug( "EXPR: %s", exp.expression().toLatin1().data() );
qDebug( "SRSNAME: %s", srsName.toLatin1().data() ); //qDebug( "SRSNAME: %s", srsName.toLatin1().data() );
qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() ); //qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
QDomElement xmlElem = comparableElement( xmlText ); QDomElement xmlElem = comparableElement( xmlText );
@ -771,9 +892,9 @@ void TestQgsOgcUtils::testExpressionToOgcFilterWFS20()
doc.appendChild( filterElem ); doc.appendChild( filterElem );
qDebug( "EXPR: %s", exp.expression().toLatin1().data() ); //qDebug( "EXPR: %s", exp.expression().toLatin1().data() );
qDebug( "SRSNAME: %s", srsName.toLatin1().data() ); //qDebug( "SRSNAME: %s", srsName.toLatin1().data() );
qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() ); //qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
QDomElement xmlElem = comparableElement( xmlText ); QDomElement xmlElem = comparableElement( xmlText );
QDomElement ogcElem = comparableElement( doc.toString( -1 ) ); QDomElement ogcElem = comparableElement( doc.toString( -1 ) );
@ -920,7 +1041,7 @@ void TestQgsOgcUtils::testSQLStatementToOgcFilter()
const QgsSQLStatement statement( statementText ); const QgsSQLStatement statement( statementText );
if ( !statement.hasParserError() ) if ( !statement.hasParserError() )
{ {
qDebug( "%s", statement.parserErrorString().toLatin1().data() ); //qDebug( "%s", statement.parserErrorString().toLatin1().data() );
QVERIFY( !statement.hasParserError() ); QVERIFY( !statement.hasParserError() );
} }
@ -940,6 +1061,7 @@ void TestQgsOgcUtils::testSQLStatementToOgcFilter()
doc.appendChild( filterElem ); doc.appendChild( filterElem );
#if 0
qDebug( "SQL: %s", statement.statement().toLatin1().data() ); qDebug( "SQL: %s", statement.statement().toLatin1().data() );
qDebug( "GML: %s", gmlVersion == QgsOgcUtils::GML_2_1_2 ? "2.1.2" : gmlVersion == QgsOgcUtils::GML_3_1_0 ? "3.1.0" qDebug( "GML: %s", gmlVersion == QgsOgcUtils::GML_2_1_2 ? "2.1.2" : gmlVersion == QgsOgcUtils::GML_3_1_0 ? "3.1.0"
: gmlVersion == QgsOgcUtils::GML_3_2_1 ? "3.2.1" : gmlVersion == QgsOgcUtils::GML_3_2_1 ? "3.2.1"
@ -948,6 +1070,7 @@ void TestQgsOgcUtils::testSQLStatementToOgcFilter()
: filterVersion == QgsOgcUtils::FILTER_FES_2_0 ? "FES 2.0" : filterVersion == QgsOgcUtils::FILTER_FES_2_0 ? "FES 2.0"
: "unknown" ); : "unknown" );
qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() ); qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
#endif
QDomElement xmlElem = comparableElement( xmlText ); QDomElement xmlElem = comparableElement( xmlText );
QDomElement ogcElem = comparableElement( doc.toString( -1 ) ); QDomElement ogcElem = comparableElement( doc.toString( -1 ) );
@ -1245,7 +1368,7 @@ void TestQgsOgcUtils::testExpressionToOgcFilterWithXPath()
QDomElement xmlElem = comparableElement( QStringLiteral( "<fes:Filter xmlns:fes=\"http://www.opengis.net/fes/2.0\"><fes:PropertyIsEqualTo><fes:ValueReference xmlns:otherns=\"https://otherns\" xmlns:myns=\"https://myns\">myns:foo/myns:bar/otherns:a</fes:ValueReference><fes:Literal>1</fes:Literal></fes:PropertyIsEqualTo></fes:Filter>" ) ); QDomElement xmlElem = comparableElement( QStringLiteral( "<fes:Filter xmlns:fes=\"http://www.opengis.net/fes/2.0\"><fes:PropertyIsEqualTo><fes:ValueReference xmlns:otherns=\"https://otherns\" xmlns:myns=\"https://myns\">myns:foo/myns:bar/otherns:a</fes:ValueReference><fes:Literal>1</fes:Literal></fes:PropertyIsEqualTo></fes:Filter>" ) );
doc.appendChild( filterElem ); doc.appendChild( filterElem );
qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() ); //qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
QDomElement ogcElem = comparableElement( doc.toString( -1 ) ); QDomElement ogcElem = comparableElement( doc.toString( -1 ) );
QVERIFY( QgsTestUtils::compareDomElements( xmlElem, ogcElem ) ); QVERIFY( QgsTestUtils::compareDomElements( xmlElem, ogcElem ) );
@ -1283,7 +1406,7 @@ void TestQgsOgcUtils::testSQLStatementToOgcFilterWithXPath()
QDomElement xmlElem = comparableElement( QStringLiteral( "<fes:Filter xmlns:fes=\"http://www.opengis.net/fes/2.0\"><fes:PropertyIsEqualTo><fes:ValueReference xmlns:otherns=\"https://otherns\" xmlns:myns=\"https://myns\">myns:foo/myns:bar/otherns:a</fes:ValueReference><fes:Literal>1</fes:Literal></fes:PropertyIsEqualTo></fes:Filter>" ) ); QDomElement xmlElem = comparableElement( QStringLiteral( "<fes:Filter xmlns:fes=\"http://www.opengis.net/fes/2.0\"><fes:PropertyIsEqualTo><fes:ValueReference xmlns:otherns=\"https://otherns\" xmlns:myns=\"https://myns\">myns:foo/myns:bar/otherns:a</fes:ValueReference><fes:Literal>1</fes:Literal></fes:PropertyIsEqualTo></fes:Filter>" ) );
doc.appendChild( filterElem ); doc.appendChild( filterElem );
qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() ); //qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
QDomElement ogcElem = comparableElement( doc.toString( -1 ) ); QDomElement ogcElem = comparableElement( doc.toString( -1 ) );
QVERIFY( QgsTestUtils::compareDomElements( xmlElem, ogcElem ) ); QVERIFY( QgsTestUtils::compareDomElements( xmlElem, ogcElem ) );

View File

@ -1057,18 +1057,18 @@ void TestQgsOgrUtils::testOgrUtilsStoredStyle()
symbol->setColor( QColor( 255, 0, 0 ) ); symbol->setColor( QColor( 255, 0, 0 ) );
renderer->setSymbol( symbol ); renderer->setSymbol( symbol );
vl.saveStyleToDatabase( "style1", "style1", false, QString(), error ); vl.saveStyleToDatabaseV2( "style1", "style1", false, QString(), error );
// Default // Default
symbol = renderer->symbol()->clone(); symbol = renderer->symbol()->clone();
symbol->setColor( QColor( 0, 255, 0 ) ); symbol->setColor( QColor( 0, 255, 0 ) );
renderer->setSymbol( symbol ); renderer->setSymbol( symbol );
vl.saveStyleToDatabase( "style2", "style2", true, QString(), error ); vl.saveStyleToDatabaseV2( "style2", "style2", true, QString(), error );
symbol = renderer->symbol()->clone(); symbol = renderer->symbol()->clone();
symbol->setColor( QColor( 0, 0, 255 ) ); symbol->setColor( QColor( 0, 0, 255 ) );
renderer->setSymbol( symbol ); renderer->setSymbol( symbol );
vl.saveStyleToDatabase( "style3", "style3", false, QString(), error ); vl.saveStyleToDatabaseV2( "style3", "style3", false, QString(), error );
} }
gdal::ogr_datasource_unique_ptr hDS( OGROpen( testFile.toUtf8().constData(), false, nullptr ) ); gdal::ogr_datasource_unique_ptr hDS( OGROpen( testFile.toUtf8().constData(), false, nullptr ) );

View File

@ -322,6 +322,7 @@ void TestQgsTracer::testAddPointsOnIntersections()
QgsTracer tracer; QgsTracer tracer;
tracer.setLayers( QList<QgsVectorLayer *>() << vl ); tracer.setLayers( QList<QgsVectorLayer *>() << vl );
tracer.setAddPointsOnIntersectionsEnabled( false );
QgsPolylineXY points = tracer.findShortestPath( QgsPointXY( 0, 0 ), QgsPointXY( 10, 10 ) ); QgsPolylineXY points = tracer.findShortestPath( QgsPointXY( 0, 0 ), QgsPointXY( 10, 10 ) );

View File

@ -147,6 +147,9 @@ class TestQgsAuthManager(QgisTestCase):
def test_040_authorities(self): def test_040_authorities(self):
# FIXME
self.skipTest("Broken test. See https://github.com/qgis/QGIS/issues/62373")
def rebuild_caches(): def rebuild_caches():
m = "Authorities cache could not be rebuilt" m = "Authorities cache could not be rebuilt"
self.assertTrue(self.authm.rebuildCaCertsCache(), m) self.assertTrue(self.authm.rebuildCaCertsCache(), m)
@ -660,6 +663,9 @@ class TestQgsAuthManager(QgisTestCase):
def test_150_verify_keychain(self): def test_150_verify_keychain(self):
"""Test the verify keychain function""" """Test the verify keychain function"""
# FIXME
self.skipTest("Broken test. See https://github.com/qgis/QGIS/issues/62373")
def testChain(path): def testChain(path):
# Test that a chain with an untrusted CA is not valid # Test that a chain with an untrusted CA is not valid
@ -736,6 +742,9 @@ class TestQgsAuthManager(QgisTestCase):
def test_validate_pki_bundle(self): def test_validate_pki_bundle(self):
"""Text the pki bundle validation""" """Text the pki bundle validation"""
# FIXME
self.skipTest("Broken test. See https://github.com/qgis/QGIS/issues/62373")
# Valid bundle: # Valid bundle:
bundle = self.mkPEMBundle( bundle = self.mkPEMBundle(
"fra_cert.pem", "fra_key.pem", "password", "chain_subissuer-issuer-root.pem" "fra_cert.pem", "fra_key.pem", "password", "chain_subissuer-issuer-root.pem"
@ -927,6 +936,9 @@ class TestQgsAuthManager(QgisTestCase):
def test_160_cert_viable(self): def test_160_cert_viable(self):
"""Text the viability of a given certificate""" """Text the viability of a given certificate"""
# FIXME
self.skipTest("Broken test. See https://github.com/qgis/QGIS/issues/62373")
# null cert # null cert
cert = QSslCertificate() cert = QSslCertificate()
self.assertFalse(QgsAuthCertUtils.certIsCurrent(cert)) self.assertFalse(QgsAuthCertUtils.certIsCurrent(cert))
@ -956,6 +968,9 @@ class TestQgsAuthManager(QgisTestCase):
def test_170_pki_key_encoding(self): def test_170_pki_key_encoding(self):
"""Test that a DER/PEM RSA/DSA/EC keys can be opened whatever the extension is""" """Test that a DER/PEM RSA/DSA/EC keys can be opened whatever the extension is"""
# FIXME
self.skipTest("Broken test. See https://github.com/qgis/QGIS/issues/62373")
self.assertFalse( self.assertFalse(
QgsAuthCertUtils.keyFromFile(PKIDATA + "/" + "ptolemy_key.pem").isNull() QgsAuthCertUtils.keyFromFile(PKIDATA + "/" + "ptolemy_key.pem").isNull()
) )

View File

@ -4527,6 +4527,21 @@ class TestQgsGeometry(QgisTestCase):
f"testReshape failed: mismatch Expected:\n{expWkt}\nGot:\n{wkt}\n", f"testReshape failed: mismatch Expected:\n{expWkt}\nGot:\n{wkt}\n",
) )
# test should not raise exception
expWkt = "Polygon ((0 0, 5 0, 5 2, 0 2, 0 0))"
g = QgsGeometry.fromWkt(expWkt)
self.assertEqual(
g.reshapeGeometry(
QgsLineString([QgsPoint(0, 0), QgsPoint(5, 0), QgsPoint(5, 2)])
),
QgsGeometry.OperationResult.NothingHappened,
)
wkt = g.asWkt()
self.assertTrue(
compareWkt(expWkt, wkt),
f"testReshape failed: mismatch Expected:\n{expWkt}\nGot:\n{wkt}\n",
)
def testConvertToMultiType(self): def testConvertToMultiType(self):
"""Test converting geometries to multi type""" """Test converting geometries to multi type"""
point = QgsGeometry.fromWkt("Point (1 2)") point = QgsGeometry.fromWkt("Point (1 2)")