Compare commits

...

28 Commits

Author SHA1 Message Date
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
45 changed files with 1528 additions and 729 deletions

View File

@ -59,7 +59,7 @@ endif()
#############################################################
# Project and version
set(CPACK_PACKAGE_VERSION_MAJOR "3")
set(CPACK_PACKAGE_VERSION_MINOR "43")
set(CPACK_PACKAGE_VERSION_MINOR "99")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(COMPLETE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
set(RELEASE_NAME "Master")

View File

@ -179,14 +179,16 @@ sudo apt-get update
|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 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`` |
| 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`` |
| 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`` |
| 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`` |
| 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`` |
| 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`` |
| 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`` |
| 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`` |
| 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 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 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 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 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 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`` |
| 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/`)

16
debian/changelog vendored
View File

@ -1,8 +1,20 @@
qgis (3.43.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
-- Jürgen E. Fischer <jef@norbit.de> Fri, 20 Jun 2025 14:09:51 +0200
qgis (3.43.0) unstable; urgency=medium
* New development version 3.43 after branch of 3.42
-- Jürgen E. Fischer <jef@norbit.de> Fri, 21 Feb 2025 14:15:07 +0100
-- Jürgen E. Fischer <jef@norbit.de> Fri, 20 Jun 2025 14:08:50 +0200
qgis (3.40.4) unstable; urgency=medium

3
debian/control vendored
View File

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

6
debian/control.in vendored
View File

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

5
debian/rules vendored
View File

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

View File

@ -33,6 +33,7 @@ the documentation</a> available.
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:
<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.40">3.40 (LTR)</a>,
<a href="https://qgis.org/api/3.38">3.38</a>,

View File

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

View File

@ -217,6 +217,8 @@ Creates an OGC expression XML element from the ``exp`` expression.
};
/************************************************************************
* 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.visibleName: src/core/numericformats/qgscoordinatenumericformat.h#L51
QgsGeographicCoordinateNumericFormat: src/core/numericformats/qgscoordinatenumericformat.h#L28
QgsGeometry.Error.Error: src/core/geometry/qgsgeometry.h#L2760
QgsGeometry.Error.__repr__: src/core/geometry/qgsgeometry.h#L2783
QgsGeometry.Error.hasWhere: src/core/geometry/qgsgeometry.h#L2780
QgsGeometry.Error.what: src/core/geometry/qgsgeometry.h#L2770
QgsGeometry.Error.where: src/core/geometry/qgsgeometry.h#L2775
QgsGeometry.Error: src/core/geometry/qgsgeometry.h#L2751
QgsGeometry.QVariant: src/core/geometry/qgsgeometry.h#L3180
QgsGeometry.QgsGeometry: src/core/geometry/qgsgeometry.h#L184
QgsGeometry.__repr__: src/core/geometry/qgsgeometry.h#L2185
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L930
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L948
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L966
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L982
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L939
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L957
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L975
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L914
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L921
QgsGeometry.addTopologicalPoint: src/core/geometry/qgsgeometry.h#L815
QgsGeometry.adjacentVertices: src/core/geometry/qgsgeometry.h#L778
QgsGeometry.angleAtVertex: src/core/geometry/qgsgeometry.h#L764
QgsGeometry.applyDashPattern: src/core/geometry/qgsgeometry.h#L1372
QgsGeometry.area: src/core/geometry/qgsgeometry.h#L476
QgsGeometry.asJson: src/core/geometry/qgsgeometry.h#L2204
QgsGeometry.asMultiPoint: src/core/geometry/qgsgeometry.h#L2418
QgsGeometry.asMultiPolygon: src/core/geometry/qgsgeometry.h#L2508
QgsGeometry.asMultiPolyline: src/core/geometry/qgsgeometry.h#L2463
QgsGeometry.asPoint: src/core/geometry/qgsgeometry.h#L2283
QgsGeometry.asPolygon: src/core/geometry/qgsgeometry.h#L2375
QgsGeometry.asPolyline: src/core/geometry/qgsgeometry.h#L2330
QgsGeometry.asQPointF: src/core/geometry/qgsgeometry.h#L2538
QgsGeometry.asQPolygonF: src/core/geometry/qgsgeometry.h#L2551
QgsGeometry.asWkb: src/core/geometry/qgsgeometry.h#L2175
QgsGeometry.asWkt: src/core/geometry/qgsgeometry.h#L2182
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2626
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2627
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2640
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2641
QgsGeometry.boundingBox3D: src/core/geometry/qgsgeometry.h#L1206
QgsGeometry.boundingBox: src/core/geometry/qgsgeometry.h#L1199
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1447
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1457
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1544
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1557
QgsGeometry.centroid: src/core/geometry/qgsgeometry.h#L1686
QgsGeometry.clipped: src/core/geometry/qgsgeometry.h#L2022
QgsGeometry.closestSegmentWithContext: src/core/geometry/qgsgeometry.h#L907
QgsGeometry.closestVertex: src/core/geometry/qgsgeometry.h#L747
QgsGeometry.closestVertexWithContext: src/core/geometry/qgsgeometry.h#L894
QgsGeometry.collectGeometry: src/core/geometry/qgsgeometry.h#L330
QgsGeometry.combine: src/core/geometry/qgsgeometry.h#L2038
QgsGeometry.compare: src/core/geometry/qgsgeometry.h#L3013
QgsGeometry.concaveHull: src/core/geometry/qgsgeometry.h#L1816
QgsGeometry.constGet: src/core/geometry/qgsgeometry.h#L205
QgsGeometry.constParts: src/core/geometry/qgsgeometry.h#L656
QgsGeometry.constrainedDelaunayTriangulation: src/core/geometry/qgsgeometry.h#L1858
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1462
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1469
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1480
QgsGeometry.convertGeometryCollectionToSubclass: src/core/geometry/qgsgeometry.h#L2613
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3167
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3174
QgsGeometry.convertToCurvedMultiType: src/core/geometry/qgsgeometry.h#L2591
QgsGeometry.convertToCurves: src/core/geometry/qgsgeometry.h#L1671
QgsGeometry.convertToMultiType: src/core/geometry/qgsgeometry.h#L2574
QgsGeometry.convertToSingleType: src/core/geometry/qgsgeometry.h#L2602
QgsGeometry.convertToStraightSegment: src/core/geometry/qgsgeometry.h#L2847
QgsGeometry.convertToType: src/core/geometry/qgsgeometry.h#L2256
QgsGeometry.convexHull: src/core/geometry/qgsgeometry.h#L1801
QgsGeometry.createGeometryEngine: src/core/geometry/qgsgeometry.h#L3160
QgsGeometry.createPolygonFromQPolygonF: src/core/geometry/qgsgeometry.h#L2956
QgsGeometry.createPolylineFromQPolygonF: src/core/geometry/qgsgeometry.h#L2947
QgsGeometry.createWedgeBuffer: src/core/geometry/qgsgeometry.h#L347
QgsGeometry.createWedgeBufferFromAngles: src/core/geometry/qgsgeometry.h#L363
QgsGeometry.crosses: src/core/geometry/qgsgeometry.h#L1535
QgsGeometry.delaunayTriangulation: src/core/geometry/qgsgeometry.h#L1844
QgsGeometry.deletePart: src/core/geometry/qgsgeometry.h#L2564
QgsGeometry.deleteRing: src/core/geometry/qgsgeometry.h#L2558
QgsGeometry.deleteVertex: src/core/geometry/qgsgeometry.h#L846
QgsGeometry.densifyByCount: src/core/geometry/qgsgeometry.h#L1639
QgsGeometry.densifyByDistance: src/core/geometry/qgsgeometry.h#L1654
QgsGeometry.difference: src/core/geometry/qgsgeometry.h#L2063
QgsGeometry.disjoint: src/core/geometry/qgsgeometry.h#L1491
QgsGeometry.distance: src/core/geometry/qgsgeometry.h#L500
QgsGeometry.distanceToVertex: src/core/geometry/qgsgeometry.h#L756
QgsGeometry.draw: src/core/geometry/qgsgeometry.h#L2866
QgsGeometry.equals: src/core/geometry/qgsgeometry.h#L414
QgsGeometry.extendLine: src/core/geometry/qgsgeometry.h#L1626
QgsGeometry.extrude: src/core/geometry/qgsgeometry.h#L2079
QgsGeometry.forcePolygonClockwise: src/core/geometry/qgsgeometry.h#L2733
QgsGeometry.forcePolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2745
QgsGeometry.forceRHR: src/core/geometry/qgsgeometry.h#L2721
QgsGeometry.frechetDistance: src/core/geometry/qgsgeometry.h#L709
QgsGeometry.frechetDistanceDensify: src/core/geometry/qgsgeometry.h#L733
QgsGeometry.fromBox3D: src/core/geometry/qgsgeometry.h#L326
QgsGeometry.fromMultiPointXY: src/core/geometry/qgsgeometry.h#L255
QgsGeometry.fromMultiPolygonXY: src/core/geometry/qgsgeometry.h#L314
QgsGeometry.fromMultiPolylineXY: src/core/geometry/qgsgeometry.h#L282
QgsGeometry.fromPoint: src/core/geometry/qgsgeometry.h#L252
QgsGeometry.fromPointXY: src/core/geometry/qgsgeometry.h#L245
QgsGeometry.fromPolygonXY: src/core/geometry/qgsgeometry.h#L309
QgsGeometry.fromPolyline: src/core/geometry/qgsgeometry.h#L277
QgsGeometry.fromPolylineXY: src/core/geometry/qgsgeometry.h#L267
QgsGeometry.fromQPointF: src/core/geometry/qgsgeometry.h#L2930
QgsGeometry.fromQPolygonF: src/core/geometry/qgsgeometry.h#L2938
QgsGeometry.fromRect: src/core/geometry/qgsgeometry.h#L317
QgsGeometry.fromWkb: src/core/geometry/qgsgeometry.h#L376
QgsGeometry.fromWkt: src/core/geometry/qgsgeometry.h#L243
QgsGeometry.get: src/core/geometry/qgsgeometry.h#L218
QgsGeometry.hausdorffDistance: src/core/geometry/qgsgeometry.h#L674
QgsGeometry.hausdorffDistanceDensify: src/core/geometry/qgsgeometry.h#L693
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L792
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L806
QgsGeometry.interpolate: src/core/geometry/qgsgeometry.h#L1979
QgsGeometry.interpolateAngle: src/core/geometry/qgsgeometry.h#L2001
QgsGeometry.intersection: src/core/geometry/qgsgeometry.h#L2014
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1421
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1437
QgsGeometry.isAxisParallelRectangle: src/core/geometry/qgsgeometry.h#L463
QgsGeometry.isEmpty: src/core/geometry/qgsgeometry.h#L396
QgsGeometry.isGeosEqual: src/core/geometry/qgsgeometry.h#L431
QgsGeometry.isGeosValid: src/core/geometry/qgsgeometry.h#L439
QgsGeometry.isMultipart: src/core/geometry/qgsgeometry.h#L399
QgsGeometry.isNull: src/core/geometry/qgsgeometry.h#L240
QgsGeometry.isPolygonClockwise: src/core/geometry/qgsgeometry.h#L2704
QgsGeometry.isPolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2689
QgsGeometry.isSimple: src/core/geometry/qgsgeometry.h#L448
QgsGeometry.largestEmptyCircle: src/core/geometry/qgsgeometry.h#L1739
QgsGeometry.lastError: src/core/geometry/qgsgeometry.h#L2897
QgsGeometry.length: src/core/geometry/qgsgeometry.h#L491
QgsGeometry.lineLocatePoint: src/core/geometry/qgsgeometry.h#L1991
QgsGeometry.makeDifference: src/core/geometry/qgsgeometry.h#L1193
QgsGeometry.makeValid: src/core/geometry/qgsgeometry.h#L2663
QgsGeometry.mapToPixel: src/core/geometry/qgsgeometry.h#L2860
QgsGeometry.mergeLines: src/core/geometry/qgsgeometry.h#L2050
QgsGeometry.minimalEnclosingCircle: src/core/geometry/qgsgeometry.h#L1240
QgsGeometry.minimumClearance: src/core/geometry/qgsgeometry.h#L1778
QgsGeometry.minimumClearanceLine: src/core/geometry/qgsgeometry.h#L1791
QgsGeometry.minimumWidth: src/core/geometry/qgsgeometry.h#L1755
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L824
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L833
QgsGeometry.nearestPoint: src/core/geometry/qgsgeometry.h#L875
QgsGeometry.node: src/core/geometry/qgsgeometry.h#L1924
QgsGeometry.normalize: src/core/geometry/qgsgeometry.h#L2820
QgsGeometry.offsetCurve: src/core/geometry/qgsgeometry.h#L1566
QgsGeometry.orientedMinimumBoundingBox: src/core/geometry/qgsgeometry.h#L1220
QgsGeometry.orthogonalize: src/core/geometry/qgsgeometry.h#L1255
QgsGeometry.overlaps: src/core/geometry/qgsgeometry.h#L1513
QgsGeometry.parts: src/core/geometry/qgsgeometry.h#L622
QgsGeometry.pointOnSurface: src/core/geometry/qgsgeometry.h#L1701
QgsGeometry.poleOfInaccessibility: src/core/geometry/qgsgeometry.h#L1714
QgsGeometry.polygonOrientation: src/core/geometry/qgsgeometry.h#L2674
QgsGeometry.polygonize: src/core/geometry/qgsgeometry.h#L2839
QgsGeometry.randomPointsInPolygon: src/core/geometry/qgsgeometry.h#L2136
QgsGeometry.removeDuplicateNodes: src/core/geometry/qgsgeometry.h#L1410
QgsGeometry.removeInteriorRings: src/core/geometry/qgsgeometry.h#L989
QgsGeometry.requiresConversionToStraightSegments: src/core/geometry/qgsgeometry.h#L2854
QgsGeometry.reshapeGeometry: src/core/geometry/qgsgeometry.h#L1178
QgsGeometry.rotate: src/core/geometry/qgsgeometry.h#L1029
QgsGeometry.roundWaves: src/core/geometry/qgsgeometry.h#L1337
QgsGeometry.roundWavesRandomized: src/core/geometry/qgsgeometry.h#L1357
QgsGeometry.set: src/core/geometry/qgsgeometry.h#L231
QgsGeometry.sharedPaths: src/core/geometry/qgsgeometry.h#L1940
QgsGeometry.shortestLine: src/core/geometry/qgsgeometry.h#L886
QgsGeometry.simplify: src/core/geometry/qgsgeometry.h#L1629
QgsGeometry.simplifyCoverageVW: src/core/geometry/qgsgeometry.h#L1899
QgsGeometry.singleSidedBuffer: src/core/geometry/qgsgeometry.h#L1582
QgsGeometry.smooth: src/core/geometry/qgsgeometry.h#L3118
QgsGeometry.snappedToGrid: src/core/geometry/qgsgeometry.h#L1389
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1092
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1172
QgsGeometry.sqrDistToVertexAt: src/core/geometry/qgsgeometry.h#L869
QgsGeometry.squareWaves: src/core/geometry/qgsgeometry.h#L1303
QgsGeometry.squareWavesRandomized: src/core/geometry/qgsgeometry.h#L1323
QgsGeometry.subdivide: src/core/geometry/qgsgeometry.h#L1963
QgsGeometry.symDifference: src/core/geometry/qgsgeometry.h#L2076
QgsGeometry.taperedBuffer: src/core/geometry/qgsgeometry.h#L1603
QgsGeometry.toggleCircularAtVertex: src/core/geometry/qgsgeometry.h#L855
QgsGeometry.touches: src/core/geometry/qgsgeometry.h#L1502
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1011
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1021
QgsGeometry.translate: src/core/geometry/qgsgeometry.h#L995
QgsGeometry.triangularWaves: src/core/geometry/qgsgeometry.h#L1269
QgsGeometry.triangularWavesRandomized: src/core/geometry/qgsgeometry.h#L1289
QgsGeometry.type: src/core/geometry/qgsgeometry.h#L388
QgsGeometry.unaryUnion: src/core/geometry/qgsgeometry.h#L2830
QgsGeometry.unionCoverage: src/core/geometry/qgsgeometry.h#L1912
QgsGeometry.validateCoverage: src/core/geometry/qgsgeometry.h#L1877
QgsGeometry.validateGeometry: src/core/geometry/qgsgeometry.h#L2809
QgsGeometry.variableWidthBufferByM: src/core/geometry/qgsgeometry.h#L1619
QgsGeometry.vertexAt: src/core/geometry/qgsgeometry.h#L862
QgsGeometry.vertexIdFromVertexNr: src/core/geometry/qgsgeometry.h#L2877
QgsGeometry.vertexNrFromVertexId: src/core/geometry/qgsgeometry.h#L2889
QgsGeometry.vertices: src/core/geometry/qgsgeometry.h#L540
QgsGeometry.voronoiDiagram: src/core/geometry/qgsgeometry.h#L1832
QgsGeometry.within: src/core/geometry/qgsgeometry.h#L1524
QgsGeometry.wkbSize: src/core/geometry/qgsgeometry.h#L2167
QgsGeometry.wkbType: src/core/geometry/qgsgeometry.h#L382
QgsGeometry: src/core/geometry/qgsgeometry.h#L161
QgsGeometry.Error.Error: src/core/geometry/qgsgeometry.h#L2777
QgsGeometry.Error.__repr__: src/core/geometry/qgsgeometry.h#L2800
QgsGeometry.Error.hasWhere: src/core/geometry/qgsgeometry.h#L2797
QgsGeometry.Error.what: src/core/geometry/qgsgeometry.h#L2787
QgsGeometry.Error.where: src/core/geometry/qgsgeometry.h#L2792
QgsGeometry.Error: src/core/geometry/qgsgeometry.h#L2768
QgsGeometry.QVariant: src/core/geometry/qgsgeometry.h#L3197
QgsGeometry.QgsGeometry: src/core/geometry/qgsgeometry.h#L201
QgsGeometry.__repr__: src/core/geometry/qgsgeometry.h#L2202
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L947
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L965
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L983
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L999
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L956
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L974
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L992
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L931
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L938
QgsGeometry.addTopologicalPoint: src/core/geometry/qgsgeometry.h#L832
QgsGeometry.adjacentVertices: src/core/geometry/qgsgeometry.h#L795
QgsGeometry.angleAtVertex: src/core/geometry/qgsgeometry.h#L781
QgsGeometry.applyDashPattern: src/core/geometry/qgsgeometry.h#L1389
QgsGeometry.area: src/core/geometry/qgsgeometry.h#L493
QgsGeometry.asJson: src/core/geometry/qgsgeometry.h#L2221
QgsGeometry.asMultiPoint: src/core/geometry/qgsgeometry.h#L2435
QgsGeometry.asMultiPolygon: src/core/geometry/qgsgeometry.h#L2525
QgsGeometry.asMultiPolyline: src/core/geometry/qgsgeometry.h#L2480
QgsGeometry.asPoint: src/core/geometry/qgsgeometry.h#L2300
QgsGeometry.asPolygon: src/core/geometry/qgsgeometry.h#L2392
QgsGeometry.asPolyline: src/core/geometry/qgsgeometry.h#L2347
QgsGeometry.asQPointF: src/core/geometry/qgsgeometry.h#L2555
QgsGeometry.asQPolygonF: src/core/geometry/qgsgeometry.h#L2568
QgsGeometry.asWkb: src/core/geometry/qgsgeometry.h#L2192
QgsGeometry.asWkt: src/core/geometry/qgsgeometry.h#L2199
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2643
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2644
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2657
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2658
QgsGeometry.boundingBox3D: src/core/geometry/qgsgeometry.h#L1223
QgsGeometry.boundingBox: src/core/geometry/qgsgeometry.h#L1216
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1464
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1474
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1561
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1574
QgsGeometry.centroid: src/core/geometry/qgsgeometry.h#L1703
QgsGeometry.clipped: src/core/geometry/qgsgeometry.h#L2039
QgsGeometry.closestSegmentWithContext: src/core/geometry/qgsgeometry.h#L924
QgsGeometry.closestVertex: src/core/geometry/qgsgeometry.h#L764
QgsGeometry.closestVertexWithContext: src/core/geometry/qgsgeometry.h#L911
QgsGeometry.collectGeometry: src/core/geometry/qgsgeometry.h#L347
QgsGeometry.combine: src/core/geometry/qgsgeometry.h#L2055
QgsGeometry.compare: src/core/geometry/qgsgeometry.h#L3030
QgsGeometry.concaveHull: src/core/geometry/qgsgeometry.h#L1833
QgsGeometry.constGet: src/core/geometry/qgsgeometry.h#L222
QgsGeometry.constParts: src/core/geometry/qgsgeometry.h#L673
QgsGeometry.constrainedDelaunayTriangulation: src/core/geometry/qgsgeometry.h#L1875
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1479
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1486
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1497
QgsGeometry.convertGeometryCollectionToSubclass: src/core/geometry/qgsgeometry.h#L2630
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3184
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3191
QgsGeometry.convertToCurvedMultiType: src/core/geometry/qgsgeometry.h#L2608
QgsGeometry.convertToCurves: src/core/geometry/qgsgeometry.h#L1688
QgsGeometry.convertToMultiType: src/core/geometry/qgsgeometry.h#L2591
QgsGeometry.convertToSingleType: src/core/geometry/qgsgeometry.h#L2619
QgsGeometry.convertToStraightSegment: src/core/geometry/qgsgeometry.h#L2864
QgsGeometry.convertToType: src/core/geometry/qgsgeometry.h#L2273
QgsGeometry.convexHull: src/core/geometry/qgsgeometry.h#L1818
QgsGeometry.createGeometryEngine: src/core/geometry/qgsgeometry.h#L3177
QgsGeometry.createPolygonFromQPolygonF: src/core/geometry/qgsgeometry.h#L2973
QgsGeometry.createPolylineFromQPolygonF: src/core/geometry/qgsgeometry.h#L2964
QgsGeometry.createWedgeBuffer: src/core/geometry/qgsgeometry.h#L364
QgsGeometry.createWedgeBufferFromAngles: src/core/geometry/qgsgeometry.h#L380
QgsGeometry.crosses: src/core/geometry/qgsgeometry.h#L1552
QgsGeometry.delaunayTriangulation: src/core/geometry/qgsgeometry.h#L1861
QgsGeometry.deletePart: src/core/geometry/qgsgeometry.h#L2581
QgsGeometry.deleteRing: src/core/geometry/qgsgeometry.h#L2575
QgsGeometry.deleteVertex: src/core/geometry/qgsgeometry.h#L863
QgsGeometry.densifyByCount: src/core/geometry/qgsgeometry.h#L1656
QgsGeometry.densifyByDistance: src/core/geometry/qgsgeometry.h#L1671
QgsGeometry.difference: src/core/geometry/qgsgeometry.h#L2080
QgsGeometry.disjoint: src/core/geometry/qgsgeometry.h#L1508
QgsGeometry.distance: src/core/geometry/qgsgeometry.h#L517
QgsGeometry.distanceToVertex: src/core/geometry/qgsgeometry.h#L773
QgsGeometry.draw: src/core/geometry/qgsgeometry.h#L2883
QgsGeometry.equals: src/core/geometry/qgsgeometry.h#L431
QgsGeometry.extendLine: src/core/geometry/qgsgeometry.h#L1643
QgsGeometry.extrude: src/core/geometry/qgsgeometry.h#L2096
QgsGeometry.forcePolygonClockwise: src/core/geometry/qgsgeometry.h#L2750
QgsGeometry.forcePolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2762
QgsGeometry.forceRHR: src/core/geometry/qgsgeometry.h#L2738
QgsGeometry.frechetDistance: src/core/geometry/qgsgeometry.h#L726
QgsGeometry.frechetDistanceDensify: src/core/geometry/qgsgeometry.h#L750
QgsGeometry.fromBox3D: src/core/geometry/qgsgeometry.h#L343
QgsGeometry.fromMultiPointXY: src/core/geometry/qgsgeometry.h#L272
QgsGeometry.fromMultiPolygonXY: src/core/geometry/qgsgeometry.h#L331
QgsGeometry.fromMultiPolylineXY: src/core/geometry/qgsgeometry.h#L299
QgsGeometry.fromPoint: src/core/geometry/qgsgeometry.h#L269
QgsGeometry.fromPointXY: src/core/geometry/qgsgeometry.h#L262
QgsGeometry.fromPolygonXY: src/core/geometry/qgsgeometry.h#L326
QgsGeometry.fromPolyline: src/core/geometry/qgsgeometry.h#L294
QgsGeometry.fromPolylineXY: src/core/geometry/qgsgeometry.h#L284
QgsGeometry.fromQPointF: src/core/geometry/qgsgeometry.h#L2947
QgsGeometry.fromQPolygonF: src/core/geometry/qgsgeometry.h#L2955
QgsGeometry.fromRect: src/core/geometry/qgsgeometry.h#L334
QgsGeometry.fromWkb: src/core/geometry/qgsgeometry.h#L393
QgsGeometry.fromWkt: src/core/geometry/qgsgeometry.h#L260
QgsGeometry.get: src/core/geometry/qgsgeometry.h#L235
QgsGeometry.hausdorffDistance: src/core/geometry/qgsgeometry.h#L691
QgsGeometry.hausdorffDistanceDensify: src/core/geometry/qgsgeometry.h#L710
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L809
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L823
QgsGeometry.interpolate: src/core/geometry/qgsgeometry.h#L1996
QgsGeometry.interpolateAngle: src/core/geometry/qgsgeometry.h#L2018
QgsGeometry.intersection: src/core/geometry/qgsgeometry.h#L2031
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1438
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1454
QgsGeometry.isAxisParallelRectangle: src/core/geometry/qgsgeometry.h#L480
QgsGeometry.isEmpty: src/core/geometry/qgsgeometry.h#L413
QgsGeometry.isGeosEqual: src/core/geometry/qgsgeometry.h#L448
QgsGeometry.isGeosValid: src/core/geometry/qgsgeometry.h#L456
QgsGeometry.isMultipart: src/core/geometry/qgsgeometry.h#L416
QgsGeometry.isNull: src/core/geometry/qgsgeometry.h#L257
QgsGeometry.isPolygonClockwise: src/core/geometry/qgsgeometry.h#L2721
QgsGeometry.isPolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2706
QgsGeometry.isSimple: src/core/geometry/qgsgeometry.h#L465
QgsGeometry.largestEmptyCircle: src/core/geometry/qgsgeometry.h#L1756
QgsGeometry.lastError: src/core/geometry/qgsgeometry.h#L2914
QgsGeometry.length: src/core/geometry/qgsgeometry.h#L508
QgsGeometry.lineLocatePoint: src/core/geometry/qgsgeometry.h#L2008
QgsGeometry.makeDifference: src/core/geometry/qgsgeometry.h#L1210
QgsGeometry.makeValid: src/core/geometry/qgsgeometry.h#L2680
QgsGeometry.mapToPixel: src/core/geometry/qgsgeometry.h#L2877
QgsGeometry.mergeLines: src/core/geometry/qgsgeometry.h#L2067
QgsGeometry.minimalEnclosingCircle: src/core/geometry/qgsgeometry.h#L1257
QgsGeometry.minimumClearance: src/core/geometry/qgsgeometry.h#L1795
QgsGeometry.minimumClearanceLine: src/core/geometry/qgsgeometry.h#L1808
QgsGeometry.minimumWidth: src/core/geometry/qgsgeometry.h#L1772
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L841
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L850
QgsGeometry.nearestPoint: src/core/geometry/qgsgeometry.h#L892
QgsGeometry.node: src/core/geometry/qgsgeometry.h#L1941
QgsGeometry.normalize: src/core/geometry/qgsgeometry.h#L2837
QgsGeometry.offsetCurve: src/core/geometry/qgsgeometry.h#L1583
QgsGeometry.orientedMinimumBoundingBox: src/core/geometry/qgsgeometry.h#L1237
QgsGeometry.orthogonalize: src/core/geometry/qgsgeometry.h#L1272
QgsGeometry.overlaps: src/core/geometry/qgsgeometry.h#L1530
QgsGeometry.parts: src/core/geometry/qgsgeometry.h#L639
QgsGeometry.pointOnSurface: src/core/geometry/qgsgeometry.h#L1718
QgsGeometry.poleOfInaccessibility: src/core/geometry/qgsgeometry.h#L1731
QgsGeometry.polygonOrientation: src/core/geometry/qgsgeometry.h#L2691
QgsGeometry.polygonize: src/core/geometry/qgsgeometry.h#L2856
QgsGeometry.randomPointsInPolygon: src/core/geometry/qgsgeometry.h#L2153
QgsGeometry.removeDuplicateNodes: src/core/geometry/qgsgeometry.h#L1427
QgsGeometry.removeInteriorRings: src/core/geometry/qgsgeometry.h#L1006
QgsGeometry.requiresConversionToStraightSegments: src/core/geometry/qgsgeometry.h#L2871
QgsGeometry.reshapeGeometry: src/core/geometry/qgsgeometry.h#L1195
QgsGeometry.rotate: src/core/geometry/qgsgeometry.h#L1046
QgsGeometry.roundWaves: src/core/geometry/qgsgeometry.h#L1354
QgsGeometry.roundWavesRandomized: src/core/geometry/qgsgeometry.h#L1374
QgsGeometry.set: src/core/geometry/qgsgeometry.h#L248
QgsGeometry.sharedPaths: src/core/geometry/qgsgeometry.h#L1957
QgsGeometry.shortestLine: src/core/geometry/qgsgeometry.h#L903
QgsGeometry.simplify: src/core/geometry/qgsgeometry.h#L1646
QgsGeometry.simplifyCoverageVW: src/core/geometry/qgsgeometry.h#L1916
QgsGeometry.singleSidedBuffer: src/core/geometry/qgsgeometry.h#L1599
QgsGeometry.smooth: src/core/geometry/qgsgeometry.h#L3135
QgsGeometry.snappedToGrid: src/core/geometry/qgsgeometry.h#L1406
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1109
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1189
QgsGeometry.sqrDistToVertexAt: src/core/geometry/qgsgeometry.h#L886
QgsGeometry.squareWaves: src/core/geometry/qgsgeometry.h#L1320
QgsGeometry.squareWavesRandomized: src/core/geometry/qgsgeometry.h#L1340
QgsGeometry.subdivide: src/core/geometry/qgsgeometry.h#L1980
QgsGeometry.symDifference: src/core/geometry/qgsgeometry.h#L2093
QgsGeometry.taperedBuffer: src/core/geometry/qgsgeometry.h#L1620
QgsGeometry.toggleCircularAtVertex: src/core/geometry/qgsgeometry.h#L872
QgsGeometry.touches: src/core/geometry/qgsgeometry.h#L1519
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1028
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1038
QgsGeometry.translate: src/core/geometry/qgsgeometry.h#L1012
QgsGeometry.triangularWaves: src/core/geometry/qgsgeometry.h#L1286
QgsGeometry.triangularWavesRandomized: src/core/geometry/qgsgeometry.h#L1306
QgsGeometry.type: src/core/geometry/qgsgeometry.h#L405
QgsGeometry.unaryUnion: src/core/geometry/qgsgeometry.h#L2847
QgsGeometry.unionCoverage: src/core/geometry/qgsgeometry.h#L1929
QgsGeometry.validateCoverage: src/core/geometry/qgsgeometry.h#L1894
QgsGeometry.validateGeometry: src/core/geometry/qgsgeometry.h#L2826
QgsGeometry.variableWidthBufferByM: src/core/geometry/qgsgeometry.h#L1636
QgsGeometry.vertexAt: src/core/geometry/qgsgeometry.h#L879
QgsGeometry.vertexIdFromVertexNr: src/core/geometry/qgsgeometry.h#L2894
QgsGeometry.vertexNrFromVertexId: src/core/geometry/qgsgeometry.h#L2906
QgsGeometry.vertices: src/core/geometry/qgsgeometry.h#L557
QgsGeometry.voronoiDiagram: src/core/geometry/qgsgeometry.h#L1849
QgsGeometry.within: src/core/geometry/qgsgeometry.h#L1541
QgsGeometry.wkbSize: src/core/geometry/qgsgeometry.h#L2184
QgsGeometry.wkbType: src/core/geometry/qgsgeometry.h#L399
QgsGeometry: src/core/geometry/qgsgeometry.h#L178
QgsGeometryCollection.__bool__: src/core/geometry/qgsgeometrycollection.h#L136
QgsGeometryCollection.__delitem__: src/core/geometry/qgsgeometrycollection.h#L401
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.setStrokedPathSegments: src/core/painting/qgsgeometrypaintdevice.h#L140
QgsGeometryPaintDevice: src/core/painting/qgsgeometrypaintdevice.h#L122
QgsGeometryParameters.gridSize: src/core/geometry/qgsgeometry.h#L122
QgsGeometryParameters.setGridSize: src/core/geometry/qgsgeometry.h#L134
QgsGeometryParameters: src/core/geometry/qgsgeometry.h#L108
QgsGeometryParameters.gridSize: src/core/geometry/qgsgeometry.h#L139
QgsGeometryParameters.setGridSize: src/core/geometry/qgsgeometry.h#L151
QgsGeometryParameters: src/core/geometry/qgsgeometry.h#L125
QgsGeometryPartIterator.__iter__: src/core/geometry/qgsabstractgeometry.h#L1286
QgsGeometryPartIterator.__next__: src/core/geometry/qgsabstractgeometry.h#L1291
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.spreadUnit: src/core/effects/qgsgloweffect.h#L91
QgsGlowEffect: src/core/effects/qgsgloweffect.h#L37
QgsGml.crs: src/core/qgsgml.h#L431
QgsGml.dataProgressAndSteps: src/core/qgsgml.h#L455
QgsGml.dataReadProgress: src/core/qgsgml.h#L440
QgsGml.getFeatures: src/core/qgsgml.h#L408
QgsGml.getFeatures: src/core/qgsgml.h#L420
QgsGml.totalStepsUpdate: src/core/qgsgml.h#L447
QgsGml: src/core/qgsgml.h#L387
QgsGml.crs: src/core/qgsgml.h#L432
QgsGml.dataProgressAndSteps: src/core/qgsgml.h#L456
QgsGml.dataReadProgress: src/core/qgsgml.h#L441
QgsGml.getFeatures: src/core/qgsgml.h#L409
QgsGml.getFeatures: src/core/qgsgml.h#L421
QgsGml.totalStepsUpdate: src/core/qgsgml.h#L448
QgsGml: src/core/qgsgml.h#L388
QgsGmlFeatureClass.fieldIndex: src/core/qgsgmlschema.h#L49
QgsGmlFeatureClass.path: src/core/qgsgmlschema.h#L51
QgsGmlFeatureClass: src/core/qgsgmlschema.h#L40

View File

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

View File

@ -217,6 +217,8 @@ Creates an OGC expression XML element from the ``exp`` expression.
};
/************************************************************************
* 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.visibleName: src/core/numericformats/qgscoordinatenumericformat.h#L51
QgsGeographicCoordinateNumericFormat: src/core/numericformats/qgscoordinatenumericformat.h#L28
QgsGeometry.Error.Error: src/core/geometry/qgsgeometry.h#L2760
QgsGeometry.Error.__repr__: src/core/geometry/qgsgeometry.h#L2783
QgsGeometry.Error.hasWhere: src/core/geometry/qgsgeometry.h#L2780
QgsGeometry.Error.what: src/core/geometry/qgsgeometry.h#L2770
QgsGeometry.Error.where: src/core/geometry/qgsgeometry.h#L2775
QgsGeometry.Error: src/core/geometry/qgsgeometry.h#L2751
QgsGeometry.QVariant: src/core/geometry/qgsgeometry.h#L3180
QgsGeometry.QgsGeometry: src/core/geometry/qgsgeometry.h#L184
QgsGeometry.__repr__: src/core/geometry/qgsgeometry.h#L2185
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L930
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L948
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L966
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L982
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L939
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L957
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L975
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L914
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L921
QgsGeometry.addTopologicalPoint: src/core/geometry/qgsgeometry.h#L815
QgsGeometry.adjacentVertices: src/core/geometry/qgsgeometry.h#L778
QgsGeometry.angleAtVertex: src/core/geometry/qgsgeometry.h#L764
QgsGeometry.applyDashPattern: src/core/geometry/qgsgeometry.h#L1372
QgsGeometry.area: src/core/geometry/qgsgeometry.h#L476
QgsGeometry.asJson: src/core/geometry/qgsgeometry.h#L2204
QgsGeometry.asMultiPoint: src/core/geometry/qgsgeometry.h#L2418
QgsGeometry.asMultiPolygon: src/core/geometry/qgsgeometry.h#L2508
QgsGeometry.asMultiPolyline: src/core/geometry/qgsgeometry.h#L2463
QgsGeometry.asPoint: src/core/geometry/qgsgeometry.h#L2283
QgsGeometry.asPolygon: src/core/geometry/qgsgeometry.h#L2375
QgsGeometry.asPolyline: src/core/geometry/qgsgeometry.h#L2330
QgsGeometry.asQPointF: src/core/geometry/qgsgeometry.h#L2538
QgsGeometry.asQPolygonF: src/core/geometry/qgsgeometry.h#L2551
QgsGeometry.asWkb: src/core/geometry/qgsgeometry.h#L2175
QgsGeometry.asWkt: src/core/geometry/qgsgeometry.h#L2182
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2626
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2627
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2640
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2641
QgsGeometry.boundingBox3D: src/core/geometry/qgsgeometry.h#L1206
QgsGeometry.boundingBox: src/core/geometry/qgsgeometry.h#L1199
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1447
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1457
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1544
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1557
QgsGeometry.centroid: src/core/geometry/qgsgeometry.h#L1686
QgsGeometry.clipped: src/core/geometry/qgsgeometry.h#L2022
QgsGeometry.closestSegmentWithContext: src/core/geometry/qgsgeometry.h#L907
QgsGeometry.closestVertex: src/core/geometry/qgsgeometry.h#L747
QgsGeometry.closestVertexWithContext: src/core/geometry/qgsgeometry.h#L894
QgsGeometry.collectGeometry: src/core/geometry/qgsgeometry.h#L330
QgsGeometry.combine: src/core/geometry/qgsgeometry.h#L2038
QgsGeometry.compare: src/core/geometry/qgsgeometry.h#L3013
QgsGeometry.concaveHull: src/core/geometry/qgsgeometry.h#L1816
QgsGeometry.constGet: src/core/geometry/qgsgeometry.h#L205
QgsGeometry.constParts: src/core/geometry/qgsgeometry.h#L656
QgsGeometry.constrainedDelaunayTriangulation: src/core/geometry/qgsgeometry.h#L1858
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1462
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1469
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1480
QgsGeometry.convertGeometryCollectionToSubclass: src/core/geometry/qgsgeometry.h#L2613
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3167
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3174
QgsGeometry.convertToCurvedMultiType: src/core/geometry/qgsgeometry.h#L2591
QgsGeometry.convertToCurves: src/core/geometry/qgsgeometry.h#L1671
QgsGeometry.convertToMultiType: src/core/geometry/qgsgeometry.h#L2574
QgsGeometry.convertToSingleType: src/core/geometry/qgsgeometry.h#L2602
QgsGeometry.convertToStraightSegment: src/core/geometry/qgsgeometry.h#L2847
QgsGeometry.convertToType: src/core/geometry/qgsgeometry.h#L2256
QgsGeometry.convexHull: src/core/geometry/qgsgeometry.h#L1801
QgsGeometry.createGeometryEngine: src/core/geometry/qgsgeometry.h#L3160
QgsGeometry.createPolygonFromQPolygonF: src/core/geometry/qgsgeometry.h#L2956
QgsGeometry.createPolylineFromQPolygonF: src/core/geometry/qgsgeometry.h#L2947
QgsGeometry.createWedgeBuffer: src/core/geometry/qgsgeometry.h#L347
QgsGeometry.createWedgeBufferFromAngles: src/core/geometry/qgsgeometry.h#L363
QgsGeometry.crosses: src/core/geometry/qgsgeometry.h#L1535
QgsGeometry.delaunayTriangulation: src/core/geometry/qgsgeometry.h#L1844
QgsGeometry.deletePart: src/core/geometry/qgsgeometry.h#L2564
QgsGeometry.deleteRing: src/core/geometry/qgsgeometry.h#L2558
QgsGeometry.deleteVertex: src/core/geometry/qgsgeometry.h#L846
QgsGeometry.densifyByCount: src/core/geometry/qgsgeometry.h#L1639
QgsGeometry.densifyByDistance: src/core/geometry/qgsgeometry.h#L1654
QgsGeometry.difference: src/core/geometry/qgsgeometry.h#L2063
QgsGeometry.disjoint: src/core/geometry/qgsgeometry.h#L1491
QgsGeometry.distance: src/core/geometry/qgsgeometry.h#L500
QgsGeometry.distanceToVertex: src/core/geometry/qgsgeometry.h#L756
QgsGeometry.draw: src/core/geometry/qgsgeometry.h#L2866
QgsGeometry.equals: src/core/geometry/qgsgeometry.h#L414
QgsGeometry.extendLine: src/core/geometry/qgsgeometry.h#L1626
QgsGeometry.extrude: src/core/geometry/qgsgeometry.h#L2079
QgsGeometry.forcePolygonClockwise: src/core/geometry/qgsgeometry.h#L2733
QgsGeometry.forcePolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2745
QgsGeometry.forceRHR: src/core/geometry/qgsgeometry.h#L2721
QgsGeometry.frechetDistance: src/core/geometry/qgsgeometry.h#L709
QgsGeometry.frechetDistanceDensify: src/core/geometry/qgsgeometry.h#L733
QgsGeometry.fromBox3D: src/core/geometry/qgsgeometry.h#L326
QgsGeometry.fromMultiPointXY: src/core/geometry/qgsgeometry.h#L255
QgsGeometry.fromMultiPolygonXY: src/core/geometry/qgsgeometry.h#L314
QgsGeometry.fromMultiPolylineXY: src/core/geometry/qgsgeometry.h#L282
QgsGeometry.fromPoint: src/core/geometry/qgsgeometry.h#L252
QgsGeometry.fromPointXY: src/core/geometry/qgsgeometry.h#L245
QgsGeometry.fromPolygonXY: src/core/geometry/qgsgeometry.h#L309
QgsGeometry.fromPolyline: src/core/geometry/qgsgeometry.h#L277
QgsGeometry.fromPolylineXY: src/core/geometry/qgsgeometry.h#L267
QgsGeometry.fromQPointF: src/core/geometry/qgsgeometry.h#L2930
QgsGeometry.fromQPolygonF: src/core/geometry/qgsgeometry.h#L2938
QgsGeometry.fromRect: src/core/geometry/qgsgeometry.h#L317
QgsGeometry.fromWkb: src/core/geometry/qgsgeometry.h#L376
QgsGeometry.fromWkt: src/core/geometry/qgsgeometry.h#L243
QgsGeometry.get: src/core/geometry/qgsgeometry.h#L218
QgsGeometry.hausdorffDistance: src/core/geometry/qgsgeometry.h#L674
QgsGeometry.hausdorffDistanceDensify: src/core/geometry/qgsgeometry.h#L693
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L792
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L806
QgsGeometry.interpolate: src/core/geometry/qgsgeometry.h#L1979
QgsGeometry.interpolateAngle: src/core/geometry/qgsgeometry.h#L2001
QgsGeometry.intersection: src/core/geometry/qgsgeometry.h#L2014
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1421
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1437
QgsGeometry.isAxisParallelRectangle: src/core/geometry/qgsgeometry.h#L463
QgsGeometry.isEmpty: src/core/geometry/qgsgeometry.h#L396
QgsGeometry.isGeosEqual: src/core/geometry/qgsgeometry.h#L431
QgsGeometry.isGeosValid: src/core/geometry/qgsgeometry.h#L439
QgsGeometry.isMultipart: src/core/geometry/qgsgeometry.h#L399
QgsGeometry.isNull: src/core/geometry/qgsgeometry.h#L240
QgsGeometry.isPolygonClockwise: src/core/geometry/qgsgeometry.h#L2704
QgsGeometry.isPolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2689
QgsGeometry.isSimple: src/core/geometry/qgsgeometry.h#L448
QgsGeometry.largestEmptyCircle: src/core/geometry/qgsgeometry.h#L1739
QgsGeometry.lastError: src/core/geometry/qgsgeometry.h#L2897
QgsGeometry.length: src/core/geometry/qgsgeometry.h#L491
QgsGeometry.lineLocatePoint: src/core/geometry/qgsgeometry.h#L1991
QgsGeometry.makeDifference: src/core/geometry/qgsgeometry.h#L1193
QgsGeometry.makeValid: src/core/geometry/qgsgeometry.h#L2663
QgsGeometry.mapToPixel: src/core/geometry/qgsgeometry.h#L2860
QgsGeometry.mergeLines: src/core/geometry/qgsgeometry.h#L2050
QgsGeometry.minimalEnclosingCircle: src/core/geometry/qgsgeometry.h#L1240
QgsGeometry.minimumClearance: src/core/geometry/qgsgeometry.h#L1778
QgsGeometry.minimumClearanceLine: src/core/geometry/qgsgeometry.h#L1791
QgsGeometry.minimumWidth: src/core/geometry/qgsgeometry.h#L1755
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L824
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L833
QgsGeometry.nearestPoint: src/core/geometry/qgsgeometry.h#L875
QgsGeometry.node: src/core/geometry/qgsgeometry.h#L1924
QgsGeometry.normalize: src/core/geometry/qgsgeometry.h#L2820
QgsGeometry.offsetCurve: src/core/geometry/qgsgeometry.h#L1566
QgsGeometry.orientedMinimumBoundingBox: src/core/geometry/qgsgeometry.h#L1220
QgsGeometry.orthogonalize: src/core/geometry/qgsgeometry.h#L1255
QgsGeometry.overlaps: src/core/geometry/qgsgeometry.h#L1513
QgsGeometry.parts: src/core/geometry/qgsgeometry.h#L622
QgsGeometry.pointOnSurface: src/core/geometry/qgsgeometry.h#L1701
QgsGeometry.poleOfInaccessibility: src/core/geometry/qgsgeometry.h#L1714
QgsGeometry.polygonOrientation: src/core/geometry/qgsgeometry.h#L2674
QgsGeometry.polygonize: src/core/geometry/qgsgeometry.h#L2839
QgsGeometry.randomPointsInPolygon: src/core/geometry/qgsgeometry.h#L2136
QgsGeometry.removeDuplicateNodes: src/core/geometry/qgsgeometry.h#L1410
QgsGeometry.removeInteriorRings: src/core/geometry/qgsgeometry.h#L989
QgsGeometry.requiresConversionToStraightSegments: src/core/geometry/qgsgeometry.h#L2854
QgsGeometry.reshapeGeometry: src/core/geometry/qgsgeometry.h#L1178
QgsGeometry.rotate: src/core/geometry/qgsgeometry.h#L1029
QgsGeometry.roundWaves: src/core/geometry/qgsgeometry.h#L1337
QgsGeometry.roundWavesRandomized: src/core/geometry/qgsgeometry.h#L1357
QgsGeometry.set: src/core/geometry/qgsgeometry.h#L231
QgsGeometry.sharedPaths: src/core/geometry/qgsgeometry.h#L1940
QgsGeometry.shortestLine: src/core/geometry/qgsgeometry.h#L886
QgsGeometry.simplify: src/core/geometry/qgsgeometry.h#L1629
QgsGeometry.simplifyCoverageVW: src/core/geometry/qgsgeometry.h#L1899
QgsGeometry.singleSidedBuffer: src/core/geometry/qgsgeometry.h#L1582
QgsGeometry.smooth: src/core/geometry/qgsgeometry.h#L3118
QgsGeometry.snappedToGrid: src/core/geometry/qgsgeometry.h#L1389
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1092
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1172
QgsGeometry.sqrDistToVertexAt: src/core/geometry/qgsgeometry.h#L869
QgsGeometry.squareWaves: src/core/geometry/qgsgeometry.h#L1303
QgsGeometry.squareWavesRandomized: src/core/geometry/qgsgeometry.h#L1323
QgsGeometry.subdivide: src/core/geometry/qgsgeometry.h#L1963
QgsGeometry.symDifference: src/core/geometry/qgsgeometry.h#L2076
QgsGeometry.taperedBuffer: src/core/geometry/qgsgeometry.h#L1603
QgsGeometry.toggleCircularAtVertex: src/core/geometry/qgsgeometry.h#L855
QgsGeometry.touches: src/core/geometry/qgsgeometry.h#L1502
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1011
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1021
QgsGeometry.translate: src/core/geometry/qgsgeometry.h#L995
QgsGeometry.triangularWaves: src/core/geometry/qgsgeometry.h#L1269
QgsGeometry.triangularWavesRandomized: src/core/geometry/qgsgeometry.h#L1289
QgsGeometry.type: src/core/geometry/qgsgeometry.h#L388
QgsGeometry.unaryUnion: src/core/geometry/qgsgeometry.h#L2830
QgsGeometry.unionCoverage: src/core/geometry/qgsgeometry.h#L1912
QgsGeometry.validateCoverage: src/core/geometry/qgsgeometry.h#L1877
QgsGeometry.validateGeometry: src/core/geometry/qgsgeometry.h#L2809
QgsGeometry.variableWidthBufferByM: src/core/geometry/qgsgeometry.h#L1619
QgsGeometry.vertexAt: src/core/geometry/qgsgeometry.h#L862
QgsGeometry.vertexIdFromVertexNr: src/core/geometry/qgsgeometry.h#L2877
QgsGeometry.vertexNrFromVertexId: src/core/geometry/qgsgeometry.h#L2889
QgsGeometry.vertices: src/core/geometry/qgsgeometry.h#L540
QgsGeometry.voronoiDiagram: src/core/geometry/qgsgeometry.h#L1832
QgsGeometry.within: src/core/geometry/qgsgeometry.h#L1524
QgsGeometry.wkbSize: src/core/geometry/qgsgeometry.h#L2167
QgsGeometry.wkbType: src/core/geometry/qgsgeometry.h#L382
QgsGeometry: src/core/geometry/qgsgeometry.h#L161
QgsGeometry.Error.Error: src/core/geometry/qgsgeometry.h#L2777
QgsGeometry.Error.__repr__: src/core/geometry/qgsgeometry.h#L2800
QgsGeometry.Error.hasWhere: src/core/geometry/qgsgeometry.h#L2797
QgsGeometry.Error.what: src/core/geometry/qgsgeometry.h#L2787
QgsGeometry.Error.where: src/core/geometry/qgsgeometry.h#L2792
QgsGeometry.Error: src/core/geometry/qgsgeometry.h#L2768
QgsGeometry.QVariant: src/core/geometry/qgsgeometry.h#L3197
QgsGeometry.QgsGeometry: src/core/geometry/qgsgeometry.h#L201
QgsGeometry.__repr__: src/core/geometry/qgsgeometry.h#L2202
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L947
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L965
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L983
QgsGeometry.addPart: src/core/geometry/qgsgeometry.h#L999
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L956
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L974
QgsGeometry.addPartV2: src/core/geometry/qgsgeometry.h#L992
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L931
QgsGeometry.addRing: src/core/geometry/qgsgeometry.h#L938
QgsGeometry.addTopologicalPoint: src/core/geometry/qgsgeometry.h#L832
QgsGeometry.adjacentVertices: src/core/geometry/qgsgeometry.h#L795
QgsGeometry.angleAtVertex: src/core/geometry/qgsgeometry.h#L781
QgsGeometry.applyDashPattern: src/core/geometry/qgsgeometry.h#L1389
QgsGeometry.area: src/core/geometry/qgsgeometry.h#L493
QgsGeometry.asJson: src/core/geometry/qgsgeometry.h#L2221
QgsGeometry.asMultiPoint: src/core/geometry/qgsgeometry.h#L2435
QgsGeometry.asMultiPolygon: src/core/geometry/qgsgeometry.h#L2525
QgsGeometry.asMultiPolyline: src/core/geometry/qgsgeometry.h#L2480
QgsGeometry.asPoint: src/core/geometry/qgsgeometry.h#L2300
QgsGeometry.asPolygon: src/core/geometry/qgsgeometry.h#L2392
QgsGeometry.asPolyline: src/core/geometry/qgsgeometry.h#L2347
QgsGeometry.asQPointF: src/core/geometry/qgsgeometry.h#L2555
QgsGeometry.asQPolygonF: src/core/geometry/qgsgeometry.h#L2568
QgsGeometry.asWkb: src/core/geometry/qgsgeometry.h#L2192
QgsGeometry.asWkt: src/core/geometry/qgsgeometry.h#L2199
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2643
QgsGeometry.avoidIntersections: src/core/geometry/qgsgeometry.h#L2644
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2657
QgsGeometry.avoidIntersectionsV2: src/core/geometry/qgsgeometry.h#L2658
QgsGeometry.boundingBox3D: src/core/geometry/qgsgeometry.h#L1223
QgsGeometry.boundingBox: src/core/geometry/qgsgeometry.h#L1216
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1464
QgsGeometry.boundingBoxIntersects: src/core/geometry/qgsgeometry.h#L1474
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1561
QgsGeometry.buffer: src/core/geometry/qgsgeometry.h#L1574
QgsGeometry.centroid: src/core/geometry/qgsgeometry.h#L1703
QgsGeometry.clipped: src/core/geometry/qgsgeometry.h#L2039
QgsGeometry.closestSegmentWithContext: src/core/geometry/qgsgeometry.h#L924
QgsGeometry.closestVertex: src/core/geometry/qgsgeometry.h#L764
QgsGeometry.closestVertexWithContext: src/core/geometry/qgsgeometry.h#L911
QgsGeometry.collectGeometry: src/core/geometry/qgsgeometry.h#L347
QgsGeometry.combine: src/core/geometry/qgsgeometry.h#L2055
QgsGeometry.compare: src/core/geometry/qgsgeometry.h#L3030
QgsGeometry.concaveHull: src/core/geometry/qgsgeometry.h#L1833
QgsGeometry.constGet: src/core/geometry/qgsgeometry.h#L222
QgsGeometry.constParts: src/core/geometry/qgsgeometry.h#L673
QgsGeometry.constrainedDelaunayTriangulation: src/core/geometry/qgsgeometry.h#L1875
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1479
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1486
QgsGeometry.contains: src/core/geometry/qgsgeometry.h#L1497
QgsGeometry.convertGeometryCollectionToSubclass: src/core/geometry/qgsgeometry.h#L2630
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3184
QgsGeometry.convertPointList: src/core/geometry/qgsgeometry.h#L3191
QgsGeometry.convertToCurvedMultiType: src/core/geometry/qgsgeometry.h#L2608
QgsGeometry.convertToCurves: src/core/geometry/qgsgeometry.h#L1688
QgsGeometry.convertToMultiType: src/core/geometry/qgsgeometry.h#L2591
QgsGeometry.convertToSingleType: src/core/geometry/qgsgeometry.h#L2619
QgsGeometry.convertToStraightSegment: src/core/geometry/qgsgeometry.h#L2864
QgsGeometry.convertToType: src/core/geometry/qgsgeometry.h#L2273
QgsGeometry.convexHull: src/core/geometry/qgsgeometry.h#L1818
QgsGeometry.createGeometryEngine: src/core/geometry/qgsgeometry.h#L3177
QgsGeometry.createPolygonFromQPolygonF: src/core/geometry/qgsgeometry.h#L2973
QgsGeometry.createPolylineFromQPolygonF: src/core/geometry/qgsgeometry.h#L2964
QgsGeometry.createWedgeBuffer: src/core/geometry/qgsgeometry.h#L364
QgsGeometry.createWedgeBufferFromAngles: src/core/geometry/qgsgeometry.h#L380
QgsGeometry.crosses: src/core/geometry/qgsgeometry.h#L1552
QgsGeometry.delaunayTriangulation: src/core/geometry/qgsgeometry.h#L1861
QgsGeometry.deletePart: src/core/geometry/qgsgeometry.h#L2581
QgsGeometry.deleteRing: src/core/geometry/qgsgeometry.h#L2575
QgsGeometry.deleteVertex: src/core/geometry/qgsgeometry.h#L863
QgsGeometry.densifyByCount: src/core/geometry/qgsgeometry.h#L1656
QgsGeometry.densifyByDistance: src/core/geometry/qgsgeometry.h#L1671
QgsGeometry.difference: src/core/geometry/qgsgeometry.h#L2080
QgsGeometry.disjoint: src/core/geometry/qgsgeometry.h#L1508
QgsGeometry.distance: src/core/geometry/qgsgeometry.h#L517
QgsGeometry.distanceToVertex: src/core/geometry/qgsgeometry.h#L773
QgsGeometry.draw: src/core/geometry/qgsgeometry.h#L2883
QgsGeometry.equals: src/core/geometry/qgsgeometry.h#L431
QgsGeometry.extendLine: src/core/geometry/qgsgeometry.h#L1643
QgsGeometry.extrude: src/core/geometry/qgsgeometry.h#L2096
QgsGeometry.forcePolygonClockwise: src/core/geometry/qgsgeometry.h#L2750
QgsGeometry.forcePolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2762
QgsGeometry.forceRHR: src/core/geometry/qgsgeometry.h#L2738
QgsGeometry.frechetDistance: src/core/geometry/qgsgeometry.h#L726
QgsGeometry.frechetDistanceDensify: src/core/geometry/qgsgeometry.h#L750
QgsGeometry.fromBox3D: src/core/geometry/qgsgeometry.h#L343
QgsGeometry.fromMultiPointXY: src/core/geometry/qgsgeometry.h#L272
QgsGeometry.fromMultiPolygonXY: src/core/geometry/qgsgeometry.h#L331
QgsGeometry.fromMultiPolylineXY: src/core/geometry/qgsgeometry.h#L299
QgsGeometry.fromPoint: src/core/geometry/qgsgeometry.h#L269
QgsGeometry.fromPointXY: src/core/geometry/qgsgeometry.h#L262
QgsGeometry.fromPolygonXY: src/core/geometry/qgsgeometry.h#L326
QgsGeometry.fromPolyline: src/core/geometry/qgsgeometry.h#L294
QgsGeometry.fromPolylineXY: src/core/geometry/qgsgeometry.h#L284
QgsGeometry.fromQPointF: src/core/geometry/qgsgeometry.h#L2947
QgsGeometry.fromQPolygonF: src/core/geometry/qgsgeometry.h#L2955
QgsGeometry.fromRect: src/core/geometry/qgsgeometry.h#L334
QgsGeometry.fromWkb: src/core/geometry/qgsgeometry.h#L393
QgsGeometry.fromWkt: src/core/geometry/qgsgeometry.h#L260
QgsGeometry.get: src/core/geometry/qgsgeometry.h#L235
QgsGeometry.hausdorffDistance: src/core/geometry/qgsgeometry.h#L691
QgsGeometry.hausdorffDistanceDensify: src/core/geometry/qgsgeometry.h#L710
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L809
QgsGeometry.insertVertex: src/core/geometry/qgsgeometry.h#L823
QgsGeometry.interpolate: src/core/geometry/qgsgeometry.h#L1996
QgsGeometry.interpolateAngle: src/core/geometry/qgsgeometry.h#L2018
QgsGeometry.intersection: src/core/geometry/qgsgeometry.h#L2031
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1438
QgsGeometry.intersects: src/core/geometry/qgsgeometry.h#L1454
QgsGeometry.isAxisParallelRectangle: src/core/geometry/qgsgeometry.h#L480
QgsGeometry.isEmpty: src/core/geometry/qgsgeometry.h#L413
QgsGeometry.isGeosEqual: src/core/geometry/qgsgeometry.h#L448
QgsGeometry.isGeosValid: src/core/geometry/qgsgeometry.h#L456
QgsGeometry.isMultipart: src/core/geometry/qgsgeometry.h#L416
QgsGeometry.isNull: src/core/geometry/qgsgeometry.h#L257
QgsGeometry.isPolygonClockwise: src/core/geometry/qgsgeometry.h#L2721
QgsGeometry.isPolygonCounterClockwise: src/core/geometry/qgsgeometry.h#L2706
QgsGeometry.isSimple: src/core/geometry/qgsgeometry.h#L465
QgsGeometry.largestEmptyCircle: src/core/geometry/qgsgeometry.h#L1756
QgsGeometry.lastError: src/core/geometry/qgsgeometry.h#L2914
QgsGeometry.length: src/core/geometry/qgsgeometry.h#L508
QgsGeometry.lineLocatePoint: src/core/geometry/qgsgeometry.h#L2008
QgsGeometry.makeDifference: src/core/geometry/qgsgeometry.h#L1210
QgsGeometry.makeValid: src/core/geometry/qgsgeometry.h#L2680
QgsGeometry.mapToPixel: src/core/geometry/qgsgeometry.h#L2877
QgsGeometry.mergeLines: src/core/geometry/qgsgeometry.h#L2067
QgsGeometry.minimalEnclosingCircle: src/core/geometry/qgsgeometry.h#L1257
QgsGeometry.minimumClearance: src/core/geometry/qgsgeometry.h#L1795
QgsGeometry.minimumClearanceLine: src/core/geometry/qgsgeometry.h#L1808
QgsGeometry.minimumWidth: src/core/geometry/qgsgeometry.h#L1772
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L841
QgsGeometry.moveVertex: src/core/geometry/qgsgeometry.h#L850
QgsGeometry.nearestPoint: src/core/geometry/qgsgeometry.h#L892
QgsGeometry.node: src/core/geometry/qgsgeometry.h#L1941
QgsGeometry.normalize: src/core/geometry/qgsgeometry.h#L2837
QgsGeometry.offsetCurve: src/core/geometry/qgsgeometry.h#L1583
QgsGeometry.orientedMinimumBoundingBox: src/core/geometry/qgsgeometry.h#L1237
QgsGeometry.orthogonalize: src/core/geometry/qgsgeometry.h#L1272
QgsGeometry.overlaps: src/core/geometry/qgsgeometry.h#L1530
QgsGeometry.parts: src/core/geometry/qgsgeometry.h#L639
QgsGeometry.pointOnSurface: src/core/geometry/qgsgeometry.h#L1718
QgsGeometry.poleOfInaccessibility: src/core/geometry/qgsgeometry.h#L1731
QgsGeometry.polygonOrientation: src/core/geometry/qgsgeometry.h#L2691
QgsGeometry.polygonize: src/core/geometry/qgsgeometry.h#L2856
QgsGeometry.randomPointsInPolygon: src/core/geometry/qgsgeometry.h#L2153
QgsGeometry.removeDuplicateNodes: src/core/geometry/qgsgeometry.h#L1427
QgsGeometry.removeInteriorRings: src/core/geometry/qgsgeometry.h#L1006
QgsGeometry.requiresConversionToStraightSegments: src/core/geometry/qgsgeometry.h#L2871
QgsGeometry.reshapeGeometry: src/core/geometry/qgsgeometry.h#L1195
QgsGeometry.rotate: src/core/geometry/qgsgeometry.h#L1046
QgsGeometry.roundWaves: src/core/geometry/qgsgeometry.h#L1354
QgsGeometry.roundWavesRandomized: src/core/geometry/qgsgeometry.h#L1374
QgsGeometry.set: src/core/geometry/qgsgeometry.h#L248
QgsGeometry.sharedPaths: src/core/geometry/qgsgeometry.h#L1957
QgsGeometry.shortestLine: src/core/geometry/qgsgeometry.h#L903
QgsGeometry.simplify: src/core/geometry/qgsgeometry.h#L1646
QgsGeometry.simplifyCoverageVW: src/core/geometry/qgsgeometry.h#L1916
QgsGeometry.singleSidedBuffer: src/core/geometry/qgsgeometry.h#L1599
QgsGeometry.smooth: src/core/geometry/qgsgeometry.h#L3135
QgsGeometry.snappedToGrid: src/core/geometry/qgsgeometry.h#L1406
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1109
QgsGeometry.splitGeometry: src/core/geometry/qgsgeometry.h#L1189
QgsGeometry.sqrDistToVertexAt: src/core/geometry/qgsgeometry.h#L886
QgsGeometry.squareWaves: src/core/geometry/qgsgeometry.h#L1320
QgsGeometry.squareWavesRandomized: src/core/geometry/qgsgeometry.h#L1340
QgsGeometry.subdivide: src/core/geometry/qgsgeometry.h#L1980
QgsGeometry.symDifference: src/core/geometry/qgsgeometry.h#L2093
QgsGeometry.taperedBuffer: src/core/geometry/qgsgeometry.h#L1620
QgsGeometry.toggleCircularAtVertex: src/core/geometry/qgsgeometry.h#L872
QgsGeometry.touches: src/core/geometry/qgsgeometry.h#L1519
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1028
QgsGeometry.transform: src/core/geometry/qgsgeometry.h#L1038
QgsGeometry.translate: src/core/geometry/qgsgeometry.h#L1012
QgsGeometry.triangularWaves: src/core/geometry/qgsgeometry.h#L1286
QgsGeometry.triangularWavesRandomized: src/core/geometry/qgsgeometry.h#L1306
QgsGeometry.type: src/core/geometry/qgsgeometry.h#L405
QgsGeometry.unaryUnion: src/core/geometry/qgsgeometry.h#L2847
QgsGeometry.unionCoverage: src/core/geometry/qgsgeometry.h#L1929
QgsGeometry.validateCoverage: src/core/geometry/qgsgeometry.h#L1894
QgsGeometry.validateGeometry: src/core/geometry/qgsgeometry.h#L2826
QgsGeometry.variableWidthBufferByM: src/core/geometry/qgsgeometry.h#L1636
QgsGeometry.vertexAt: src/core/geometry/qgsgeometry.h#L879
QgsGeometry.vertexIdFromVertexNr: src/core/geometry/qgsgeometry.h#L2894
QgsGeometry.vertexNrFromVertexId: src/core/geometry/qgsgeometry.h#L2906
QgsGeometry.vertices: src/core/geometry/qgsgeometry.h#L557
QgsGeometry.voronoiDiagram: src/core/geometry/qgsgeometry.h#L1849
QgsGeometry.within: src/core/geometry/qgsgeometry.h#L1541
QgsGeometry.wkbSize: src/core/geometry/qgsgeometry.h#L2184
QgsGeometry.wkbType: src/core/geometry/qgsgeometry.h#L399
QgsGeometry: src/core/geometry/qgsgeometry.h#L178
QgsGeometryCollection.__bool__: src/core/geometry/qgsgeometrycollection.h#L136
QgsGeometryCollection.__delitem__: src/core/geometry/qgsgeometrycollection.h#L401
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.setStrokedPathSegments: src/core/painting/qgsgeometrypaintdevice.h#L140
QgsGeometryPaintDevice: src/core/painting/qgsgeometrypaintdevice.h#L122
QgsGeometryParameters.gridSize: src/core/geometry/qgsgeometry.h#L122
QgsGeometryParameters.setGridSize: src/core/geometry/qgsgeometry.h#L134
QgsGeometryParameters: src/core/geometry/qgsgeometry.h#L108
QgsGeometryParameters.gridSize: src/core/geometry/qgsgeometry.h#L139
QgsGeometryParameters.setGridSize: src/core/geometry/qgsgeometry.h#L151
QgsGeometryParameters: src/core/geometry/qgsgeometry.h#L125
QgsGeometryPartIterator.__iter__: src/core/geometry/qgsabstractgeometry.h#L1286
QgsGeometryPartIterator.__next__: src/core/geometry/qgsabstractgeometry.h#L1291
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.spreadUnit: src/core/effects/qgsgloweffect.h#L91
QgsGlowEffect: src/core/effects/qgsgloweffect.h#L37
QgsGml.crs: src/core/qgsgml.h#L431
QgsGml.dataProgressAndSteps: src/core/qgsgml.h#L455
QgsGml.dataReadProgress: src/core/qgsgml.h#L440
QgsGml.getFeatures: src/core/qgsgml.h#L408
QgsGml.getFeatures: src/core/qgsgml.h#L420
QgsGml.totalStepsUpdate: src/core/qgsgml.h#L447
QgsGml: src/core/qgsgml.h#L387
QgsGml.crs: src/core/qgsgml.h#L432
QgsGml.dataProgressAndSteps: src/core/qgsgml.h#L456
QgsGml.dataReadProgress: src/core/qgsgml.h#L441
QgsGml.getFeatures: src/core/qgsgml.h#L409
QgsGml.getFeatures: src/core/qgsgml.h#L421
QgsGml.totalStepsUpdate: src/core/qgsgml.h#L448
QgsGml: src/core/qgsgml.h#L388
QgsGmlFeatureClass.fieldIndex: src/core/qgsgmlschema.h#L49
QgsGmlFeatureClass.path: src/core/qgsgmlschema.h#L51
QgsGmlFeatureClass: src/core/qgsgmlschema.h#L40

View File

@ -74,7 +74,7 @@ bool QgsMapToolShapeCircle2Points::cadCanvasReleaseEvent( QgsMapMouseEvent *e, Q
void QgsMapToolShapeCircle2Points::cadCanvasMoveEvent( QgsMapMouseEvent *e, QgsMapToolCapture::CaptureMode mode )
{
Q_UNUSED( mode )
if ( !mTempRubberBand )
if ( !mTempRubberBand || mPoints.isEmpty() )
return;
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 );
if ( mTempRubberBand )
if ( mTempRubberBand && !mPoints.isEmpty() )
{
mCircle = QgsCircle::fromCenterPoint( mPoints.at( 0 ), point );
mTempRubberBand->setGeometry( mCircle.toCircularString( true ) );

View File

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

View File

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

View File

@ -67,15 +67,11 @@ void QgsMapToolReshape::cadCanvasReleaseEvent( QgsMapMouseEvent *e )
{
deleteTempRubberBand();
//find out bounding box of mCaptureList
if ( size() < 1 )
if ( size() > 1 )
{
stopCapturing();
return;
reshape( vlayer );
}
reshape( vlayer );
stopCapturing();
}
}
@ -164,12 +160,11 @@ void QgsMapToolReshape::reshape( QgsVectorLayer *vlayer )
QgsAvoidIntersectionsOperation avoidIntersections;
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 ) )
{
//query geometry
//call geometry->reshape(mCaptureList)
//register changed geometry in vector layer
QgsGeometry geom = f.geometry();
if ( !geom.isNull() )
{
@ -181,35 +176,44 @@ void QgsMapToolReshape::reshape( QgsVectorLayer *vlayer )
reshapeReturn = geom.reshapeGeometry( reshapeLineString );
if ( reshapeReturn == Qgis::GeometryOperationResult::Success )
{
//avoid intersections on polygon layers
if ( vlayer->geometryType() == Qgis::GeometryType::Polygon )
{
//ignore all current layer features as they should be reshaped too
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 )
{
emit messageEmitted( tr( "An error was reported during intersection removal" ), Qgis::MessageLevel::Warning );
vlayer->destroyEditCommand();
stopCapturing();
return;
}
if ( geom.isEmpty() ) //intersection removal might have removed the whole geometry
{
emit messageEmitted( tr( "The feature cannot be reshaped because the resulting geometry is empty" ), Qgis::MessageLevel::Critical );
vlayer->destroyEditCommand();
return;
}
}
vlayer->changeGeometry( f.id(), geom );
reshapeDone = true;
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
if ( vlayer->geometryType() == Qgis::GeometryType::Polygon )
{
const QgsAvoidIntersectionsOperation::Result res = avoidIntersections.apply( vlayer, fid, geom, ignoreFeatures );
if ( res.operationResult == Qgis::GeometryOperationResult::InvalidInputGeometryType )
{
emit messageEmitted( tr( "An error was reported during intersection removal" ), Qgis::MessageLevel::Warning );
vlayer->destroyEditCommand();
stopCapturing();
return;
}
if ( geom.isEmpty() ) //intersection removal might have removed the whole geometry
{
emit messageEmitted( tr( "The feature cannot be reshaped because the resulting geometry is empty" ), Qgis::MessageLevel::Critical );
vlayer->destroyEditCommand();
return;
}
}
vlayer->changeGeometry( fid, geom );
reshapeDone = true;
}
if ( reshapeDone )
{

View File

@ -1241,7 +1241,17 @@ Qgis::GeometryOperationResult QgsGeometry::reshapeGeometry( const QgsLineString
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;
mLastError.clear();
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.
*
*/
#ifndef SIP_RUN
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
#ifndef SIP_RUN

View File

@ -33,13 +33,13 @@ email : marco.hugentobler at sourcepole dot com
#define DEFAULT_QUADRANT_SEGMENTS 8
#define CATCH_GEOS(r) \
catch (GEOSException &) \
catch (QgsGeosException &) \
{ \
return r; \
}
#define CATCH_GEOS_WITH_ERRMSG(r) \
catch (GEOSException &e) \
catch (QgsGeosException &e) \
{ \
if ( errorMsg ) \
{ \
@ -50,7 +50,7 @@ email : marco.hugentobler at sourcepole dot com
/// @cond PRIVATE
static void throwGEOSException( const char *fmt, ... )
static void throwQgsGeosException( const char *fmt, ... )
{
va_list ap;
char buffer[1024];
@ -62,14 +62,14 @@ static void throwGEOSException( const char *fmt, ... )
QString message = QString::fromUtf8( buffer );
#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
// 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
try
{
throw GEOSException( message );
throw QgsGeosException( message );
}
catch ( ... )
{
@ -77,7 +77,7 @@ static void throwGEOSException( const char *fmt, ... )
// just throw nothing instead (except your mouse at your monitor)
}
#else
throw GEOSException( message );
throw QgsGeosException( message );
#endif
}
@ -112,9 +112,9 @@ QgsGeosContext::QgsGeosContext()
#if GEOS_VERSION_MAJOR>3 || ( GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR>=5 )
mContext = GEOS_init_r();
GEOSContext_setNoticeHandler_r( mContext, printGEOSNotice );
GEOSContext_setErrorHandler_r( mContext, throwGEOSException );
GEOSContext_setErrorHandler_r( mContext, throwQgsGeosException );
#else
mContext = initGEOS_r( printGEOSNotice, throwGEOSException );
mContext = initGEOS_r( printGEOSNotice, throwQgsGeosException );
#endif
}
@ -240,7 +240,7 @@ std::unique_ptr<QgsAbstractGeometry> QgsGeos::makeValid( Qgis::MakeValidMethod m
geos.reset( GEOSMakeValidWithParams_r( context, mGeos.get(), params ) );
GEOSMakeValidParams_destroy_r( context, params );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
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() ) );
return fromGeos( opGeom.get() );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
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 );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
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;
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
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;
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg )
@ -961,7 +961,7 @@ QString QgsGeos::relate( const QgsAbstractGeometry *geom, QString *errorMsg ) co
GEOSFree_r( context, r );
}
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
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 );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
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() ) );
}
catch ( GEOSException & )
catch ( QgsGeosException & )
{
for ( GEOSGeometry *geom : geomarr )
{
@ -1989,7 +1989,7 @@ std::unique_ptr<QgsAbstractGeometry> QgsGeos::overlay( const QgsAbstractGeometry
}
return fromGeos( opGeom.get() );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg )
@ -2071,7 +2071,7 @@ bool QgsGeos::relation( const QgsAbstractGeometry *geom, Relation r, QString *er
break;
}
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
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_getY_r( context, nearestCoord.get(), 0, &ny );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
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_getY_r( context, nearestCoord.get(), 1, &ny2 );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg )
@ -3203,7 +3203,7 @@ double QgsGeos::lineLocatePoint( const QgsPoint &point, QString *errorMsg ) cons
{
distance = GEOSProject_r( QgsGeosContext::get(), mGeos.get(), otherGeom.get() );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
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() );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
logError( QStringLiteral( "GEOS" ), e.what() );
if ( errorMsg )
@ -3270,7 +3270,7 @@ QgsGeometry QgsGeos::polygonize( const QVector<const QgsAbstractGeometry *> &geo
delete[] lineGeosGeometries;
return QgsGeometry( fromGeos( result.get() ) );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
if ( errorMsg )
{
@ -3475,7 +3475,7 @@ geos::unique_ptr QgsGeos::reshapeLine( const GEOSGeometry *line, const GEOSGeome
}
}
}
catch ( GEOSException & )
catch ( QgsGeosException & )
{
atLeastTwoIntersections = false;
}
@ -3736,7 +3736,7 @@ geos::unique_ptr QgsGeos::reshapePolygon( const GEOSGeometry *polygon, const GEO
}
}
}
catch ( GEOSException & )
catch ( QgsGeosException & )
{
nIntersections = 0;
}
@ -3762,7 +3762,15 @@ geos::unique_ptr QgsGeos::reshapePolygon( const GEOSGeometry *polygon, const GEO
reshapeResult.reset();
newRing = GEOSGeom_createLinearRing_r( context, newCoordSequence );
try
{
newRing = GEOSGeom_createLinearRing_r( context, newCoordSequence );
}
catch ( QgsGeosException & )
{
// nothing to do: on exception newRing will be null
}
if ( !newRing )
{
delete [] innerRings;

View File

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

View File

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

View File

@ -420,7 +420,7 @@ std::unique_ptr<LabelPosition> FeaturePart::createCandidatePointOnSurface( Point
GEOSCoordSeq_getXY_r( geosctxt, coordSeq, 0, &px, &py );
}
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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 );
#endif
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -2465,7 +2465,7 @@ bool FeaturePart::mergeWithFeaturePart( FeaturePart *other )
extractCoords( mGeos );
return true;
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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 );
return result;
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
Q_NOWARN_UNREACHABLE_PUSH

View File

@ -190,7 +190,7 @@ bool LabelPosition::intersects( const GEOSPreparedGeometry *geometry )
return mNextPart->intersects( geometry );
}
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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 );
}
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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+" ) );
#endif
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) );
}
@ -318,7 +318,7 @@ bool LabelPosition::isInConflict( const LabelPosition *lp ) const
mOuterBoundsGeos ? mOuterBoundsGeos.get() : mGeos ) == 1 );
return result;
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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+" ) );
#endif
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
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 );
return result;
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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 ) );
contains = ( GEOSPreparedContainsProperly_r( geosctxt, mPreparedOuterBoundsGeos, point.get() ) == 1 );
}
catch ( GEOSException & )
catch ( QgsGeosException & )
{
contains = false;
}
@ -747,7 +747,7 @@ double LabelPosition::getDistanceToPoint( double xp, double yp, bool useOuterBou
distance = QgsGeometryUtilsBase::sqrDistance2D( xp, yp, nx, ny );
}
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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 );
}
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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 );
}
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -855,7 +855,7 @@ bool LabelPosition::intersectsWithPolygon( PointSet *polygon ) const
return true;
}
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -914,7 +914,7 @@ double LabelPosition::polygonIntersectionCostForParts( PointSet *polygon ) const
cost += 4;
}
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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+" ) );
#endif
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
QgsDebugError( QStringLiteral( "GEOS exception: %1" ).arg( e.what() ) );
}

View File

@ -278,7 +278,7 @@ bool PointSet::containsPoint( double x, double y ) const
return result;
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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 );
y = std::move( newY );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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 );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
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() );
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 ) );
return res;
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
return nullptr;
@ -1041,7 +1041,7 @@ double PointSet::lineLocatePoint( const GEOSGeometry *point ) const
{
distance = GEOSProject_r( QgsGeosContext::get(), thisGeos, point );
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
return -1;
@ -1076,7 +1076,7 @@ double PointSet::length() const
( void )GEOSLength_r( geosctxt, mGeos, &mLength );
return mLength;
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -1103,7 +1103,7 @@ double PointSet::area() const
mArea = std::fabs( mArea );
return mArea;
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
@ -1137,7 +1137,7 @@ QString PointSet::toWkt() const
return res;
}
catch ( GEOSException &e )
catch ( QgsGeosException &e )
{
qWarning( "GEOS exception: %s", e.what() );
QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );

View File

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

View File

@ -1075,7 +1075,7 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
const int localNameLen = ( pszSep ) ? ( int )( elLen - nsLen ) - 1 : elLen;
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 );
@ -1215,7 +1215,7 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
}
else if ( parseMode == LowerCorner && isGMLNS && LOCALNAME_EQUALS( "lowerCorner" ) )
{
QList<QgsPointXY> points;
QList<QgsPoint> points;
pointsFromPosListString( points, mStringCash, 2 );
if ( points.size() == 1 )
{
@ -1226,7 +1226,7 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
}
else if ( parseMode == UpperCorner && isGMLNS && LOCALNAME_EQUALS( "upperCorner" ) )
{
QList<QgsPointXY> points;
QList<QgsPoint> points;
pointsFromPosListString( points, mStringCash, 2 );
if ( points.size() == 1 )
{
@ -1279,12 +1279,14 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
}
else if ( !mAttributeValIsNested && isGMLNS && LOCALNAME_EQUALS( "Point" ) )
{
QList<QgsPointXY> pointList;
if ( pointsFromString( pointList, mStringCash ) != 0 )
QList<QgsPoint> pointList;
int dimension = 0;
if ( pointsFromString( pointList, mStringCash, &dimension ) != 0 )
{
//error
}
mStringCash.clear();
mDimension = dimension;
if ( pointList.isEmpty() )
return; // error
@ -1292,20 +1294,21 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
if ( parseMode == QgsGmlStreamingParser::Geometry )
{
//directly add WKB point to the feature
if ( getPointWKB( mCurrentWKB, *( pointList.constBegin() ) ) != 0 )
if ( getPointWKB( mCurrentWKB, *( pointList.constBegin() ), dimension ) != 0 )
{
//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
{
QByteArray wkbPtr;
if ( getPointWKB( wkbPtr, *( pointList.constBegin() ) ) != 0 )
if ( getPointWKB( wkbPtr, *( pointList.constBegin() ), dimension ) != 0 )
{
//error
}
@ -1324,32 +1327,40 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
{
//add WKB point to the feature
QList<QgsPointXY> pointList;
if ( pointsFromString( pointList, mStringCash ) != 0 )
QList<QgsPoint> pointList;
int dimension = 0;
if ( pointsFromString( pointList, mStringCash, &dimension ) != 0 )
{
//error
}
mStringCash.clear();
mDimension = dimension;
if ( parseMode == QgsGmlStreamingParser::Geometry )
{
if ( getLineWKB( mCurrentWKB, pointList ) != 0 )
if ( getLineWKB( mCurrentWKB, pointList, dimension ) != 0 )
{
//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
{
QByteArray wkbPtr;
if ( getLineWKB( wkbPtr, pointList ) != 0 )
if ( getLineWKB( wkbPtr, pointList, dimension ) != 0 )
{
//error
}
mDimension = dimension;
if ( !mCurrentWKBFragments.isEmpty() )
{
mCurrentWKBFragments.last().push_back( wkbPtr );
@ -1363,15 +1374,17 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
else if ( ( parseMode == Geometry || parseMode == MultiPolygon ) &&
isGMLNS && LOCALNAME_EQUALS( "LinearRing" ) )
{
QList<QgsPointXY> pointList;
if ( pointsFromString( pointList, mStringCash ) != 0 )
QList<QgsPoint> pointList;
int dimension = 0;
if ( pointsFromString( pointList, mStringCash, &dimension ) != 0 )
{
//error
}
mStringCash.clear();
mDimension = dimension;
QByteArray wkbPtr;
if ( getRingWKB( wkbPtr, pointList ) != 0 )
if ( getRingWKB( wkbPtr, pointList, dimension ) != 0 )
{
//error
}
@ -1388,9 +1401,9 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
else if ( ( parseMode == Geometry || parseMode == MultiPolygon ) && isGMLNS &&
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 )
@ -1401,21 +1414,21 @@ void QgsGmlStreamingParser::endElement( const XML_Char *el )
else if ( parseMode == MultiPoint && isGMLNS &&
LOCALNAME_EQUALS( "MultiPoint" ) )
{
mWkbType = Qgis::WkbType::MultiPoint;
mWkbType = mDimension > 2 ? Qgis::WkbType::MultiPointZ : Qgis::WkbType::MultiPoint;
mParseModeStack.pop();
createMultiPointFromFragments();
}
else if ( parseMode == MultiLine && isGMLNS &&
( LOCALNAME_EQUALS( "MultiLineString" ) || LOCALNAME_EQUALS( "MultiCurve" ) ) )
{
mWkbType = Qgis::WkbType::MultiLineString;
mWkbType = mDimension > 2 ? Qgis::WkbType::MultiLineStringZ : Qgis::WkbType::MultiLineString;
mParseModeStack.pop();
createMultiLineFromFragments();
}
else if ( parseMode == MultiPolygon && isGMLNS &&
( LOCALNAME_EQUALS( "MultiPolygon" ) || LOCALNAME_EQUALS( "MultiSurface" ) ) )
{
mWkbType = Qgis::WkbType::MultiPolygon;
mWkbType = mDimension > 2 ? Qgis::WkbType::MultiPolygonZ : Qgis::WkbType::MultiPolygon;
mParseModeStack.pop();
createMultiPolygonFromFragments();
}
@ -1584,7 +1597,7 @@ QString QgsGmlStreamingParser::readAttribute( const QString &attributeName, cons
bool QgsGmlStreamingParser::createBBoxFromCoordinateString( QgsRectangle &r, const QString &coordString ) const
{
QList<QgsPointXY> points;
QList<QgsPoint> points;
if ( pointsFromCoordinateString( points, coordString ) != 0 )
{
return false;
@ -1600,18 +1613,25 @@ bool QgsGmlStreamingParser::createBBoxFromCoordinateString( QgsRectangle &r, con
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 ','
const QStringList tuples = coordString.split( mTupleSeparator, Qt::SkipEmptyParts );
QStringList tuples_coordinates;
double x, y;
double x, y, z;
bool conversionSuccess;
if ( dimension )
*dimension = 0;
QStringList::const_iterator tupleIterator;
for ( tupleIterator = tuples.constBegin(); tupleIterator != tuples.constEnd(); ++tupleIterator )
{
tuples_coordinates = tupleIterator->split( mCoordinateSeparator, Qt::SkipEmptyParts );
if ( dimension )
{
*dimension = std::max( *dimension, static_cast<int>( tuples_coordinates.size() ) );
}
if ( tuples_coordinates.size() < 2 )
{
continue;
@ -1626,12 +1646,30 @@ int QgsGmlStreamingParser::pointsFromCoordinateString( QList<QgsPointXY> &points
{
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;
}
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
const QStringList coordinates = coordString.split( ' ', Qt::SkipEmptyParts );
@ -1655,66 +1693,91 @@ int QgsGmlStreamingParser::pointsFromPosListString( QList<QgsPointXY> &points, c
{
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;
}
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 )
{
return pointsFromCoordinateString( points, coordString );
return pointsFromCoordinateString( points, coordString, dimension );
}
else if ( mCoorMode == QgsGmlStreamingParser::PosList )
{
if ( dimension )
{
*dimension = mDimension ? mDimension : 2; // default dimension is 2D
}
return pointsFromPosListString( points, coordString, mDimension ? mDimension : 2 );
}
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 );
QgsWkbPtr fillPtr( wkbPtr );
fillPtr << mEndian << Qgis::WkbType::Point << point.x() << point.y();
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 << mEndian << ( dimension > 2 ? Qgis::WkbType::PointZ : Qgis::WkbType::Point ) << point.x() << point.y();
if ( dimension > 2 )
{
fillPtr << iter->x() << iter->y();
fillPtr << point.z(); // add Z coordinate if available
}
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 );
QgsWkbPtr fillPtr( wkbPtr );
fillPtr << ringCoordinates.size();
QList<QgsPointXY>::const_iterator iter;
QList<QgsPoint>::const_iterator iter;
for ( iter = ringCoordinates.constBegin(); iter != ringCoordinates.constEnd(); ++iter )
{
fillPtr << iter->x() << iter->y();
if ( dimension > 2 )
{
fillPtr << iter->z(); // add Z coordinate if available
}
}
return 0;
@ -1722,12 +1785,12 @@ int QgsGmlStreamingParser::getRingWKB( QByteArray &wkbPtr, const QList<QgsPointX
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 );
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
auto wkbIt = mCurrentWKBFragments.constBegin()->constBegin();
@ -1738,17 +1801,17 @@ int QgsGmlStreamingParser::createMultiLineFromFragments()
}
mCurrentWKBFragments.clear();
mWkbType = Qgis::WkbType::MultiLineString;
mWkbType = mDimension > 2 ? Qgis::WkbType::MultiLineStringZ : Qgis::WkbType::MultiLineString;
return 0;
}
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 );
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();
for ( ; wkbIt != mCurrentWKBFragments.constBegin()->constEnd(); ++wkbIt )
@ -1758,18 +1821,18 @@ int QgsGmlStreamingParser::createMultiPointFromFragments()
}
mCurrentWKBFragments.clear();
mWkbType = Qgis::WkbType::MultiPoint;
mWkbType = mDimension > 2 ? Qgis::WkbType::MultiPointZ : Qgis::WkbType::MultiPoint;
return 0;
}
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 );
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();
for ( ; wkbIt != mCurrentWKBFragments.constBegin()->constEnd(); ++wkbIt )
@ -1779,21 +1842,21 @@ int QgsGmlStreamingParser::createPolygonFromFragments()
}
mCurrentWKBFragments.clear();
mWkbType = Qgis::WkbType::Polygon;
mWkbType = mDimension > 2 ? Qgis::WkbType::PolygonZ : Qgis::WkbType::Polygon;
return 0;
}
int QgsGmlStreamingParser::createMultiPolygonFromFragments()
{
int size = 0;
size += 1 + 2 * sizeof( int );
size += 1 + ( mDimension > 2 ? mDimension : 2 ) * static_cast<int>( sizeof( int ) );
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 );
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
auto outerWkbIt = mCurrentWKBFragments.constBegin();
@ -1801,7 +1864,7 @@ int QgsGmlStreamingParser::createMultiPolygonFromFragments()
for ( ; outerWkbIt != mCurrentWKBFragments.constEnd(); ++outerWkbIt )
{
//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();
for ( ; innerWkbIt != outerWkbIt->constEnd(); ++innerWkbIt )
@ -1812,7 +1875,7 @@ int QgsGmlStreamingParser::createMultiPolygonFromFragments()
}
mCurrentWKBFragments.clear();
mWkbType = Qgis::WkbType::MultiPolygon;
mWkbType = mDimension > 2 ? Qgis::WkbType::MultiPolygonZ : Qgis::WkbType::MultiPolygon;
return 0;
}

View File

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

View File

@ -26,6 +26,9 @@
#include "qgsexpressioncontextutils.h"
#include "qgslogger.h"
#include "qgsstringutils.h"
#include "qgsmultipolygon.h"
#include "qgspolygon.h"
#include "qgsogrutils.h"
#include <QColor>
#include <QStringList>
@ -33,6 +36,9 @@
#include <QObject>
#include <QRegularExpression>
#include "ogr_api.h"
#ifndef Q_OS_WIN
#include <netinet/in.h>
#else
@ -92,7 +98,7 @@ QgsGeometry QgsOgcUtils::geometryFromGML( const QDomNode &geometryNode, const Co
if ( !( geomType == QLatin1String( "Point" ) || geomType == QLatin1String( "LineString" ) || geomType == QLatin1String( "Polygon" ) ||
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();
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" ) ||
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();
if ( geomType == QLatin1String( "Point" ) )
@ -128,6 +134,10 @@ QgsGeometry QgsOgcUtils::geometryFromGML( const QDomNode &geometryNode, const Co
{
geometry = geometryFromGMLMultiLineString( geometryTypeElement );
}
else if ( geomType == QLatin1String( "MultiCurve" ) )
{
geometry = geometryFromGMLMultiCurve( geometryTypeElement );
}
else if ( geomType == QLatin1String( "MultiPolygon" ) )
{
geometry = geometryFromGMLMultiPolygon( geometryTypeElement );
@ -142,6 +152,7 @@ QgsGeometry QgsOgcUtils::geometryFromGML( const QDomNode &geometryNode, const Co
}
else //unknown type
{
QgsDebugMsgLevel( QStringLiteral( "Unknown geometry type %1" ).arg( geomType ), 2 );
return geometry;
}
@ -208,7 +219,7 @@ QgsGeometry QgsOgcUtils::geometryFromGML( const QString &xmlString, const Contex
QgsGeometry QgsOgcUtils::geometryFromGMLPoint( const QDomElement &geometryElement )
{
QgsPolylineXY pointCoordinate;
QgsPolyline pointCoordinate;
const QDomNodeList coordList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) );
if ( !coordList.isEmpty() )
@ -238,13 +249,14 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPoint( const QDomElement &geometryElemen
return QgsGeometry();
}
QgsPolylineXY::const_iterator point_it = pointCoordinate.constBegin();
char e = htonl( 1 ) != 1;
double x = point_it->x();
double y = point_it->y();
const int size = 1 + sizeof( int ) + 2 * sizeof( double );
const bool hasZ { !std::isnan( pointCoordinate.first().z() ) };
QgsPolyline::const_iterator point_it = pointCoordinate.constBegin();
const char e = static_cast<char>( htonl( 1 ) != 1 );
const double x = point_it->x();
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];
int wkbPosition = 0; //current offset from wkb beginning (in bytes)
@ -256,6 +268,13 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPoint( const QDomElement &geometryElemen
wkbPosition += 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;
g.fromWkb( wkb, size );
return g;
@ -263,7 +282,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPoint( const QDomElement &geometryElemen
QgsGeometry QgsOgcUtils::geometryFromGMLLineString( const QDomElement &geometryElement )
{
QgsPolylineXY lineCoordinates;
QgsPolyline lineCoordinates;
const QDomNodeList coordList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) );
if ( !coordList.isEmpty() )
@ -288,10 +307,12 @@ QgsGeometry QgsOgcUtils::geometryFromGMLLineString( const QDomElement &geometryE
}
}
char e = htonl( 1 ) != 1;
const int size = 1 + 2 * sizeof( int ) + lineCoordinates.size() * 2 * sizeof( double );
const bool hasZ { !std::isnan( lineCoordinates.first().z() ) };
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];
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 ) );
wkbPosition += sizeof( int );
QgsPolylineXY::const_iterator iter;
QgsPolyline::const_iterator iter;
for ( iter = lineCoordinates.constBegin(); iter != lineCoordinates.constEnd(); ++iter )
{
x = iter->x();
@ -315,6 +336,14 @@ QgsGeometry QgsOgcUtils::geometryFromGMLLineString( const QDomElement &geometryE
wkbPosition += sizeof( double );
memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) );
wkbPosition += sizeof( double );
if ( hasZ )
{
double z = iter->z();
memcpy( &( wkb )[wkbPosition], &z, sizeof( double ) );
wkbPosition += sizeof( double );
}
}
QgsGeometry g;
@ -325,10 +354,10 @@ QgsGeometry QgsOgcUtils::geometryFromGMLLineString( const QDomElement &geometryE
QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElement )
{
//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
QgsPolylineXY exteriorPointList;
QgsPolyline exteriorPointList;
const QDomNodeList outerBoundaryList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "outerBoundaryIs" ) );
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" ) );
for ( int i = 0; i < innerBoundaryList.size(); ++i )
{
QgsPolylineXY interiorPointList;
QgsPolyline interiorPointList;
coordinatesElement = innerBoundaryList.at( i ).firstChild().firstChild().toElement();
if ( coordinatesElement.isNull() )
{
@ -383,7 +412,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElem
const QDomNodeList interiorList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "interior" ) );
for ( int i = 0; i < interiorList.size(); ++i )
{
QgsPolylineXY interiorPointList;
QgsPolyline interiorPointList;
const QDomElement posElement = interiorList.at( i ).firstChild().firstChild().toElement();
if ( posElement.isNull() )
{
@ -404,20 +433,23 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElem
return QgsGeometry();
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();
}
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];
//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 nPointsInRing = 0;
double x, y;
double x, y, z;
//fill the contents into *wkb
memcpy( &( wkb )[wkbPosition], &e, 1 );
@ -426,13 +458,13 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElem
wkbPosition += sizeof( int );
memcpy( &( wkb )[wkbPosition], &nrings, 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();
memcpy( &( wkb )[wkbPosition], &nPointsInRing, sizeof( int ) );
wkbPosition += sizeof( int );
//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 )
{
x = iter->x();
@ -442,6 +474,13 @@ QgsGeometry QgsOgcUtils::geometryFromGMLPolygon( const QDomElement &geometryElem
wkbPosition += sizeof( double );
memcpy( &( wkb )[wkbPosition], &y, 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 )
{
QgsPolylineXY pointList;
QgsPolylineXY currentPoint;
QgsPolyline pointList;
QgsPolyline currentPoint;
const QDomNodeList pointMemberList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "pointMember" ) );
if ( pointMemberList.size() < 1 )
{
@ -512,28 +551,30 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPoint( const QDomElement &geometryE
if ( nPoints < 1 )
return QgsGeometry();
//calculate the required wkb size
const int size = 1 + 2 * sizeof( int ) + pointList.size() * ( 2 * sizeof( double ) + 1 + sizeof( int ) );
const bool hasZ { !std::isnan( pointList.first().z() ) };
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];
//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)
double x, y;
double x, y, z;
memcpy( &( wkb )[wkbPosition], &e, 1 );
wkbPosition += 1;
memcpy( &( wkb )[wkbPosition], &type, sizeof( int ) );
wkbPosition += sizeof( int );
memcpy( &( wkb )[wkbPosition], &nPoints, sizeof( int ) );
wkbPosition += sizeof( int );
type = Qgis::WkbType::Point;
for ( QgsPolylineXY::const_iterator it = pointList.constBegin(); it != pointList.constEnd(); ++it )
const Qgis::WkbType pointType { hasZ ? Qgis::WkbType::PointZ : Qgis::WkbType::Point };
for ( QgsPolyline::const_iterator it = pointList.constBegin(); it != pointList.constEnd(); ++it )
{
memcpy( &( wkb )[wkbPosition], &e, 1 );
wkbPosition += 1;
memcpy( &( wkb )[wkbPosition], &type, sizeof( int ) );
memcpy( &( wkb )[wkbPosition], &pointType, sizeof( int ) );
wkbPosition += sizeof( int );
x = it->x();
memcpy( &( wkb )[wkbPosition], &x, sizeof( double ) );
@ -541,6 +582,13 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPoint( const QDomElement &geometryE
y = it->y();
memcpy( &( wkb )[wkbPosition], &y, sizeof( double ) );
wkbPosition += sizeof( double );
if ( hasZ )
{
z = it->z();
memcpy( &( wkb )[wkbPosition], &z, sizeof( double ) );
wkbPosition += sizeof( double );
}
}
QgsGeometry g;
@ -559,7 +607,8 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
//<gml:MultiLineString
//<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;
QDomNodeList currentCoordList;
QDomNodeList currentPosList;
@ -578,7 +627,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
currentCoordList = currentLineStringElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) );
if ( !currentCoordList.isEmpty() )
{
QgsPolylineXY currentPointList;
QgsPolyline currentPointList;
if ( readGMLCoordinates( currentPointList, currentCoordList.at( 0 ).toElement() ) != 0 )
{
return QgsGeometry();
@ -592,7 +641,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
{
return QgsGeometry();
}
QgsPolylineXY currentPointList;
QgsPolyline currentPointList;
if ( readGMLPositions( currentPointList, currentPosList.at( 0 ).toElement() ) != 0 )
{
return QgsGeometry();
@ -612,7 +661,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
currentCoordList = currentLineStringElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "coordinates" ) );
if ( !currentCoordList.isEmpty() )
{
QgsPolylineXY currentPointList;
QgsPolyline currentPointList;
if ( readGMLCoordinates( currentPointList, currentCoordList.at( 0 ).toElement() ) != 0 )
{
return QgsGeometry();
@ -627,7 +676,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
{
return QgsGeometry();
}
QgsPolylineXY currentPointList;
QgsPolyline currentPointList;
if ( readGMLPositions( currentPointList, currentPosList.at( 0 ).toElement() ) != 0 )
{
return QgsGeometry();
@ -646,38 +695,41 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
if ( nLines < 1 )
return QgsGeometry();
const bool hasZ { !std::isnan( lineCoordinates.first().first().z() ) };
const int coordSize { hasZ ? 3 : 2 };
//calculate the required wkb size
int size = ( lineCoordinates.size() + 1 ) * ( 1 + 2 * sizeof( int ) );
for ( QList< QgsPolylineXY >::const_iterator it = lineCoordinates.constBegin(); it != lineCoordinates.constEnd(); ++it )
int size = static_cast<int>( lineCoordinates.size() + 1 ) * ( 1 + 2 * sizeof( int ) );
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];
//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 nPoints; //number of points in a line
double x, y;
double x, y, z;
memcpy( &( wkb )[wkbPosition], &e, 1 );
wkbPosition += 1;
memcpy( &( wkb )[wkbPosition], &type, sizeof( int ) );
wkbPosition += sizeof( int );
memcpy( &( wkb )[wkbPosition], &nLines, sizeof( int ) );
wkbPosition += sizeof( int );
type = Qgis::WkbType::LineString;
for ( QList< QgsPolylineXY >::const_iterator it = lineCoordinates.constBegin(); it != lineCoordinates.constEnd(); ++it )
const Qgis::WkbType lineType { hasZ ? Qgis::WkbType::LineStringZ : Qgis::WkbType::LineString };
for ( QList< QgsPolyline >::const_iterator it = lineCoordinates.constBegin(); it != lineCoordinates.constEnd(); ++it )
{
memcpy( &( wkb )[wkbPosition], &e, 1 );
wkbPosition += 1;
memcpy( &( wkb )[wkbPosition], &type, sizeof( int ) );
memcpy( &( wkb )[wkbPosition], &lineType, sizeof( int ) );
wkbPosition += sizeof( int );
nPoints = it->size();
memcpy( &( wkb )[wkbPosition], &nPoints, 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();
y = iter->y();
@ -686,6 +738,13 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiLineString( const QDomElement &geom
wkbPosition += sizeof( double );
memcpy( &( wkb )[wkbPosition], &y, 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 )
{
//first list: different polygons, second list: different rings, third list: different points
QgsMultiPolygonXY multiPolygonPoints;
QVector<QgsMultiPolyline> multiPolygonPoints;
QDomElement currentPolygonMemberElement;
QDomNodeList polygonList;
QDomElement currentPolygonElement;
// rings in GML2
QDomNodeList outerBoundaryList;
QDomElement currentOuterBoundaryElement;
const QDomNodeList innerBoundaryList;
QDomElement currentInnerBoundaryElement;
// rings in GML3
QDomNodeList exteriorList;
QDomElement currentExteriorElement;
QDomElement currentInteriorElement;
const QDomNodeList interiorList;
// lienar ring
// linear ring
QDomNodeList linearRingNodeList;
QDomElement currentLinearRingElement;
// Coordinates or position list
@ -719,7 +776,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
QDomNodeList currentPosList;
const QDomNodeList polygonMemberList = geometryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "polygonMember" ) );
QgsPolygonXY currentPolygonList;
QgsMultiPolyline currentPolygonList;
for ( int i = 0; i < polygonMemberList.size(); ++i )
{
currentPolygonList.resize( 0 ); // preserve capacity - don't use clear
@ -736,7 +793,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
if ( !outerBoundaryList.isEmpty() )
{
currentOuterBoundaryElement = outerBoundaryList.at( 0 ).toElement();
QgsPolylineXY ringCoordinates;
QgsPolyline ringCoordinates;
linearRingNodeList = currentOuterBoundaryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) );
if ( linearRingNodeList.size() < 1 )
@ -759,7 +816,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
const QDomNodeList innerBoundaryList = currentPolygonElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "innerBoundaryIs" ) );
for ( int j = 0; j < innerBoundaryList.size(); ++j )
{
QgsPolylineXY ringCoordinates;
QgsPolyline ringCoordinates;
currentInnerBoundaryElement = innerBoundaryList.at( j ).toElement();
linearRingNodeList = currentInnerBoundaryElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) );
if ( linearRingNodeList.size() < 1 )
@ -789,7 +846,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
}
currentExteriorElement = exteriorList.at( 0 ).toElement();
QgsPolylineXY ringPositions;
QgsPolyline ringPositions;
linearRingNodeList = currentExteriorElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) );
if ( linearRingNodeList.size() < 1 )
@ -812,7 +869,7 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
const QDomNodeList interiorList = currentPolygonElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "interior" ) );
for ( int j = 0; j < interiorList.size(); ++j )
{
QgsPolylineXY ringPositions;
QgsPolyline ringPositions;
currentInteriorElement = interiorList.at( j ).toElement();
linearRingNodeList = currentInteriorElement.elementsByTagNameNS( GML_NAMESPACE, QStringLiteral( "LinearRing" ) );
if ( linearRingNodeList.size() < 1 )
@ -839,21 +896,24 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
if ( nPolygons < 1 )
return QgsGeometry();
const bool hasZ { !std::isnan( multiPolygonPoints.first().first().first().z() ) };
int size = 1 + 2 * sizeof( int );
//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 );
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];
char e = htonl( 1 ) != 1;
char e = static_cast<char>( htonl( 1 ) != 1 );
int wkbPosition = 0; //current offset from wkb beginning (in bytes)
double x, y;
int nRings;
@ -867,9 +927,9 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
memcpy( &( wkb )[wkbPosition], &nPolygons, 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 );
wkbPosition += 1;
@ -878,12 +938,12 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
nRings = it->size();
memcpy( &( wkb )[wkbPosition], &nRings, 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();
memcpy( &( wkb )[wkbPosition], &nPointsInRing, 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();
y = iterator->y();
@ -891,6 +951,12 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
wkbPosition += sizeof( double );
memcpy( &( wkb )[wkbPosition], &y, 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 tupleSeparator = QStringLiteral( " " );
@ -939,7 +1005,7 @@ bool QgsOgcUtils::readGMLCoordinates( QgsPolylineXY &coords, const QDomElement &
const QStringList tupels = elem.text().split( tupleSeparator, Qt::SkipEmptyParts );
QStringList tuple_coords;
double x, y;
double x, y, z;
bool conversionSuccess;
QStringList::const_iterator it;
@ -960,7 +1026,19 @@ bool QgsOgcUtils::readGMLCoordinates( QgsPolylineXY &coords, const QDomElement &
{
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;
}
@ -1001,12 +1079,12 @@ QgsRectangle QgsOgcUtils::rectangleFromGMLBox( const QDomNode &boxNode )
return rect;
}
bool QgsOgcUtils::readGMLPositions( QgsPolylineXY &coords, const QDomElement &elem )
bool QgsOgcUtils::readGMLPositions( QgsPolyline &coords, const QDomElement &elem )
{
coords.clear();
const QStringList pos = elem.text().split( ' ', Qt::SkipEmptyParts );
double x, y;
double x, y, z;
bool conversionSuccess;
const int posSize = pos.size();
@ -1040,7 +1118,19 @@ bool QgsOgcUtils::readGMLPositions( QgsPolylineXY &coords, const QDomElement &el
{
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;
}
@ -1250,7 +1340,9 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
{
case Qgis::WkbType::Point25D:
case Qgis::WkbType::Point:
case Qgis::WkbType::PointZ:
case Qgis::WkbType::MultiPoint25D:
case Qgis::WkbType::MultiPointZ:
case Qgis::WkbType::MultiPoint:
baseCoordElem = doc.createElement( QStringLiteral( "gml:pos" ) );
break;
@ -1258,7 +1350,6 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
baseCoordElem = doc.createElement( QStringLiteral( "gml:posList" ) );
break;
}
baseCoordElem.setAttribute( QStringLiteral( "srsDimension" ), QStringLiteral( "2" ) );
cs = ' ';
}
else
@ -1273,6 +1364,10 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
switch ( geometry.wkbType() )
{
case Qgis::WkbType::Point25D:
case Qgis::WkbType::PointZ:
hasZValue = true;
//intentional fall-through
[[fallthrough]];
case Qgis::WkbType::Point:
{
QDomElement pointElem = doc.createElement( QStringLiteral( "gml:Point" ) );
@ -1288,13 +1383,26 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
wkbPtr >> y >> x;
else
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 );
if ( gmlVersion != GML_2_1_2 )
coordElem.setAttribute( QStringLiteral( "srsDimension" ), hasZValue ? QStringLiteral( "3" ) : QStringLiteral( "2" ) );
pointElem.appendChild( coordElem );
return pointElem;
}
case Qgis::WkbType::MultiPoint25D:
case Qgis::WkbType::MultiPointZ:
hasZValue = true;
//intentional fall-through
[[fallthrough]];
@ -1325,21 +1433,38 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
wkbPtr >> y >> x;
else
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 )
{
wkbPtr += sizeof( double );
if ( gmlVersion != GML_2_1_2 )
{
double z = 0;
wkbPtr >> z;
coordString += cs + qgsDoubleToString( z, precision );
}
else
{
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 );
multiPointElem.appendChild( pointMemberElem );
}
return multiPointElem;
}
case Qgis::WkbType::LineString25D:
case Qgis::WkbType::LineStringZ:
hasZValue = true;
//intentional fall-through
[[fallthrough]];
@ -1374,15 +1499,28 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
if ( hasZValue )
{
wkbPtr += sizeof( double );
if ( gmlVersion != GML_2_1_2 )
{
double z = 0;
wkbPtr >> z;
coordString += cs + qgsDoubleToString( z, precision );
}
else
{
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" ) );
lineStringElem.appendChild( coordElem );
return lineStringElem;
}
case Qgis::WkbType::MultiLineString25D:
case Qgis::WkbType::MultiLineStringZ:
hasZValue = true;
//intentional fall-through
[[fallthrough]];
@ -1429,11 +1567,22 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
if ( hasZValue )
{
wkbPtr += sizeof( double );
if ( gmlVersion != GML_2_1_2 )
{
double z = 0;
wkbPtr >> z;
coordString += cs + qgsDoubleToString( z, precision );
}
else
{
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" ) );
lineStringElem.appendChild( coordElem );
lineStringMemberElem.appendChild( lineStringElem );
multiLineStringElem.appendChild( lineStringMemberElem );
@ -1441,6 +1590,7 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
return multiLineStringElem;
}
case Qgis::WkbType::Polygon25D:
case Qgis::WkbType::PolygonZ:
hasZValue = true;
//intentional fall-through
[[fallthrough]];
@ -1489,20 +1639,35 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
wkbPtr >> x >> y;
coordString += qgsDoubleToString( x, precision ) + cs + qgsDoubleToString( y, precision );
if ( hasZValue )
{
wkbPtr += sizeof( double );
if ( gmlVersion != GML_2_1_2 )
{
// Add Z
double z = 0;
wkbPtr >> z;
coordString += cs + qgsDoubleToString( z, precision );
}
else
{
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" ) );
ringElem.appendChild( coordElem );
boundaryElem.appendChild( ringElem );
polygonElem.appendChild( boundaryElem );
}
return polygonElem;
}
case Qgis::WkbType::MultiPolygon25D:
case Qgis::WkbType::MultiPolygonZ:
hasZValue = true;
//intentional fall-through
[[fallthrough]];
@ -1562,11 +1727,24 @@ QDomElement QgsOgcUtils::geometryToGML( const QgsGeometry &geometry,
if ( hasZValue )
{
wkbPtr += sizeof( double );
if ( gmlVersion != GML_2_1_2 )
{
// Add Z
double z = 0;
wkbPtr >> z;
coordString += cs + qgsDoubleToString( z, precision );
}
else
{
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" ) );
ringElem.appendChild( coordElem );
boundaryElem.appendChild( ringElem );
polygonElem.appendChild( boundaryElem );
@ -3823,3 +4001,17 @@ QgsOgcCrsUtils::CRSFlavor QgsOgcCrsUtils::parseCrsName( const QString &crsName,
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 method that creates geometry from GML MultiLineString
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 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
@ -330,7 +334,7 @@ class CORE_EXPORT QgsOgcUtils
* \param elem the \verbatim <gml:coordinates> \endverbatim element
* \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
@ -340,8 +344,7 @@ class CORE_EXPORT QgsOgcUtils
* \verbatim <gml:posList> \endverbatim element
* \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.
@ -379,6 +382,8 @@ class CORE_EXPORT QgsOgcUtils
static QgsExpressionNodeBinaryOperator *nodePropertyIsNullFromOgcFilter( QDomElement &element, QString &errorMessage );
};
#ifndef SIP_RUN
/**

View File

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

View File

@ -199,7 +199,7 @@ class CORE_EXPORT QgsTracer : public QObject
//! Extent for graph building (empty extent means no limit)
QgsRectangle mExtent;
//! 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
QgsGeometry mIntersections;

View File

@ -2162,6 +2162,33 @@ class QgsVectorFileWriterMetadataContainer
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" ),
QgsVectorFileWriter::MetaData(
QStringLiteral( "AutoCAD DXF" ),

View File

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

View File

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

View File

@ -16,6 +16,7 @@
#include "qgstest.h"
#include "qgs3d.h"
#include "qgs3dmapcanvas.h"
#include "qgs3dmapscene.h"
#include "qgs3dmapsettings.h"
#include "qgs3dutils.h"
@ -29,6 +30,8 @@
#include "qgsvectorlayer.h"
#include "qgsvectorlayer3drenderer.h"
#include <memory>
class TestQgs3DCameraController : public QgsTest
{
@ -54,6 +57,7 @@ class TestQgs3DCameraController : public QgsTest
void testRotationCenterRotationCameraRotationCenter();
void testResetViewRaster();
void testResetViewPointCloud();
void testChangeNavigationMode();
private:
void waitForNearPlane( QgsOffscreen3DEngine &engine, Qgs3DMapScene *scene, float atLeast ); //#spellok
@ -1213,6 +1217,9 @@ void TestQgs3DCameraController::testResetViewRaster()
Qgs3DMapScene *scene = new Qgs3DMapScene( *mapSettings, &engine );
engine.setRootEntity( scene );
// This ensures that the OpenGL context is properly created
Qgs3DUtils::captureSceneImage( engine, scene );
// compare raster layer + vector layer
scene->viewZoomFull();
QGSCOMPARENEAR( scene->cameraController()->distance(), 2172, 1 );
@ -1243,6 +1250,9 @@ void TestQgs3DCameraController::testResetViewPointCloud()
Qgs3DMapScene *scene = new Qgs3DMapScene( *mapSettings, &engine );
engine.setRootEntity( scene );
// This ensures that the OpenGL context is properly created
Qgs3DUtils::captureSceneImage( engine, scene );
// compare virtual point cloud layer
scene->viewZoomFull();
QGSCOMPARENEAR( scene->cameraController()->distance(), 86, 1 );
@ -1264,5 +1274,28 @@ void TestQgs3DCameraController::testResetViewPointCloud()
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 )
#include "testqgs3dcameracontroller.moc"

View File

@ -27,6 +27,8 @@
#include "qgsmapcanvastracer.h"
#include "testqgsmaptoolutils.h"
#include <QSignalSpy>
/**
* \ingroup UnitTests
@ -42,14 +44,18 @@ class TestQgsMapToolReshape : public QObject
void initTestCase(); // will be called before the first testfunction is executed.
void cleanupTestCase(); // will be called after the last testfunction was executed.
void testReshapeNotEnoughPoints();
void testReshapeNoChange();
void testReshapeZ();
void testTopologicalEditing();
void testTopologicalEditingNoSnap();
void testAvoidIntersectionAndTopoEdit();
void testAvoidIntersectionAndTopoEditSameLayer();
void testAvoidIntersectionAndTopoEditSameLayerSelection();
void reshapeWithBindingLine();
void testWithTracing();
void testKeepDirection();
void testWithSnapToSegment();
private:
QgisApp *mQgisApp = nullptr;
@ -220,6 +226,27 @@ void TestQgsMapToolReshape::cleanupTestCase()
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()
{
TestQgsMapToolAdvancedDigitizingUtils utils( mCaptureTool );
@ -385,6 +412,97 @@ void TestQgsMapToolReshape::testAvoidIntersectionAndTopoEdit()
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()
{
// 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)" );
QCOMPARE( mLayerLine->getFeature( 3 ).geometry().asWkt(), wkt3 );
// undo the three changes
mLayerLine->undoStack()->undo();
mLayerLine->undoStack()->undo();
mLayerLine->undoStack()->undo();
// activate back snapping
cfg.setEnabled( true );
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 )
#include "testqgsmaptoolreshape.moc"

View File

@ -53,6 +53,7 @@ class TestQgsGML : public QObject
void testStreamingParser();
void testStreamingParserInvalidGML();
void testPointGML2();
void testPointZGML2();
void testLineStringGML2();
void testPolygonGML2();
void testMultiPointGML2();
@ -90,6 +91,8 @@ class TestQgsGML : public QObject
void testUnknownEncoding();
void testUnhandledEncoding();
void testXPath();
void testZ();
void testZ_data();
};
const QString data1( "<myns:FeatureCollection "
@ -225,6 +228,34 @@ void TestQgsGML::testPointGML2()
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()
{
const QgsFields fields;
@ -749,11 +780,11 @@ void TestQgsGML::testPolygonGML3_srsDimension_on_Polygon()
"</myns:FeatureCollection>" ),
true ),
true );
QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::Polygon );
QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::PolygonZ );
QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures();
QCOMPARE( features.size(), 1 );
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();
QCOMPARE( poly.size(), 1 );
QCOMPARE( poly[0].size(), 5 );
@ -783,11 +814,11 @@ void TestQgsGML::testPolygonGML3_srsDimension_on_posList()
"</myns:FeatureCollection>" ),
true ),
true );
QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::Polygon );
QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::PolygonZ );
QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures();
QCOMPARE( features.size(), 1 );
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();
QCOMPARE( poly.size(), 1 );
QCOMPARE( poly[0].size(), 5 );
@ -821,11 +852,11 @@ void TestQgsGML::testPolygonGML3_pos()
"</myns:FeatureCollection>" ),
true ),
true );
QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::Polygon );
QCOMPARE( gmlParser.wkbType(), Qgis::WkbType::PolygonZ );
QVector<QgsGmlStreamingParser::QgsGmlFeaturePtrGmlIdPair> features = gmlParser.getAndStealReadyFeatures();
QCOMPARE( features.size(), 1 );
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();
QCOMPARE( poly.size(), 1 );
QCOMPARE( poly[0].size(), 5 );
@ -1604,5 +1635,90 @@ void TestQgsGML::testXPath()
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 )
#include "testqgsgml.moc"

View File

@ -54,8 +54,15 @@ class TestQgsOgcUtils : public QObject
}
void testGeometryFromGML();
void testGeometryFromGMLWithZ_data();
void testGeometryFromGMLWithZ();
void testGeometryToGML();
void testGeometryZToGML();
void testGeometryZToGML_data();
void testExpressionFromOgcFilter();
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>" ) );
QVERIFY( !geomBox.isNull() );
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 )
@ -174,6 +257,44 @@ void TestQgsOgcUtils::testGeometryToGML()
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()
{
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 ) );
QVERIFY( expr.get() );
qDebug( "OGC XML : %s", xmlText.toLatin1().data() );
qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() );
//qDebug( "OGC XML : %s", xmlText.toLatin1().data() );
//qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() );
if ( expr->hasParserError() )
qDebug( "ERROR: %s ", expr->parserErrorString().toLatin1().data() );
@ -432,8 +553,8 @@ void TestQgsOgcUtils::testExpressionFromOgcFilter()
std::unique_ptr<QgsExpression> expr( QgsOgcUtils::expressionFromOgcFilter( rootElem, &layer ) );
QVERIFY( expr.get() );
qDebug( "OGC XML : %s", xmlText.toLatin1().data() );
qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() );
//qDebug( "OGC XML : %s", xmlText.toLatin1().data() );
//qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() );
if ( expr->hasParserError() )
qDebug( "ERROR: %s ", expr->parserErrorString().toLatin1().data() );
@ -485,8 +606,8 @@ void TestQgsOgcUtils::testExpressionFromOgcFilterWithLongLong()
std::unique_ptr<QgsExpression> expr( QgsOgcUtils::expressionFromOgcFilter( rootElem, &layer ) );
QVERIFY( expr.get() );
qDebug( "OGC XML : %s", xmlText.toLatin1().data() );
qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() );
//qDebug( "OGC XML : %s", xmlText.toLatin1().data() );
//qDebug( "EXPR-DUMP: %s", expr->expression().toLatin1().data() );
if ( expr->hasParserError() )
qDebug( "ERROR: %s ", expr->parserErrorString().toLatin1().data() );
@ -514,8 +635,8 @@ void TestQgsOgcUtils::testExpressionToOgcFilter()
doc.appendChild( filterElem );
qDebug( "EXPR: %s", exp.expression().toLatin1().data() );
qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
//qDebug( "EXPR: %s", exp.expression().toLatin1().data() );
//qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
QDomElement xmlElem = comparableElement( xmlText );
@ -702,9 +823,9 @@ void TestQgsOgcUtils::testExpressionToOgcFilterWFS11()
doc.appendChild( filterElem );
qDebug( "EXPR: %s", exp.expression().toLatin1().data() );
qDebug( "SRSNAME: %s", srsName.toLatin1().data() );
qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
//qDebug( "EXPR: %s", exp.expression().toLatin1().data() );
//qDebug( "SRSNAME: %s", srsName.toLatin1().data() );
//qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
QDomElement xmlElem = comparableElement( xmlText );
@ -771,9 +892,9 @@ void TestQgsOgcUtils::testExpressionToOgcFilterWFS20()
doc.appendChild( filterElem );
qDebug( "EXPR: %s", exp.expression().toLatin1().data() );
qDebug( "SRSNAME: %s", srsName.toLatin1().data() );
qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
//qDebug( "EXPR: %s", exp.expression().toLatin1().data() );
//qDebug( "SRSNAME: %s", srsName.toLatin1().data() );
//qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
QDomElement xmlElem = comparableElement( xmlText );
QDomElement ogcElem = comparableElement( doc.toString( -1 ) );
@ -920,7 +1041,7 @@ void TestQgsOgcUtils::testSQLStatementToOgcFilter()
const QgsSQLStatement statement( statementText );
if ( !statement.hasParserError() )
{
qDebug( "%s", statement.parserErrorString().toLatin1().data() );
//qDebug( "%s", statement.parserErrorString().toLatin1().data() );
QVERIFY( !statement.hasParserError() );
}
@ -940,6 +1061,7 @@ void TestQgsOgcUtils::testSQLStatementToOgcFilter()
doc.appendChild( filterElem );
#if 0
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"
: 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"
: "unknown" );
qDebug( "OGC : %s", doc.toString( -1 ).toLatin1().data() );
#endif
QDomElement xmlElem = comparableElement( xmlText );
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>" ) );
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 ) );
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>" ) );
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 ) );
QVERIFY( QgsTestUtils::compareDomElements( xmlElem, ogcElem ) );

View File

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

View File

@ -4527,6 +4527,21 @@ class TestQgsGeometry(QgisTestCase):
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):
"""Test converting geometries to multi type"""
point = QgsGeometry.fromWkt("Point (1 2)")