mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-14 00:07:35 -04:00
Merge branch 'master' into reverseLine
This commit is contained in:
commit
87fb27fddb
@ -332,6 +332,9 @@ IF(WITH_CORE)
|
||||
FIND_PACKAGE(Qt53DExtras REQUIRED)
|
||||
SET(HAVE_3D TRUE) # used in qgsconfig.h
|
||||
ENDIF (WITH_3D)
|
||||
IF (APPLE)
|
||||
FIND_PACKAGE(Qt5MacExtras REQUIRED)
|
||||
ENDIF (APPLE)
|
||||
INCLUDE("cmake/modules/ECMQt4To5Porting.cmake")
|
||||
MESSAGE(STATUS "Found Qt version: ${Qt5Core_VERSION_STRING}")
|
||||
IF (WITH_QUICK)
|
||||
|
8
INSTALL
8
INSTALL
@ -1,10 +1,10 @@
|
||||
QGIS
|
||||
Building QGIS from source - step by step
|
||||
Friday August 10, 2018
|
||||
Wednesday August 22, 2018
|
||||
|
||||
|
||||
Last Updated: Friday August 10, 2018
|
||||
Last Change : Friday August 10, 2018
|
||||
Last Updated: Wednesday August 22, 2018
|
||||
Last Change : Wednesday August 22, 2018
|
||||
|
||||
|
||||
1. Introduction
|
||||
@ -184,7 +184,7 @@ Now update your local sources database:
|
||||
| buster | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
| xenial | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt5-default qt5keychain-dev qtbase5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
| bionic | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
| cosmic | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
| cosmic | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
| sid | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
|
||||
(extracted from the control.in file in debian/)
|
||||
|
28
debian/control.in
vendored
28
debian/control.in
vendored
@ -41,7 +41,7 @@ Build-Depends:
|
||||
xvfb, xauth,
|
||||
xfonts-base, xfonts-100dpi, xfonts-75dpi, xfonts-scalable,
|
||||
#sid buster bionic cosmic# libosgearth-dev,
|
||||
#bionic cosmic# qt3d5-dev, qt3d-assimpsceneimport-plugin, qt3d-defaultgeometryloader-plugin, qt3d-gltfsceneio-plugin, qt3d-scene2d-plugin,
|
||||
#bionic# qt3d5-dev, qt3d-assimpsceneimport-plugin, qt3d-defaultgeometryloader-plugin, qt3d-gltfsceneio-plugin, qt3d-scene2d-plugin,
|
||||
#oracle# oracle-instantclient12.1-devel, oracle-instantclient12.1-basiclite,
|
||||
locales, ca-certificates, ninja-build
|
||||
Build-Conflicts: libqgis-dev, qgis-dev
|
||||
@ -148,19 +148,19 @@ Description: QGIS - shared native gui library
|
||||
.
|
||||
This package contains the shared native gui library.
|
||||
|
||||
#bionic cosmic#Package: libqgis-3d{QGIS_ABI}
|
||||
#bionic cosmic#Architecture: any
|
||||
#bionic cosmic#Section: libs
|
||||
#bionic cosmic#Depends:
|
||||
#bionic cosmic# qt3d-assimpsceneimport-plugin, qt3d-defaultgeometryloader-plugin, qt3d-gltfsceneio-plugin, qt3d-scene2d-plugin,
|
||||
#bionic cosmic# ${shlibs:Depends},
|
||||
#bionic cosmic# ${misc:Depends}
|
||||
#bionic cosmic#Description: QGIS - shared 3d library
|
||||
#bionic cosmic# QGIS is a Geographic Information System (GIS) which manages, analyzes and
|
||||
#bionic cosmic# display databases of geographic information.
|
||||
#bionic cosmic# .
|
||||
#bionic cosmic# This package contains the shared 3d library.
|
||||
#bionic cosmic#
|
||||
#bionic#Package: libqgis-3d{QGIS_ABI}
|
||||
#bionic#Architecture: any
|
||||
#bionic#Section: libs
|
||||
#bionic#Depends:
|
||||
#bionic# qt3d-assimpsceneimport-plugin, qt3d-defaultgeometryloader-plugin, qt3d-gltfsceneio-plugin, qt3d-scene2d-plugin,
|
||||
#bionic# ${shlibs:Depends},
|
||||
#bionic# ${misc:Depends}
|
||||
#bionic#Description: QGIS - shared 3d library
|
||||
#bionic# QGIS is a Geographic Information System (GIS) which manages, analyzes and
|
||||
#bionic# display databases of geographic information.
|
||||
#bionic# .
|
||||
#bionic# This package contains the shared 3d library.
|
||||
#bionic#
|
||||
Package: libqgisgrass{GRASSVER}-{QGIS_ABI}
|
||||
Architecture: any
|
||||
Section: libs
|
||||
|
4
debian/rules
vendored
4
debian/rules
vendored
@ -104,8 +104,8 @@ ifneq (,$(findstring $(DISTRIBUTION),"sid buster stretch"))
|
||||
CMAKE_OPTS += -DPOSTGRES_LIBRARY=/usr/lib/$(DEB_BUILD_MULTIARCH)/libpq.so
|
||||
endif
|
||||
|
||||
ifneq (,$(findstring $(DISTRIBUTION),"artful bionic cosmic"))
|
||||
# Only on ubuntu - Qt3DExtras intentionally removed from debian (#895386)
|
||||
ifneq (,$(findstring $(DISTRIBUTION),"bionic"))
|
||||
# Only on bionic - Qt3DExtras intentionally removed from debian (#895386) and in turn ubuntu
|
||||
CMAKE_OPTS += \
|
||||
-DWITH_3D=TRUE \
|
||||
-DGEOS_LIBRARY=/usr/lib/$(DEB_BUILD_MULTIARCH)/libgeos_c.so
|
||||
|
@ -77,13 +77,13 @@ label{ background-color: #FFFFCC;
|
||||
<DIV CLASS="header" ID="header">
|
||||
<H1>QGIS</H1>
|
||||
<H2>Building QGIS from source - step by step</H2>
|
||||
<H3>Friday August 10, 2018</H3>
|
||||
<H3>Wednesday August 22, 2018</H3>
|
||||
</DIV>
|
||||
|
||||
<DIV CLASS="body" ID="body">
|
||||
<P>
|
||||
Last Updated: Friday August 10, 2018
|
||||
Last Change : Friday August 10, 2018
|
||||
Last Updated: Wednesday August 22, 2018
|
||||
Last Change : Wednesday August 22, 2018
|
||||
</P>
|
||||
<DIV CLASS="toc">
|
||||
|
||||
@ -327,7 +327,7 @@ sudo apt-get update
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>cosmic</TD>
|
||||
<TD><CODE>apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb</CODE></TD>
|
||||
<TD><CODE>apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb</CODE></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>sid</TD>
|
||||
|
@ -48,7 +48,7 @@ sudo apt-get update
|
||||
| buster | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
| xenial | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt5-default qt5keychain-dev qtbase5-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
| bionic | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
| cosmic | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
| cosmic | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
| sid | ``apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex gdal-bin git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libosgearth-dev libpq-dev libproj-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqt5opengl5-dev libqt5scintilla2-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 lighttpd locales ninja-build opencl-headers pkg-config poppler-utils pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python-autopep8 python3-all-dev python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb`` |
|
||||
|
||||
(extracted from the control.in file in ``debian/``)
|
||||
|
@ -703,6 +703,7 @@
|
||||
<file>themes/default/mAddToProject.svg</file>
|
||||
<file>themes/default/mDockify.svg</file>
|
||||
<file>themes/default/mActionReverseLine.svg</file>
|
||||
<file>themes/default/mActionAdd3DMap.svg</file>
|
||||
</qresource>
|
||||
<qresource prefix="/images/tips">
|
||||
<file alias="symbol_levels.png">qgis_tips/symbol_levels.png</file>
|
||||
|
163
images/themes/default/mActionAdd3DMap.svg
Normal file
163
images/themes/default/mActionAdd3DMap.svg
Normal file
@ -0,0 +1,163 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.1"
|
||||
id="svg23"
|
||||
sodipodi:docname="mActionAdd3DMap.svg"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)">
|
||||
<metadata
|
||||
id="metadata29">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs27">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient918">
|
||||
<stop
|
||||
style="stop-color:#bfbfbf;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop914" />
|
||||
<stop
|
||||
style="stop-color:#e1e1e1;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop916" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient918"
|
||||
id="linearGradient920"
|
||||
x1="3.1228814"
|
||||
y1="12.46981"
|
||||
x2="8.275053"
|
||||
y2="14.920922"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1871"
|
||||
inkscape:window-height="1025"
|
||||
id="namedview25"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2"
|
||||
inkscape:cx="141.16464"
|
||||
inkscape:cy="18.121147"
|
||||
inkscape:window-x="49"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg23" />
|
||||
<linearGradient
|
||||
id="a"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="3.5"
|
||||
x2="11.5"
|
||||
y1="19.5"
|
||||
y2="19.5"
|
||||
gradientTransform="translate(41.288136,10.305085)">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#b7b7b7"
|
||||
id="stop2" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#e6e6e6"
|
||||
id="stop4" />
|
||||
</linearGradient>
|
||||
<path
|
||||
style="fill:url(#linearGradient920);fill-opacity:1;stroke:none;stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 21.221115,4.8048602 -0.983202,0.43846 -3.16343,-0.4307914 -2.54778,0.1286093 L 9.8801462,4.3893472 6.454113,6.5957888 5.0087476,6.5827232 3.8477042,11.243014 l -2.87303007,4.437033 3.14407087,0.06429 9.540628,2.572195 7.850231,-0.563536 z"
|
||||
id="path847-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccccccccc" />
|
||||
<g
|
||||
id="g952"
|
||||
style="stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke:#aaaaaa;stroke-opacity:1">
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path849-6"
|
||||
d="M 13.053454,4.7153071 9.3797338,8.3492956 6.7214087,11.611531 5.7301688,13.429378 4.1818687,15.744345"
|
||||
style="fill:none;stroke:#aaaaaa;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path851-7"
|
||||
d="m 17.256619,5.0413044 -4.393208,5.1728316 -1.864108,2.721474 -0.951918,4.105895"
|
||||
style="fill:none;stroke:#aaaaaa;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path853-5"
|
||||
d="m 20.237913,5.2433202 -0.481796,3.4228902 -2.192507,3.0912416 -2.155672,1.623494 -0.758428,2.046017 -0.735466,2.889576"
|
||||
style="fill:none;stroke:#aaaaaa;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path855-3"
|
||||
d="m 4.0595127,11.593921 2.661896,0.01761 4.2778943,1.324079 c 2.194869,-0.350329 4.377703,-0.778818 6.564307,-1.178158 l 3.629577,3.248202"
|
||||
style="fill:none;stroke:#aaaaaa;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path857-5"
|
||||
d="m 6.2173238,6.8859807 4.0432972,0.6004049 2.682193,2.5228974 6.813303,-1.3430726 1.793563,1.9437616"
|
||||
style="fill:none;stroke:#aaaaaa;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#9a9a9a;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 21.221115,4.8048602 19.806458,5.1354565 17.074483,4.8125289 14.526703,4.9411382 9.8801462,4.3893472 6.454113,6.5957888 5.0087476,6.5827232 3.8477042,11.243014 l -2.87303007,4.437033 3.14407087,0.06429 9.540628,2.572195 7.850231,-0.563536 z"
|
||||
id="path847-3-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccccccccc" />
|
||||
<g
|
||||
id="g19"
|
||||
transform="matrix(0.69230769,0,0,0.69230769,1.8461539,1.8461539)">
|
||||
<rect
|
||||
style="fill:#5a8c5a"
|
||||
id="rect11"
|
||||
y="19"
|
||||
x="19"
|
||||
width="13"
|
||||
ry="2.6149368"
|
||||
rx="2.6149371"
|
||||
height="13" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path13"
|
||||
style="overflow:visible;fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.5999999;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="m 21.6,25.499999 h 7.8" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15"
|
||||
style="overflow:visible;fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.5999999;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="M 25.5,29.399999 V 21.6" />
|
||||
<path
|
||||
style="opacity:0.3;fill:#fcffff;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path17"
|
||||
d="m 20.3,25.499999 h 10.4 c 0,0 0,0 0,-2.6 C 30.7,20.3 30.05,20.3 25.5,20.3 c -4.55,0 -5.2,0 -5.2,2.599999 0,2.6 0,2.6 0,2.6 z" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 6.4 KiB |
@ -150,7 +150,10 @@ cmake -G "%CMAKEGEN%" ^
|
||||
-D WITH_GLOBE=FALSE ^
|
||||
-D WITH_ORACLE=TRUE ^
|
||||
-D WITH_CUSTOM_WIDGETS=TRUE ^
|
||||
-D CMAKE_CXX_FLAGS_RELEASE="/MD /MP /O2 /Ob2 /D NDEBUG" ^
|
||||
-D CMAKE_CXX_FLAGS_RELEASE="/MD /Zi /MP /O2 /Ob2 /D NDEBUG" ^
|
||||
-D CMAKE_SHARED_LINKER_FLAGS_RELEASE="/INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF" ^
|
||||
-D CMAKE_MODULE_LINKER_FLAGS_RELEASE="/INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF" ^
|
||||
-D CMAKE_PDB_OUTPUT_DIRECTORY_RELEASE=%BUILDDIR%\apps\%PACKAGENAME%\pdb ^
|
||||
-D CMAKE_BUILD_TYPE=%BUILDCONF% ^
|
||||
-D CMAKE_CONFIGURATION_TYPES=%BUILDCONF% ^
|
||||
-D GEOS_LIBRARY=%O4W_ROOT%/lib/geos_c.lib ^
|
||||
@ -407,6 +410,11 @@ if not exist %ARCH%\release\qgis\%PACKAGENAME% mkdir %ARCH%\release\qgis\%PACKAG
|
||||
"etc/preremove/%PACKAGENAME%.bat"
|
||||
if errorlevel 1 (echo tar desktop failed & goto error)
|
||||
|
||||
if not exist %ARCH%\release\qgis\%PACKAGENAME%-pdb mkdir %ARCH%\release\qgis\%PACKAGENAME%-pdb
|
||||
%TAR% -C %BUILDDIR% -cjf %ARCH%/release/qgis/%PACKAGENAME%-pdb/%PACKAGENAME%-pdb-%VERSION%-%PACKAGE%.tar.bz2 ^
|
||||
apps/%PACKAGENAME%/pdb
|
||||
if errorlevel 1 (echo tar failed & goto error)
|
||||
|
||||
%TAR% -C %OSGEO4W_ROOT% -cjf %ARCH%/release/qgis/%PACKAGENAME%-grass-plugin-common/%PACKAGENAME%-grass-plugin-common-%VERSION%-%PACKAGE%.tar.bz2 ^
|
||||
--exclude-from exclude ^
|
||||
--exclude "*.pyc" ^
|
||||
|
@ -20,15 +20,6 @@ Windows Registry Editor Version 5.00
|
||||
[HKEY_CLASSES_ROOT\.qgz]
|
||||
@="QGIS Project"
|
||||
|
||||
[HKEY_CLASSES_ROOT\QGIS Layer Definition]
|
||||
@="QGIS Layer Definition"
|
||||
|
||||
[HKEY_CLASSES_ROOT\QGIS Layer Definition\DefaultIcon]
|
||||
@="@osgeo4w@\\apps\\@package@\\icons\\qgis-qml.ico"
|
||||
|
||||
[HKEY_CLASSES_ROOT\.qml]
|
||||
@="QGIS Layer Definition"
|
||||
|
||||
[HKEY_CLASSES_ROOT\QGIS Composer Template]
|
||||
@="QGIS Composer Template"
|
||||
|
||||
|
@ -169,8 +169,9 @@ class ShellOutputScintilla(QsciScintilla):
|
||||
|
||||
def insertInitText(self):
|
||||
txtInit = QCoreApplication.translate("PythonConsole",
|
||||
"Python Console \n"
|
||||
"Use iface to access QGIS API interface or Type help(iface) for more info")
|
||||
"Python Console\n"
|
||||
"Use iface to access QGIS API interface or Type help(iface) for more info\n"
|
||||
"Security warning: typing commands from an untrusted source can lead to data loss and/or leak")
|
||||
|
||||
# some translation string for the console header ends without '\n'
|
||||
# and the first command in console will be appended at the header text.
|
||||
|
@ -37,7 +37,7 @@ for geometry objects. QgsGeometry is implicitly shared, so making copies of geom
|
||||
container class can also be stored inside a QVariant object.
|
||||
|
||||
The actual geometry representation is stored as a QgsAbstractGeometry within the container, and
|
||||
can be accessed via the geometry() method or set using the setGeometry() method.
|
||||
can be accessed via the get() method or set using the set() method.
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
|
@ -178,6 +178,8 @@ of layout items.
|
||||
LayoutAttributeTable,
|
||||
LayoutTextTable,
|
||||
|
||||
Layout3DMap,
|
||||
|
||||
// item
|
||||
PluginItem,
|
||||
};
|
||||
|
@ -359,6 +359,18 @@ Returns dataset metadata
|
||||
Returns vector/scalar value associated with the index from the dataset
|
||||
|
||||
See QgsMeshDatasetMetadata.isVector() to check if the returned value is vector or scalar
|
||||
%End
|
||||
|
||||
virtual bool isFaceActive( QgsMeshDatasetIndex index, int faceIndex ) const = 0;
|
||||
%Docstring
|
||||
Returns whether the face is active for particular dataset
|
||||
|
||||
For example to represent the situation when F1 and F3 are flooded, but F2 is dry,
|
||||
some solvers store water depth on vertices V1-V8 (all non-zero values) and
|
||||
set active flag for F2 to false.
|
||||
V1 ---- V2 ---- V5-----V7
|
||||
| F1 | F2 | F3 |
|
||||
V3 ---- V4 ---- V6-----V8
|
||||
%End
|
||||
};
|
||||
|
||||
|
@ -635,7 +635,7 @@ Check if a feature is accepted by this requests filter
|
||||
.. versionadded:: 2.1
|
||||
%End
|
||||
|
||||
int connectionTimeout() const;
|
||||
int connectionTimeout() const /Deprecated/;
|
||||
%Docstring
|
||||
Returns the timeout (in milliseconds) for how long we should wait for a connection if none is available from the pool
|
||||
at this moment. A negative value (which is set by default) will wait forever.
|
||||
@ -644,10 +644,12 @@ at this moment. A negative value (which is set by default) will wait forever.
|
||||
|
||||
Only works if the provider supports this option.
|
||||
|
||||
.. deprecated:: Use timeout() instead.
|
||||
|
||||
.. versionadded:: 3.0
|
||||
%End
|
||||
|
||||
QgsFeatureRequest &setConnectionTimeout( int connectionTimeout );
|
||||
QgsFeatureRequest &setConnectionTimeout( int connectionTimeout ) /Deprecated/;
|
||||
%Docstring
|
||||
Sets the timeout (in milliseconds) for how long we should wait for a connection if none is available from the pool
|
||||
at this moment. A negative value (which is set by default) will wait forever.
|
||||
@ -656,7 +658,33 @@ at this moment. A negative value (which is set by default) will wait forever.
|
||||
|
||||
Only works if the provider supports this option.
|
||||
|
||||
.. deprecated:: Use setTimeout() instead.
|
||||
|
||||
.. versionadded:: 3.0
|
||||
%End
|
||||
|
||||
int timeout() const;
|
||||
%Docstring
|
||||
Returns the timeout (in milliseconds) for the maximum time we should wait during feature requests before a
|
||||
feature is returned. A negative value (which is set by default) will wait forever.
|
||||
|
||||
.. note::
|
||||
|
||||
Only works if the provider supports this option.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
QgsFeatureRequest &setTimeout( int timeout );
|
||||
%Docstring
|
||||
Sets the ``timeout`` (in milliseconds) for the maximum time we should wait during feature requests before a
|
||||
feature is returned. A negative value (which is set by default) will wait forever.
|
||||
|
||||
.. note::
|
||||
|
||||
Only works if the provider supports this option.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
bool requestMayBeNested() const;
|
||||
|
86
python/core/auto_generated/qgsgeometryfixes.sip.in
Normal file
86
python/core/auto_generated/qgsgeometryfixes.sip.in
Normal file
@ -0,0 +1,86 @@
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/qgsgeometryfixes.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
class QgsGeometryFixes
|
||||
{
|
||||
%Docstring
|
||||
|
||||
The QgsGeometryFixes class contains options to automatically adjust geometries to
|
||||
constraints on a layer.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgsgeometryfixes.h"
|
||||
%End
|
||||
public:
|
||||
|
||||
QgsGeometryFixes();
|
||||
%Docstring
|
||||
Create a new QgsGeometryFixes object.
|
||||
%End
|
||||
|
||||
bool removeDuplicateNodes() const;
|
||||
%Docstring
|
||||
Automatically remove duplicate nodes on all geometries which are edited on this layer.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
void setRemoveDuplicateNodes( bool value );
|
||||
%Docstring
|
||||
Automatically remove duplicate nodes on all geometries which are edited on this layer.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
double geometryPrecision() const;
|
||||
%Docstring
|
||||
The precision in which geometries on this layer should be saved.
|
||||
Geometries which are edited on this layer will be rounded to multiples of this value (snap to grid).
|
||||
Set to 0.0 to disable.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
void setGeometryPrecision( double value );
|
||||
%Docstring
|
||||
The precision in which geometries on this layer should be saved.
|
||||
Geometries which are edited on this layer will be rounded to multiples of this value (snap to grid).
|
||||
Set to 0.0 to disable.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
bool isActive() const;
|
||||
%Docstring
|
||||
Determines if at least one fix is enabled.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
void apply( QgsGeometry &geometry ) const;
|
||||
%Docstring
|
||||
Apply any fixes configured on this class to ``geometry``.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
};
|
||||
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/qgsgeometryfixes.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
@ -93,6 +93,15 @@ Returns the list of data providers which are excluded from the model.
|
||||
.. seealso:: :py:func:`setExcludedProviders`
|
||||
|
||||
.. versionadded:: 3.0
|
||||
%End
|
||||
|
||||
QString filterString() const;
|
||||
%Docstring
|
||||
Returns the current filter string, if set.
|
||||
|
||||
.. seealso:: :py:func:`setFilterString`
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
virtual bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const;
|
||||
@ -100,6 +109,18 @@ Returns the list of data providers which are excluded from the model.
|
||||
virtual bool lessThan( const QModelIndex &left, const QModelIndex &right ) const;
|
||||
|
||||
|
||||
public slots:
|
||||
|
||||
void setFilterString( const QString &filter );
|
||||
%Docstring
|
||||
Sets a ``filter`` string, such that only layers with names matching the
|
||||
specified string will be shown.
|
||||
|
||||
.. seealso:: :py:func:`filterString`
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
};
|
||||
|
||||
QFlags<QgsMapLayerProxyModel::Filter> operator|(QgsMapLayerProxyModel::Filter f1, QFlags<QgsMapLayerProxyModel::Filter> f2);
|
||||
|
@ -52,6 +52,36 @@ This method is safe to call from the main thread.
|
||||
|
||||
};
|
||||
|
||||
class QgsScopedProxyProgressTask
|
||||
{
|
||||
%Docstring
|
||||
|
||||
Scoped :py:class:`QgsScopedProxyProgressTask`, which automatically adds the proxy task
|
||||
to the application task manager on construction and finalizes the task
|
||||
when it goes out of scope.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgsproxyprogresstask.h"
|
||||
%End
|
||||
public:
|
||||
|
||||
QgsScopedProxyProgressTask( const QString &description );
|
||||
%Docstring
|
||||
Constructor for QgsScopedProxyProgressTask, with the specified ``description``.
|
||||
%End
|
||||
|
||||
~QgsScopedProxyProgressTask();
|
||||
|
||||
void setProgress( double progress );
|
||||
%Docstring
|
||||
Sets the ``progress`` (from 0 to 100) for the proxied operation.
|
||||
%End
|
||||
|
||||
};
|
||||
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
class QgsRelation
|
||||
{
|
||||
|
||||
@ -34,6 +35,15 @@ class QgsRelation
|
||||
%Docstring
|
||||
Default constructor. Creates an invalid relation.
|
||||
%End
|
||||
~QgsRelation();
|
||||
|
||||
QgsRelation( const QgsRelation &other );
|
||||
%Docstring
|
||||
Copies a relation.
|
||||
This makes a shallow copy, relations are implicitly shared and only duplicated when the copy is
|
||||
changed.
|
||||
%End
|
||||
|
||||
|
||||
static QgsRelation createFromXml( const QDomNode &node, QgsReadWriteContext &context );
|
||||
%Docstring
|
||||
|
@ -229,6 +229,7 @@ Creates a clone of the FieldValueConverter.
|
||||
AppendToLayerAddFields
|
||||
};
|
||||
|
||||
|
||||
static QgsVectorFileWriter::WriterError writeAsVectorFormat( QgsVectorLayer *layer,
|
||||
const QString &fileName,
|
||||
const QString &fileEncoding,
|
||||
@ -250,7 +251,7 @@ Creates a clone of the FieldValueConverter.
|
||||
QgsVectorFileWriter::FieldValueConverter *fieldValueConverter = 0
|
||||
);
|
||||
%Docstring
|
||||
Write contents of vector layer to an (OGR supported) vector formt
|
||||
Write contents of vector layer to an (OGR supported) vector format
|
||||
|
||||
:param layer: layer to write
|
||||
:param fileName: file name to write to
|
||||
@ -274,6 +275,7 @@ Write contents of vector layer to an (OGR supported) vector formt
|
||||
:param fieldValueConverter: field value converter (added in QGIS 2.16)
|
||||
%End
|
||||
|
||||
|
||||
static QgsVectorFileWriter::WriterError writeAsVectorFormat( QgsVectorLayer *layer,
|
||||
const QString &fileName,
|
||||
const QString &fileEncoding,
|
||||
@ -322,7 +324,6 @@ Writes a layer out to a vector file.
|
||||
.. versionadded:: 2.2
|
||||
%End
|
||||
|
||||
|
||||
class SaveVectorOptions
|
||||
{
|
||||
%Docstring
|
||||
@ -379,11 +380,13 @@ Constructor
|
||||
QgsFeedback *feedback;
|
||||
};
|
||||
|
||||
|
||||
static QgsVectorFileWriter::WriterError writeAsVectorFormat( QgsVectorLayer *layer,
|
||||
const QString &fileName,
|
||||
const QgsVectorFileWriter::SaveVectorOptions &options,
|
||||
QString *newFilename = 0,
|
||||
QString *errorMessage /Out/ = 0 );
|
||||
QString *errorMessage /Out/ = 0
|
||||
);
|
||||
%Docstring
|
||||
Writes a layer out to a vector file.
|
||||
|
||||
@ -407,9 +410,6 @@ Writes a layer out to a vector file.
|
||||
QString *newFilename = 0,
|
||||
QgsVectorFileWriter::SymbologyExport symbologyExport = QgsVectorFileWriter::NoSymbology
|
||||
);
|
||||
%Docstring
|
||||
Create a new vector file writer
|
||||
%End
|
||||
|
||||
|
||||
|
||||
|
@ -45,8 +45,13 @@ and save ``options``.
|
||||
%Docstring
|
||||
Emitted when writing the layer is successfully completed. The ``newFilename``
|
||||
parameter indicates the file path for the written file.
|
||||
|
||||
.. note::
|
||||
|
||||
this signal is deprecated in favor of completed().
|
||||
%End
|
||||
|
||||
|
||||
void errorOccurred( int error, const QString &errorMessage );
|
||||
%Docstring
|
||||
Emitted when an error occurs which prevented the file being written (or if
|
||||
|
@ -1062,7 +1062,7 @@ Query the layer for the features which intersect the specified rectangle.
|
||||
virtual bool addFeature( QgsFeature &feature, QgsFeatureSink::Flags flags = 0 );
|
||||
|
||||
|
||||
bool updateFeature( const QgsFeature &feature, bool skipDefaultValues = false );
|
||||
bool updateFeature( QgsFeature &feature, bool skipDefaultValues = false );
|
||||
%Docstring
|
||||
Updates an existing ``feature`` in the layer, replacing the attributes and geometry for the feature
|
||||
with matching QgsFeature.id() with the attributes and geometry from ``feature``.
|
||||
@ -1498,7 +1498,7 @@ Make layer read-only (editing disabled) or not
|
||||
:return: false if the layer is in editing yet
|
||||
%End
|
||||
|
||||
bool changeGeometry( QgsFeatureId fid, const QgsGeometry &geometry, bool skipDefaultValue = false );
|
||||
bool changeGeometry( QgsFeatureId fid, QgsGeometry &geometry, bool skipDefaultValue = false );
|
||||
%Docstring
|
||||
Changes a feature's ``geometry`` within the layer's edit buffer
|
||||
(but does not immediately commit the changes). The ``fid`` argument
|
||||
@ -2223,6 +2223,13 @@ it.
|
||||
Test if an edit command is active
|
||||
|
||||
.. versionadded:: 3.0
|
||||
%End
|
||||
|
||||
QgsGeometryFixes *geometryFixes() const;
|
||||
%Docstring
|
||||
Configuration and logic to apply automatically on any edit happening on this layer.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
%End
|
||||
|
||||
public slots:
|
||||
@ -2590,7 +2597,7 @@ Emitted when the feature count for symbols on this layer has been recalculated.
|
||||
Sets the extent
|
||||
%End
|
||||
|
||||
private: // Private methods
|
||||
private:
|
||||
QgsVectorLayer( const QgsVectorLayer &rhs );
|
||||
};
|
||||
|
||||
|
@ -130,8 +130,6 @@ The main tasks carried out by the constructor are:
|
||||
-Determine whether the layer is gray, paletted or multiband.
|
||||
|
||||
-Assign sensible defaults for the red, green, blue and gray bands.
|
||||
|
||||
-
|
||||
%End
|
||||
|
||||
~QgsRasterLayer();
|
||||
|
@ -53,6 +53,7 @@
|
||||
%Include auto_generated/qgsfields.sip
|
||||
%Include auto_generated/qgsfileutils.sip
|
||||
%Include auto_generated/qgsfontutils.sip
|
||||
%Include auto_generated/qgsgeometryfixes.sip
|
||||
%Include auto_generated/qgsgeometrysimplifier.sip
|
||||
%Include auto_generated/qgshistogram.sip
|
||||
%Include auto_generated/qgshtmlutils.sip
|
||||
|
@ -102,10 +102,11 @@ Emitted when a layer needs to be replaced
|
||||
:param provider: key
|
||||
%End
|
||||
|
||||
|
||||
void progress( int, int );
|
||||
void progress( int, int ) /Deprecated/;
|
||||
%Docstring
|
||||
Emitted when a progress dialog is shown by the provider dialog
|
||||
Emitted when a progress dialog is shown by the provider dialog.
|
||||
|
||||
.. deprecated:: Since QGIS 3.4 this signal is no longer used. Use QgsProxyProgressTask instead to show progress reports.
|
||||
%End
|
||||
|
||||
void progressMessage( QString message );
|
||||
|
@ -131,18 +131,15 @@
|
||||
<property name="text">
|
||||
<string>User role</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLineEdit" name="editUser">
|
||||
<property name="text">
|
||||
<string>user_role</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="editUser">
|
||||
<property name="text">
|
||||
<string>time_end</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
@ -190,7 +187,6 @@
|
||||
<tabstop>editPkey</tabstop>
|
||||
<tabstop>editStart</tabstop>
|
||||
<tabstop>editEnd</tabstop>
|
||||
<tabstop>editUser</tabstop>
|
||||
<tabstop>txtSql</tabstop>
|
||||
<tabstop>buttonBox</tabstop>
|
||||
</tabstops>
|
||||
|
@ -25,7 +25,8 @@ __copyright__ = '(C) 2012, Victor Olaya'
|
||||
|
||||
__revision__ = '$Format:%H$'
|
||||
|
||||
from qgis.core import (QgsProcessingException,
|
||||
from qgis.core import (QgsProcessing,
|
||||
QgsProcessingException,
|
||||
QgsProcessingParameterFeatureSource,
|
||||
QgsProcessingParameterString,
|
||||
QgsProcessingParameterEnum,
|
||||
@ -41,11 +42,11 @@ from processing.tools.system import isWindows
|
||||
|
||||
|
||||
class OgrToPostGis(GdalAlgorithm):
|
||||
|
||||
INPUT = 'INPUT'
|
||||
SHAPE_ENCODING = 'SHAPE_ENCODING'
|
||||
GTYPE = 'GTYPE'
|
||||
GEOMTYPE = ['', 'NONE', 'GEOMETRY', 'POINT', 'LINESTRING', 'POLYGON', 'GEOMETRYCOLLECTION', 'MULTIPOINT', 'MULTIPOLYGON', 'MULTILINESTRING']
|
||||
GEOMTYPE = ['', 'NONE', 'GEOMETRY', 'POINT', 'LINESTRING', 'POLYGON', 'GEOMETRYCOLLECTION', 'MULTIPOINT',
|
||||
'MULTIPOLYGON', 'MULTILINESTRING']
|
||||
S_SRS = 'S_SRS'
|
||||
T_SRS = 'T_SRS'
|
||||
A_SRS = 'A_SRS'
|
||||
@ -83,15 +84,18 @@ class OgrToPostGis(GdalAlgorithm):
|
||||
|
||||
def initAlgorithm(self, config=None):
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
|
||||
self.tr('Input layer')))
|
||||
self.tr('Input layer'),
|
||||
types=[QgsProcessing.TypeVector]))
|
||||
self.addParameter(QgsProcessingParameterString(self.SHAPE_ENCODING,
|
||||
self.tr('Shape encoding'), "", optional=True))
|
||||
self.addParameter(QgsProcessingParameterEnum(self.GTYPE,
|
||||
self.tr('Output geometry type'), options=self.GEOMTYPE, defaultValue=0))
|
||||
self.tr('Output geometry type'), options=self.GEOMTYPE,
|
||||
defaultValue=0))
|
||||
self.addParameter(QgsProcessingParameterCrs(self.A_SRS,
|
||||
self.tr('Assign an output CRS'), defaultValue='', optional=True))
|
||||
self.addParameter(QgsProcessingParameterCrs(self.T_SRS,
|
||||
self.tr('Reproject to this CRS on output '), defaultValue='', optional=True))
|
||||
self.tr('Reproject to this CRS on output '), defaultValue='',
|
||||
optional=True))
|
||||
self.addParameter(QgsProcessingParameterCrs(self.S_SRS,
|
||||
self.tr('Override source CRS'), defaultValue='', optional=True))
|
||||
self.addParameter(QgsProcessingParameterString(self.HOST,
|
||||
@ -110,13 +114,18 @@ class OgrToPostGis(GdalAlgorithm):
|
||||
self.tr('Table name, leave blank to use input name'),
|
||||
defaultValue='', optional=True))
|
||||
self.addParameter(QgsProcessingParameterString(self.PK,
|
||||
self.tr('Primary key (new field)'), defaultValue='id', optional=True))
|
||||
self.tr('Primary key (new field)'), defaultValue='id',
|
||||
optional=True))
|
||||
self.addParameter(QgsProcessingParameterField(self.PRIMARY_KEY,
|
||||
self.tr('Primary key (existing field, used if the above option is left empty)'), parentLayerParameterName=self.INPUT, optional=True))
|
||||
self.tr(
|
||||
'Primary key (existing field, used if the above option is left empty)'),
|
||||
parentLayerParameterName=self.INPUT, optional=True))
|
||||
self.addParameter(QgsProcessingParameterString(self.GEOCOLUMN,
|
||||
self.tr('Geometry column name'), defaultValue='geom', optional=True))
|
||||
self.tr('Geometry column name'), defaultValue='geom',
|
||||
optional=True))
|
||||
self.addParameter(QgsProcessingParameterEnum(self.DIM,
|
||||
self.tr('Vector dimensions'), options=self.DIMLIST, defaultValue=0))
|
||||
self.tr('Vector dimensions'), options=self.DIMLIST,
|
||||
defaultValue=0))
|
||||
self.addParameter(QgsProcessingParameterString(self.SIMPLIFY,
|
||||
self.tr('Distance tolerance for simplification'),
|
||||
defaultValue='', optional=True))
|
||||
@ -124,16 +133,20 @@ class OgrToPostGis(GdalAlgorithm):
|
||||
self.tr('Maximum distance between 2 nodes (densification)'),
|
||||
defaultValue='', optional=True))
|
||||
self.addParameter(QgsProcessingParameterExtent(self.SPAT,
|
||||
self.tr('Select features by extent (defined in input layer CRS)'), optional=True))
|
||||
self.tr(
|
||||
'Select features by extent (defined in input layer CRS)'),
|
||||
optional=True))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.CLIP,
|
||||
self.tr('Clip the input layer using the above (rectangle) extent'),
|
||||
self.tr(
|
||||
'Clip the input layer using the above (rectangle) extent'),
|
||||
defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterField(self.FIELDS,
|
||||
self.tr('Fields to include (leave empty to use all fields)'),
|
||||
parentLayerParameterName=self.INPUT,
|
||||
allowMultiple=True, optional=True))
|
||||
self.addParameter(QgsProcessingParameterString(self.WHERE,
|
||||
self.tr('Select features using a SQL "WHERE" statement (Ex: column=\'value\')'),
|
||||
self.tr(
|
||||
'Select features using a SQL "WHERE" statement (Ex: column=\'value\')'),
|
||||
defaultValue='', optional=True))
|
||||
self.addParameter(QgsProcessingParameterString(self.GT,
|
||||
self.tr('Group N features per transaction (Default: 20000)'),
|
||||
@ -143,13 +156,17 @@ class OgrToPostGis(GdalAlgorithm):
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.APPEND,
|
||||
self.tr('Append to existing table'), defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.ADDFIELDS,
|
||||
self.tr('Append and add new fields to existing table'), defaultValue=False))
|
||||
self.tr('Append and add new fields to existing table'),
|
||||
defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.LAUNDER,
|
||||
self.tr('Do not launder columns/table names'), defaultValue=False))
|
||||
self.tr('Do not launder columns/table names'),
|
||||
defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.INDEX,
|
||||
self.tr('Do not create spatial index'), defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.SKIPFAILURES,
|
||||
self.tr('Continue after a failure, skipping the failed feature'), defaultValue=False))
|
||||
self.tr(
|
||||
'Continue after a failure, skipping the failed feature'),
|
||||
defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.PROMOTETOMULTI,
|
||||
self.tr('Promote to Multipart'),
|
||||
defaultValue=True))
|
||||
@ -157,13 +174,22 @@ class OgrToPostGis(GdalAlgorithm):
|
||||
self.tr('Keep width and precision of input attributes'),
|
||||
defaultValue=True))
|
||||
self.addParameter(QgsProcessingParameterString(self.OPTIONS,
|
||||
self.tr('Additional creation options'), defaultValue='', optional=True))
|
||||
self.tr('Additional creation options'), defaultValue='',
|
||||
optional=True))
|
||||
|
||||
def name(self):
|
||||
return 'importvectorintopostgisdatabasenewconnection'
|
||||
|
||||
def displayName(self):
|
||||
return self.tr('Import vector into PostGIS database (new connection)')
|
||||
return self.tr('Export to PostgreSQL (new connection)')
|
||||
|
||||
def shortDescription(self):
|
||||
return self.tr('Exports a vector layer to a new PostgreSQL database connection')
|
||||
|
||||
def tags(self):
|
||||
t = self.tr('import,into,postgis,database,vector').split(',')
|
||||
t.extend(super().tags())
|
||||
return t
|
||||
|
||||
def group(self):
|
||||
return self.tr('Vector miscellaneous')
|
||||
|
@ -27,7 +27,8 @@ __revision__ = '$Format:%H$'
|
||||
|
||||
import os
|
||||
|
||||
from qgis.core import (QgsProcessingException,
|
||||
from qgis.core import (QgsProcessing,
|
||||
QgsProcessingException,
|
||||
QgsProcessingParameterDefinition,
|
||||
QgsProcessingParameterFeatureSource,
|
||||
QgsProcessingParameterString,
|
||||
@ -37,7 +38,6 @@ from processing.algs.gdal.GdalUtils import GdalUtils
|
||||
|
||||
|
||||
class ogr2ogr(GdalAlgorithm):
|
||||
|
||||
INPUT = 'INPUT'
|
||||
OPTIONS = 'OPTIONS'
|
||||
OUTPUT = 'OUTPUT'
|
||||
@ -47,7 +47,8 @@ class ogr2ogr(GdalAlgorithm):
|
||||
|
||||
def initAlgorithm(self, config=None):
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
|
||||
self.tr('Input layer')))
|
||||
self.tr('Input layer'),
|
||||
types=[QgsProcessing.TypeVector]))
|
||||
|
||||
options_param = QgsProcessingParameterString(self.OPTIONS,
|
||||
self.tr('Additional creation options'),
|
||||
|
@ -25,7 +25,8 @@ __copyright__ = '(C) 2012, Victor Olaya'
|
||||
|
||||
__revision__ = '$Format:%H$'
|
||||
|
||||
from qgis.core import (QgsProcessingParameterFeatureSource,
|
||||
from qgis.core import (QgsProcessing,
|
||||
QgsProcessingParameterFeatureSource,
|
||||
QgsProcessingParameterString,
|
||||
QgsProcessingParameterEnum,
|
||||
QgsProcessingParameterCrs,
|
||||
@ -41,12 +42,12 @@ from processing.tools.system import isWindows
|
||||
|
||||
|
||||
class Ogr2OgrToPostGisList(GdalAlgorithm):
|
||||
|
||||
DATABASE = 'DATABASE'
|
||||
INPUT = 'INPUT'
|
||||
SHAPE_ENCODING = 'SHAPE_ENCODING'
|
||||
GTYPE = 'GTYPE'
|
||||
GEOMTYPE = ['', 'NONE', 'GEOMETRY', 'POINT', 'LINESTRING', 'POLYGON', 'GEOMETRYCOLLECTION', 'MULTIPOINT', 'MULTIPOLYGON', 'MULTILINESTRING']
|
||||
GEOMTYPE = ['', 'NONE', 'GEOMETRY', 'POINT', 'LINESTRING', 'POLYGON', 'GEOMETRYCOLLECTION', 'MULTIPOINT',
|
||||
'MULTIPOLYGON', 'MULTILINESTRING']
|
||||
S_SRS = 'S_SRS'
|
||||
T_SRS = 'T_SRS'
|
||||
A_SRS = 'A_SRS'
|
||||
@ -91,15 +92,18 @@ class Ogr2OgrToPostGisList(GdalAlgorithm):
|
||||
'class': 'processing.gui.wrappers_postgis.ConnectionWidgetWrapper'}})
|
||||
self.addParameter(db_param)
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
|
||||
self.tr('Input layer')))
|
||||
self.tr('Input layer'),
|
||||
types=[QgsProcessing.TypeVector]))
|
||||
self.addParameter(QgsProcessingParameterString(self.SHAPE_ENCODING,
|
||||
self.tr('Shape encoding'), "", optional=True))
|
||||
self.addParameter(QgsProcessingParameterEnum(self.GTYPE,
|
||||
self.tr('Output geometry type'), options=self.GEOMTYPE, defaultValue=0))
|
||||
self.tr('Output geometry type'), options=self.GEOMTYPE,
|
||||
defaultValue=0))
|
||||
self.addParameter(QgsProcessingParameterCrs(self.A_SRS,
|
||||
self.tr('Assign an output CRS'), defaultValue='', optional=False))
|
||||
self.addParameter(QgsProcessingParameterCrs(self.T_SRS,
|
||||
self.tr('Reproject to this CRS on output '), defaultValue='', optional=True))
|
||||
self.tr('Reproject to this CRS on output '), defaultValue='',
|
||||
optional=True))
|
||||
self.addParameter(QgsProcessingParameterCrs(self.S_SRS,
|
||||
self.tr('Override source CRS'), defaultValue='', optional=True))
|
||||
|
||||
@ -122,13 +126,18 @@ class Ogr2OgrToPostGisList(GdalAlgorithm):
|
||||
self.addParameter(table_param)
|
||||
|
||||
self.addParameter(QgsProcessingParameterString(self.PK,
|
||||
self.tr('Primary key (new field)'), defaultValue='id', optional=True))
|
||||
self.tr('Primary key (new field)'), defaultValue='id',
|
||||
optional=True))
|
||||
self.addParameter(QgsProcessingParameterField(self.PRIMARY_KEY,
|
||||
self.tr('Primary key (existing field, used if the above option is left empty)'), parentLayerParameterName=self.INPUT, optional=True))
|
||||
self.tr(
|
||||
'Primary key (existing field, used if the above option is left empty)'),
|
||||
parentLayerParameterName=self.INPUT, optional=True))
|
||||
self.addParameter(QgsProcessingParameterString(self.GEOCOLUMN,
|
||||
self.tr('Geometry column name'), defaultValue='geom', optional=True))
|
||||
self.tr('Geometry column name'), defaultValue='geom',
|
||||
optional=True))
|
||||
self.addParameter(QgsProcessingParameterEnum(self.DIM,
|
||||
self.tr('Vector dimensions'), options=self.DIMLIST, defaultValue=0))
|
||||
self.tr('Vector dimensions'), options=self.DIMLIST,
|
||||
defaultValue=0))
|
||||
self.addParameter(QgsProcessingParameterString(self.SIMPLIFY,
|
||||
self.tr('Distance tolerance for simplification'),
|
||||
defaultValue='', optional=True))
|
||||
@ -136,12 +145,16 @@ class Ogr2OgrToPostGisList(GdalAlgorithm):
|
||||
self.tr('Maximum distance between 2 nodes (densification)'),
|
||||
defaultValue='', optional=True))
|
||||
self.addParameter(QgsProcessingParameterExtent(self.SPAT,
|
||||
self.tr('Select features by extent (defined in input layer CRS)'), optional=True))
|
||||
self.tr(
|
||||
'Select features by extent (defined in input layer CRS)'),
|
||||
optional=True))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.CLIP,
|
||||
self.tr('Clip the input layer using the above (rectangle) extent'),
|
||||
self.tr(
|
||||
'Clip the input layer using the above (rectangle) extent'),
|
||||
defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterString(self.WHERE,
|
||||
self.tr('Select features using a SQL "WHERE" statement (Ex: column=\'value\')'),
|
||||
self.tr(
|
||||
'Select features using a SQL "WHERE" statement (Ex: column=\'value\')'),
|
||||
defaultValue='', optional=True))
|
||||
self.addParameter(QgsProcessingParameterString(self.GT,
|
||||
self.tr('Group N features per transaction (Default: 20000)'),
|
||||
@ -151,13 +164,17 @@ class Ogr2OgrToPostGisList(GdalAlgorithm):
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.APPEND,
|
||||
self.tr('Append to existing table'), defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.ADDFIELDS,
|
||||
self.tr('Append and add new fields to existing table'), defaultValue=False))
|
||||
self.tr('Append and add new fields to existing table'),
|
||||
defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.LAUNDER,
|
||||
self.tr('Do not launder columns/table names'), defaultValue=False))
|
||||
self.tr('Do not launder columns/table names'),
|
||||
defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.INDEX,
|
||||
self.tr('Do not create spatial index'), defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.SKIPFAILURES,
|
||||
self.tr('Continue after a failure, skipping the failed feature'), defaultValue=False))
|
||||
self.tr(
|
||||
'Continue after a failure, skipping the failed feature'),
|
||||
defaultValue=False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.PROMOTETOMULTI,
|
||||
self.tr('Promote to Multipart'),
|
||||
defaultValue=True))
|
||||
@ -165,13 +182,22 @@ class Ogr2OgrToPostGisList(GdalAlgorithm):
|
||||
self.tr('Keep width and precision of input attributes'),
|
||||
defaultValue=True))
|
||||
self.addParameter(QgsProcessingParameterString(self.OPTIONS,
|
||||
self.tr('Additional creation options'), defaultValue='', optional=True))
|
||||
self.tr('Additional creation options'), defaultValue='',
|
||||
optional=True))
|
||||
|
||||
def name(self):
|
||||
return 'importvectorintopostgisdatabaseavailableconnections'
|
||||
|
||||
def displayName(self):
|
||||
return self.tr('Import vector into PostGIS database (available connections)')
|
||||
return self.tr('Export to PostgreSQL (available connections)')
|
||||
|
||||
def shortDescription(self):
|
||||
return self.tr('Exports a vector layer to an existing PostgreSQL database connection')
|
||||
|
||||
def tags(self):
|
||||
t = self.tr('import,into,postgis,database,vector').split(',')
|
||||
t.extend(super().tags())
|
||||
return t
|
||||
|
||||
def group(self):
|
||||
return self.tr('Vector miscellaneous')
|
||||
|
@ -74,7 +74,7 @@ class ogrinfo(GdalAlgorithm):
|
||||
return 'ogrinfo'
|
||||
|
||||
def getConsoleCommands(self, parameters, context, feedback, executing=True):
|
||||
arguments = [self.commandName(), '-al']
|
||||
arguments = ['-al']
|
||||
|
||||
if self.parameterAsBool(parameters, self.SUMMARY_ONLY, context):
|
||||
arguments.append('-so')
|
||||
@ -87,7 +87,7 @@ class ogrinfo(GdalAlgorithm):
|
||||
|
||||
connectionString = GdalUtils.ogrConnectionString(inLayer.source(), context)
|
||||
arguments.append(connectionString)
|
||||
return arguments
|
||||
return [self.commandName(), GdalUtils.escapeAndJoin(arguments)]
|
||||
|
||||
def processAlgorithm(self, parameters, context, feedback):
|
||||
GdalUtils.runGdal(self.getConsoleCommands(parameters, context, feedback), feedback)
|
||||
|
@ -36,6 +36,7 @@ from qgis.core import (QgsApplication,
|
||||
QgsStringStatisticalSummary,
|
||||
QgsDateTimeStatisticalSummary,
|
||||
QgsFeatureRequest,
|
||||
QgsProcessing,
|
||||
QgsProcessingException,
|
||||
QgsProcessingParameterFeatureSource,
|
||||
QgsProcessingParameterField,
|
||||
@ -49,7 +50,6 @@ pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
|
||||
|
||||
|
||||
class BasicStatisticsForField(QgisAlgorithm):
|
||||
|
||||
INPUT_LAYER = 'INPUT_LAYER'
|
||||
FIELD_NAME = 'FIELD_NAME'
|
||||
OUTPUT_HTML_FILE = 'OUTPUT_HTML_FILE'
|
||||
@ -82,8 +82,9 @@ class BasicStatisticsForField(QgisAlgorithm):
|
||||
return QgsApplication.iconPath("/algorithms/mAlgorithmBasicStatistics.svg")
|
||||
|
||||
def tags(self):
|
||||
return self.tr('stats,statistics,date,time,datetime,string,number,text,table,layer,sum,maximum,minimum,mean,average,standard,deviation,'
|
||||
'count,distinct,unique,variance,median,quartile,range,majority,minority,summary').split(',')
|
||||
return self.tr(
|
||||
'stats,statistics,date,time,datetime,string,number,text,table,layer,sum,maximum,minimum,mean,average,standard,deviation,'
|
||||
'count,distinct,unique,variance,median,quartile,range,majority,minority,summary').split(',')
|
||||
|
||||
def group(self):
|
||||
return self.tr('Vector analysis')
|
||||
@ -96,13 +97,15 @@ class BasicStatisticsForField(QgisAlgorithm):
|
||||
|
||||
def initAlgorithm(self, config=None):
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT_LAYER,
|
||||
self.tr('Input layer')))
|
||||
self.tr('Input layer'),
|
||||
types=[QgsProcessing.TypeVector]))
|
||||
|
||||
self.addParameter(QgsProcessingParameterField(self.FIELD_NAME,
|
||||
self.tr('Field to calculate statistics on'),
|
||||
None, self.INPUT_LAYER, QgsProcessingParameterField.Any))
|
||||
|
||||
self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT_HTML_FILE, self.tr('Statistics'), self.tr('HTML files (*.html)'), None, True))
|
||||
self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT_HTML_FILE, self.tr('Statistics'),
|
||||
self.tr('HTML files (*.html)'), None, True))
|
||||
|
||||
self.addOutput(QgsProcessingOutputNumber(self.COUNT, self.tr('Count')))
|
||||
self.addOutput(QgsProcessingOutputNumber(self.UNIQUE, self.tr('Number of unique values')))
|
||||
@ -141,7 +144,8 @@ class BasicStatisticsForField(QgisAlgorithm):
|
||||
|
||||
output_file = self.parameterAsFileOutput(parameters, self.OUTPUT_HTML_FILE, context)
|
||||
|
||||
request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry).setSubsetOfAttributes([field_name], source.fields())
|
||||
request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry).setSubsetOfAttributes([field_name],
|
||||
source.fields())
|
||||
features = source.getFeatures(request, QgsProcessingFeatureSource.FlagSkipGeometryValidityChecks)
|
||||
count = source.featureCount()
|
||||
|
||||
@ -267,8 +271,10 @@ class BasicStatisticsForField(QgisAlgorithm):
|
||||
data.append(self.tr('Count: {}').format(count))
|
||||
data.append(self.tr('Unique values: {}').format(stat.countDistinct()))
|
||||
data.append(self.tr('NULL (missing) values: {}').format(stat.countMissing()))
|
||||
data.append(self.tr('Minimum value: {}').format(field.displayString(stat.statistic(QgsDateTimeStatisticalSummary.Min))))
|
||||
data.append(self.tr('Maximum value: {}').format(field.displayString(stat.statistic(QgsDateTimeStatisticalSummary.Max))))
|
||||
data.append(
|
||||
self.tr('Minimum value: {}').format(field.displayString(stat.statistic(QgsDateTimeStatisticalSummary.Min))))
|
||||
data.append(
|
||||
self.tr('Maximum value: {}').format(field.displayString(stat.statistic(QgsDateTimeStatisticalSummary.Max))))
|
||||
|
||||
return data, results
|
||||
|
||||
|
@ -31,6 +31,7 @@ from qgis.PyQt.QtCore import QVariant
|
||||
from qgis.core import (QgsProcessingException,
|
||||
QgsField,
|
||||
QgsFeatureSink,
|
||||
QgsProcessing,
|
||||
QgsProcessingParameterFeatureSource,
|
||||
QgsProcessingParameterString,
|
||||
QgsProcessingParameterEnum,
|
||||
@ -40,7 +41,6 @@ from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
|
||||
|
||||
|
||||
class FieldsPyculator(QgisAlgorithm):
|
||||
|
||||
INPUT = 'INPUT'
|
||||
FIELD_NAME = 'FIELD_NAME'
|
||||
FIELD_TYPE = 'FIELD_TYPE'
|
||||
@ -67,15 +67,18 @@ class FieldsPyculator(QgisAlgorithm):
|
||||
self.tr('Float'),
|
||||
self.tr('String')]
|
||||
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Input layer')))
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Input layer'),
|
||||
types=[QgsProcessing.TypeVector]))
|
||||
self.addParameter(QgsProcessingParameterString(self.FIELD_NAME,
|
||||
self.tr('Result field name'), defaultValue='NewField'))
|
||||
self.addParameter(QgsProcessingParameterEnum(self.FIELD_TYPE,
|
||||
self.tr('Field type'), options=self.type_names))
|
||||
self.addParameter(QgsProcessingParameterNumber(self.FIELD_LENGTH,
|
||||
self.tr('Field length'), minValue=1, maxValue=255, defaultValue=10))
|
||||
self.tr('Field length'), minValue=1, maxValue=255,
|
||||
defaultValue=10))
|
||||
self.addParameter(QgsProcessingParameterNumber(self.FIELD_PRECISION,
|
||||
self.tr('Field precision'), minValue=0, maxValue=15, defaultValue=3))
|
||||
self.tr('Field precision'), minValue=0, maxValue=15,
|
||||
defaultValue=3))
|
||||
self.addParameter(QgsProcessingParameterString(self.GLOBAL,
|
||||
self.tr('Global expression'), multiLine=True, optional=True))
|
||||
self.addParameter(QgsProcessingParameterString(self.FORMULA,
|
||||
@ -118,7 +121,8 @@ class FieldsPyculator(QgisAlgorithm):
|
||||
exec(bytecode, new_ns)
|
||||
except:
|
||||
raise QgsProcessingException(
|
||||
self.tr("FieldPyculator code execute error.Global code block can't be executed!\n{0}\n{1}").format(str(sys.exc_info()[0].__name__), str(sys.exc_info()[1])))
|
||||
self.tr("FieldPyculator code execute error.Global code block can't be executed!\n{0}\n{1}").format(
|
||||
str(sys.exc_info()[0].__name__), str(sys.exc_info()[1])))
|
||||
|
||||
# Replace all fields tags
|
||||
fields = source.fields()
|
||||
@ -141,7 +145,8 @@ class FieldsPyculator(QgisAlgorithm):
|
||||
bytecode = compile(code, '<string>', 'exec')
|
||||
except:
|
||||
raise QgsProcessingException(
|
||||
self.tr("FieldPyculator code execute error. Field code block can't be executed!\n{0}\n{1}").format(str(sys.exc_info()[0].__name__), str(sys.exc_info()[1])))
|
||||
self.tr("FieldPyculator code execute error. Field code block can't be executed!\n{0}\n{1}").format(
|
||||
str(sys.exc_info()[0].__name__), str(sys.exc_info()[1])))
|
||||
|
||||
# Run
|
||||
features = source.getFeatures()
|
||||
|
@ -32,6 +32,7 @@ from qgis.core import (QgsExpression,
|
||||
QgsFeatureSink,
|
||||
QgsField,
|
||||
QgsDistanceArea,
|
||||
QgsProcessing,
|
||||
QgsProcessingParameterFeatureSource,
|
||||
QgsProcessingParameterEnum,
|
||||
QgsProcessingParameterNumber,
|
||||
@ -71,7 +72,8 @@ class FieldsCalculator(QgisAlgorithm):
|
||||
self.tr('Date')]
|
||||
|
||||
def initAlgorithm(self, config=None):
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Input layer')))
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Input layer'),
|
||||
types=[QgsProcessing.TypeVector]))
|
||||
self.addParameter(QgsProcessingParameterString(self.FIELD_NAME,
|
||||
self.tr('Result field name')))
|
||||
self.addParameter(QgsProcessingParameterEnum(self.FIELD_TYPE,
|
||||
|
@ -28,6 +28,7 @@ __revision__ = '$Format:%H$'
|
||||
from qgis.core import (QgsVectorLayerExporter,
|
||||
QgsSettings,
|
||||
QgsFeatureSink,
|
||||
QgsProcessing,
|
||||
QgsProcessingException,
|
||||
QgsProcessingParameterFeatureSource,
|
||||
QgsProcessingParameterString,
|
||||
@ -40,7 +41,6 @@ from processing.tools import postgis
|
||||
|
||||
|
||||
class ImportIntoPostGIS(QgisAlgorithm):
|
||||
|
||||
DATABASE = 'DATABASE'
|
||||
TABLENAME = 'TABLENAME'
|
||||
SCHEMA = 'SCHEMA'
|
||||
@ -65,7 +65,8 @@ class ImportIntoPostGIS(QgisAlgorithm):
|
||||
|
||||
def initAlgorithm(self, config=None):
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
|
||||
self.tr('Layer to import')))
|
||||
self.tr('Layer to import'),
|
||||
types=[QgsProcessing.TypeVector]))
|
||||
|
||||
db_param = QgsProcessingParameterString(
|
||||
self.DATABASE,
|
||||
@ -94,7 +95,8 @@ class ImportIntoPostGIS(QgisAlgorithm):
|
||||
self.addParameter(table_param)
|
||||
|
||||
self.addParameter(QgsProcessingParameterField(self.PRIMARY_KEY,
|
||||
self.tr('Primary key field'), None, self.INPUT, QgsProcessingParameterField.Any, False, True))
|
||||
self.tr('Primary key field'), None, self.INPUT,
|
||||
QgsProcessingParameterField.Any, False, True))
|
||||
self.addParameter(QgsProcessingParameterString(self.GEOMETRY_COLUMN,
|
||||
self.tr('Geometry column'), 'geom'))
|
||||
self.addParameter(QgsProcessingParameterString(self.ENCODING,
|
||||
@ -109,13 +111,20 @@ class ImportIntoPostGIS(QgisAlgorithm):
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.DROP_STRING_LENGTH,
|
||||
self.tr('Drop length constraints on character fields'), False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.FORCE_SINGLEPART,
|
||||
self.tr('Create single-part geometries instead of multi-part'), False))
|
||||
self.tr('Create single-part geometries instead of multi-part'),
|
||||
False))
|
||||
|
||||
def name(self):
|
||||
return 'importintopostgis'
|
||||
|
||||
def displayName(self):
|
||||
return self.tr('Import into PostGIS')
|
||||
return self.tr('Export to PostgreSQL')
|
||||
|
||||
def shortDescription(self):
|
||||
return self.tr('Exports a vector layer to a PostgreSQL database')
|
||||
|
||||
def tags(self):
|
||||
return self.tr('import,postgis,table,layer,into,copy').split(',')
|
||||
|
||||
def processAlgorithm(self, parameters, context, feedback):
|
||||
connection = self.parameterAsString(parameters, self.DATABASE, context)
|
||||
|
@ -29,6 +29,7 @@ from qgis.core import (QgsDataSourceUri,
|
||||
QgsFeatureSink,
|
||||
QgsProcessingAlgorithm,
|
||||
QgsVectorLayerExporter,
|
||||
QgsProcessing,
|
||||
QgsProcessingException,
|
||||
QgsProcessingParameterFeatureSource,
|
||||
QgsProcessingParameterVectorLayer,
|
||||
@ -42,7 +43,6 @@ from processing.tools import spatialite
|
||||
|
||||
|
||||
class ImportIntoSpatialite(QgisAlgorithm):
|
||||
|
||||
DATABASE = 'DATABASE'
|
||||
TABLENAME = 'TABLENAME'
|
||||
INPUT = 'INPUT'
|
||||
@ -65,17 +65,25 @@ class ImportIntoSpatialite(QgisAlgorithm):
|
||||
super().__init__()
|
||||
|
||||
def initAlgorithm(self, config=None):
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Layer to import')))
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Layer to import'),
|
||||
types=[QgsProcessing.TypeVector]))
|
||||
self.addParameter(QgsProcessingParameterVectorLayer(self.DATABASE, self.tr('File database'), optional=False))
|
||||
self.addParameter(QgsProcessingParameterString(self.TABLENAME, self.tr('Table to import to (leave blank to use layer name)'), optional=True))
|
||||
self.addParameter(QgsProcessingParameterField(self.PRIMARY_KEY, self.tr('Primary key field'), None, self.INPUT, QgsProcessingParameterField.Any, False, True))
|
||||
self.addParameter(
|
||||
QgsProcessingParameterString(self.TABLENAME, self.tr('Table to import to (leave blank to use layer name)'),
|
||||
optional=True))
|
||||
self.addParameter(QgsProcessingParameterField(self.PRIMARY_KEY, self.tr('Primary key field'), None, self.INPUT,
|
||||
QgsProcessingParameterField.Any, False, True))
|
||||
self.addParameter(QgsProcessingParameterString(self.GEOMETRY_COLUMN, self.tr('Geometry column'), 'geom'))
|
||||
self.addParameter(QgsProcessingParameterString(self.ENCODING, self.tr('Encoding'), 'UTF-8', optional=True))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.OVERWRITE, self.tr('Overwrite'), True))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.CREATEINDEX, self.tr('Create spatial index'), True))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.LOWERCASE_NAMES, self.tr('Convert field names to lowercase'), True))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.DROP_STRING_LENGTH, self.tr('Drop length constraints on character fields'), False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.FORCE_SINGLEPART, self.tr('Create single-part geometries instead of multi-part'), False))
|
||||
self.addParameter(
|
||||
QgsProcessingParameterBoolean(self.LOWERCASE_NAMES, self.tr('Convert field names to lowercase'), True))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.DROP_STRING_LENGTH,
|
||||
self.tr('Drop length constraints on character fields'), False))
|
||||
self.addParameter(QgsProcessingParameterBoolean(self.FORCE_SINGLEPART,
|
||||
self.tr('Create single-part geometries instead of multi-part'),
|
||||
False))
|
||||
|
||||
def flags(self):
|
||||
return super().flags() | QgsProcessingAlgorithm.FlagNoThreading
|
||||
@ -84,7 +92,13 @@ class ImportIntoSpatialite(QgisAlgorithm):
|
||||
return 'importintospatialite'
|
||||
|
||||
def displayName(self):
|
||||
return self.tr('Import into Spatialite')
|
||||
return self.tr('Export to SpatiaLite')
|
||||
|
||||
def shortDescription(self):
|
||||
return self.tr('Exports a vector layer to a SpatiaLite database')
|
||||
|
||||
def tags(self):
|
||||
return self.tr('import,table,layer,into,copy').split(',')
|
||||
|
||||
def processAlgorithm(self, parameters, context, feedback):
|
||||
database = self.parameterAsVectorLayer(parameters, self.DATABASE, context)
|
||||
|
@ -65,7 +65,7 @@ class PointsFromLines(QgisAlgorithm):
|
||||
self.tr('Raster layer')))
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT_VECTOR,
|
||||
self.tr('Vector layer'), [QgsProcessing.TypeVectorLine]))
|
||||
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Points from polygons'), QgsProcessing.TypeVectorPoint))
|
||||
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Points along lines'), QgsProcessing.TypeVectorPoint))
|
||||
|
||||
def name(self):
|
||||
return 'generatepointspixelcentroidsalongline'
|
||||
|
@ -64,7 +64,7 @@ class PointsFromPolygons(QgisAlgorithm):
|
||||
self.tr('Raster layer')))
|
||||
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT_VECTOR,
|
||||
self.tr('Vector layer'), [QgsProcessing.TypeVectorPolygon]))
|
||||
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Points from polygons'), QgsProcessing.TypeVectorPoint))
|
||||
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Points inside polygons'), QgsProcessing.TypeVectorPoint))
|
||||
|
||||
def name(self):
|
||||
return 'generatepointspixelcentroidsinsidepolygons'
|
||||
|
@ -89,7 +89,13 @@ class PostGISExecuteAndLoadSQL(QgisAlgorithm):
|
||||
return 'postgisexecuteandloadsql'
|
||||
|
||||
def displayName(self):
|
||||
return self.tr('PostGIS execute and load SQL')
|
||||
return self.tr('PostgreSQL execute and load SQL')
|
||||
|
||||
def shortDescription(self):
|
||||
return self.tr('Executes a SQL command on a PostgreSQL database and loads the result as a table')
|
||||
|
||||
def tags(self):
|
||||
return self.tr('postgis,table,database').split(',')
|
||||
|
||||
def processAlgorithm(self, parameters, context, feedback):
|
||||
connection = self.parameterAsString(parameters, self.DATABASE, context)
|
||||
|
@ -58,7 +58,13 @@ class PostGISExecuteSQL(QgisAlgorithm):
|
||||
return 'postgisexecutesql'
|
||||
|
||||
def displayName(self):
|
||||
return self.tr('PostGIS execute SQL')
|
||||
return self.tr('PostgreSQL execute SQL')
|
||||
|
||||
def shortDescription(self):
|
||||
return self.tr('Executes a SQL command on a PostgreSQL database')
|
||||
|
||||
def tags(self):
|
||||
return self.tr('postgis,database').split(',')
|
||||
|
||||
def processAlgorithm(self, parameters, context, feedback):
|
||||
connection = self.parameterAsString(parameters, self.DATABASE, context)
|
||||
|
@ -41,7 +41,8 @@ from qgis.core import (QgsFields,
|
||||
QgsProcessingParameterEnum,
|
||||
QgsProcessingParameterField,
|
||||
QgsProcessingParameterFeatureSink,
|
||||
QgsProcessingParameterString)
|
||||
QgsProcessingParameterString,
|
||||
QgsProcessingOutputNumber)
|
||||
|
||||
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
|
||||
from processing.tools import vector
|
||||
@ -58,6 +59,8 @@ class SpatialJoin(QgisAlgorithm):
|
||||
DISCARD_NONMATCHING = "DISCARD_NONMATCHING"
|
||||
PREFIX = "PREFIX"
|
||||
OUTPUT = "OUTPUT"
|
||||
NON_MATCHING = "NON_MATCHING"
|
||||
JOINED_COUNT = "JOINED_COUNT"
|
||||
|
||||
def group(self):
|
||||
return self.tr('Vector general')
|
||||
@ -120,7 +123,19 @@ class SpatialJoin(QgisAlgorithm):
|
||||
self.addParameter(QgsProcessingParameterString(self.PREFIX,
|
||||
self.tr('Joined field prefix'), optional=True))
|
||||
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT,
|
||||
self.tr('Joined layer')))
|
||||
self.tr('Joined layer'),
|
||||
QgsProcessing.TypeVectorAnyGeometry,
|
||||
defaultValue=None, optional=True, createByDefault=True))
|
||||
|
||||
non_matching = QgsProcessingParameterFeatureSink(self.NON_MATCHING,
|
||||
self.tr('Unjoinable features from first layer'),
|
||||
QgsProcessing.TypeVectorAnyGeometry,
|
||||
defaultValue=None, optional=True, createByDefault=False)
|
||||
# TODO GUI doesn't support advanced outputs yet
|
||||
# non_matching.setFlags(non_matching.flags() | QgsProcessingParameterDefinition.FlagAdvanced )
|
||||
self.addParameter(non_matching)
|
||||
|
||||
self.addOutput(QgsProcessingOutputNumber(self.JOINED_COUNT, self.tr("Number of joined features from input table")))
|
||||
|
||||
def name(self):
|
||||
return 'joinattributesbylocation'
|
||||
@ -170,9 +185,14 @@ class SpatialJoin(QgisAlgorithm):
|
||||
|
||||
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
|
||||
out_fields, source.wkbType(), source.sourceCrs())
|
||||
if sink is None:
|
||||
if self.OUTPUT in parameters and parameters[self.OUTPUT] is not None and sink is None:
|
||||
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))
|
||||
|
||||
(non_matching_sink, non_matching_dest_id) = self.parameterAsSink(parameters, self.NON_MATCHING, context,
|
||||
source.fields(), source.wkbType(), source.sourceCrs())
|
||||
if self.NON_MATCHING in parameters and parameters[self.NON_MATCHING] is not None and non_matching_sink is None:
|
||||
raise QgsProcessingException(self.invalidSinkError(parameters, self.NON_MATCHING))
|
||||
|
||||
# do the join
|
||||
|
||||
# build a list of 'reversed' predicates, because in this function
|
||||
@ -182,7 +202,7 @@ class SpatialJoin(QgisAlgorithm):
|
||||
self.parameterAsEnums(parameters, self.PREDICATE, context)]
|
||||
|
||||
remaining = set()
|
||||
if not discard_nomatch:
|
||||
if not discard_nomatch or non_matching_sink is not None:
|
||||
remaining = set(source.allFeatureIds())
|
||||
|
||||
added_set = set()
|
||||
@ -191,6 +211,9 @@ class SpatialJoin(QgisAlgorithm):
|
||||
features = join_source.getFeatures(request)
|
||||
total = 100.0 / join_source.featureCount() if join_source.featureCount() else 0
|
||||
|
||||
joined_count = 0
|
||||
unjoined_count = 0
|
||||
|
||||
for current, f in enumerate(features):
|
||||
if feedback.isCanceled():
|
||||
break
|
||||
@ -221,21 +244,33 @@ class SpatialJoin(QgisAlgorithm):
|
||||
if getattr(engine, predicate)(test_feat.geometry().constGet()):
|
||||
added_set.add(test_feat.id())
|
||||
|
||||
# join attributes and add
|
||||
attributes = test_feat.attributes()
|
||||
attributes.extend(join_attributes)
|
||||
output_feature = test_feat
|
||||
output_feature.setAttributes(attributes)
|
||||
sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
|
||||
if sink is not None:
|
||||
# join attributes and add
|
||||
attributes = test_feat.attributes()
|
||||
attributes.extend(join_attributes)
|
||||
output_feature = test_feat
|
||||
output_feature.setAttributes(attributes)
|
||||
sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
|
||||
break
|
||||
|
||||
feedback.setProgress(int(current * total))
|
||||
|
||||
if not discard_nomatch:
|
||||
if not discard_nomatch or non_matching_sink is not None:
|
||||
remaining = remaining.difference(added_set)
|
||||
for f in source.getFeatures(QgsFeatureRequest().setFilterFids(list(remaining))):
|
||||
if feedback.isCanceled():
|
||||
break
|
||||
sink.addFeature(f, QgsFeatureSink.FastInsert)
|
||||
if sink is not None:
|
||||
sink.addFeature(f, QgsFeatureSink.FastInsert)
|
||||
if non_matching_sink is not None:
|
||||
non_matching_sink.addFeature(f, QgsFeatureSink.FastInsert)
|
||||
|
||||
return {self.OUTPUT: dest_id}
|
||||
result = {}
|
||||
if sink is not None:
|
||||
result[self.OUTPUT] = dest_id
|
||||
if non_matching_sink is not None:
|
||||
result[self.NON_MATCHING] = non_matching_dest_id
|
||||
|
||||
result[self.JOINED_COUNT] = len(added_set)
|
||||
|
||||
return result
|
||||
|
@ -60,6 +60,9 @@ class SpatialiteExecuteSQL(QgisAlgorithm):
|
||||
def displayName(self):
|
||||
return self.tr('SpatiaLite execute SQL')
|
||||
|
||||
def shortDescription(self):
|
||||
return self.tr('Executes a SQL command on a SpatiaLite database')
|
||||
|
||||
def flags(self):
|
||||
return super().flags() | QgsProcessingAlgorithm.FlagNoThreading
|
||||
|
||||
|
@ -4,9 +4,9 @@ QgsProcessingParameterRasterLayer|GRID|Grid|None|False
|
||||
QgsProcessingParameterEnum|OUTPUT|Output|[0] Seed Value;[1] Segment ID
|
||||
QgsProcessingParameterEnum|DOWN|Method|[0] Minima;[1] Maxima
|
||||
QgsProcessingParameterEnum|JOIN|Join Segments based on Threshold Value|[0] do not join;[1] seed to saddle difference;[2] seeds difference
|
||||
QgsProcessingParameterNumber|THRESHOLD|Threshold|QgsProcessingParameterNumber.Integer|0|False|None|None
|
||||
QgsProcessingParameterBoolean|EDGE |Allow Edge Pixels to be Seeds|True
|
||||
QgsProcessingParameterBoolean|BBORDERS |Borders|True
|
||||
QgsProcessingParameterNumber|THRESHOLD|Threshold|QgsProcessingParameterNumber.Double|0|False|None|None
|
||||
QgsProcessingParameterBoolean|EDGE|Allow Edge Pixels to be Seeds|True
|
||||
QgsProcessingParameterBoolean|BBORDERS|Borders|True
|
||||
QgsProcessingParameterRasterDestination|SEGMENTS|Segments
|
||||
QgsProcessingParameterVectorDestination|SEEDS|Seed Points
|
||||
QgsProcessingParameterRasterDestination|BORDERS|Borders
|
||||
|
@ -126,14 +126,6 @@ class Processing(object):
|
||||
feedback.reportError(msg)
|
||||
raise QgsProcessingException(msg)
|
||||
|
||||
# check for any mandatory parameters which were not specified
|
||||
for param in alg.parameterDefinitions():
|
||||
if param.name() not in parameters:
|
||||
if not param.flags() & QgsProcessingParameterDefinition.FlagOptional:
|
||||
msg = Processing.tr('Error: Missing parameter value for parameter {0}.').format(param.name())
|
||||
feedback.reportError(msg)
|
||||
raise QgsProcessingException(msg)
|
||||
|
||||
if context is None:
|
||||
context = dataobjects.createContext(feedback)
|
||||
|
||||
|
@ -51,11 +51,9 @@ class ProcessingConfig:
|
||||
VECTOR_POINT_STYLE = 'VECTOR_POINT_STYLE'
|
||||
VECTOR_LINE_STYLE = 'VECTOR_LINE_STYLE'
|
||||
VECTOR_POLYGON_STYLE = 'VECTOR_POLYGON_STYLE'
|
||||
SHOW_RECENT_ALGORITHMS = 'SHOW_RECENT_ALGORITHMS'
|
||||
FILTER_INVALID_GEOMETRIES = 'FILTER_INVALID_GEOMETRIES'
|
||||
USE_FILENAME_AS_LAYER_NAME = 'USE_FILENAME_AS_LAYER_NAME'
|
||||
KEEP_DIALOG_OPEN = 'KEEP_DIALOG_OPEN'
|
||||
SHOW_DEBUG_IN_DIALOG = 'SHOW_DEBUG_IN_DIALOG'
|
||||
PRE_EXECUTION_SCRIPT = 'PRE_EXECUTION_SCRIPT'
|
||||
POST_EXECUTION_SCRIPT = 'POST_EXECUTION_SCRIPT'
|
||||
SHOW_CRS_DEF = 'SHOW_CRS_DEF'
|
||||
@ -63,7 +61,6 @@ class ProcessingConfig:
|
||||
DEFAULT_OUTPUT_RASTER_LAYER_EXT = 'DEFAULT_OUTPUT_RASTER_LAYER_EXT'
|
||||
DEFAULT_OUTPUT_VECTOR_LAYER_EXT = 'DEFAULT_OUTPUT_VECTOR_LAYER_EXT'
|
||||
SHOW_PROVIDERS_TOOLTIP = 'SHOW_PROVIDERS_TOOLTIP'
|
||||
MODELS_SCRIPTS_REPO = 'MODELS_SCRIPTS_REPO'
|
||||
|
||||
settings = {}
|
||||
settingIcons = {}
|
||||
@ -72,10 +69,6 @@ class ProcessingConfig:
|
||||
def initialize():
|
||||
icon = QgsApplication.getThemeIcon("/processingAlgorithm.svg")
|
||||
ProcessingConfig.settingIcons['General'] = icon
|
||||
ProcessingConfig.addSetting(Setting(
|
||||
ProcessingConfig.tr('General'),
|
||||
ProcessingConfig.SHOW_DEBUG_IN_DIALOG,
|
||||
ProcessingConfig.tr('Show extra info in Log panel'), True))
|
||||
ProcessingConfig.addSetting(Setting(
|
||||
ProcessingConfig.tr('General'),
|
||||
ProcessingConfig.KEEP_DIALOG_OPEN,
|
||||
@ -84,10 +77,6 @@ class ProcessingConfig:
|
||||
ProcessingConfig.tr('General'),
|
||||
ProcessingConfig.USE_FILENAME_AS_LAYER_NAME,
|
||||
ProcessingConfig.tr('Use filename as layer name'), False))
|
||||
ProcessingConfig.addSetting(Setting(
|
||||
ProcessingConfig.tr('General'),
|
||||
ProcessingConfig.SHOW_RECENT_ALGORITHMS,
|
||||
ProcessingConfig.tr('Show recently executed algorithms'), True))
|
||||
ProcessingConfig.addSetting(Setting(
|
||||
ProcessingConfig.tr('General'),
|
||||
ProcessingConfig.SHOW_PROVIDERS_TOOLTIP,
|
||||
@ -135,11 +124,6 @@ class ProcessingConfig:
|
||||
ProcessingConfig.POST_EXECUTION_SCRIPT,
|
||||
ProcessingConfig.tr('Post-execution script'), '',
|
||||
valuetype=Setting.FILE))
|
||||
ProcessingConfig.addSetting(Setting(
|
||||
ProcessingConfig.tr('General'),
|
||||
ProcessingConfig.MODELS_SCRIPTS_REPO,
|
||||
ProcessingConfig.tr('Scripts and models repository'),
|
||||
'https://raw.githubusercontent.com/qgis/QGIS-Processing/master'))
|
||||
|
||||
invalidFeaturesOptions = [ProcessingConfig.tr('Do not filter (better performance)'),
|
||||
ProcessingConfig.tr('Ignore features with invalid geometries'),
|
||||
|
@ -221,7 +221,7 @@ class AlgorithmDialog(QgsProcessingAlgorithmDialogBase):
|
||||
task.executed.connect(on_complete)
|
||||
self.setCurrentTask(task)
|
||||
else:
|
||||
self.proxy_progress = QgsProxyProgressTask(self.tr("Executing “{}”").format(self.algorithm().displayName()))
|
||||
self.proxy_progress = QgsProxyProgressTask(QCoreApplication.translate("AlgorithmDialog", "Executing “{}”").format(self.algorithm().displayName()))
|
||||
QgsApplication.taskManager().addTask(self.proxy_progress)
|
||||
feedback.progressChanged.connect(self.proxy_progress.setProxyProgress)
|
||||
self.feedback_dialog = self.createProgressDialog()
|
||||
|
@ -30,7 +30,7 @@ import os
|
||||
import warnings
|
||||
|
||||
from qgis.PyQt import uic
|
||||
from qgis.PyQt.QtCore import QCoreApplication, QDir, pyqtSignal
|
||||
from qgis.PyQt.QtCore import QCoreApplication, QDir, pyqtSignal, QFileInfo
|
||||
from qgis.PyQt.QtWidgets import QDialog, QMenu, QAction, QFileDialog, QInputDialog
|
||||
from qgis.PyQt.QtGui import QCursor
|
||||
from qgis.gui import QgsEncodingSelectionDialog
|
||||
@ -331,6 +331,17 @@ class DestinationSelectionPanel(BASE, WIDGET):
|
||||
if not key and self.parameter.flags() & QgsProcessingParameterDefinition.FlagOptional:
|
||||
return None
|
||||
|
||||
if key and not key.startswith('memory:') \
|
||||
and not key.startswith('ogr:') \
|
||||
and not key.startswith('postgres:') \
|
||||
and not key.startswith('postgis:'):
|
||||
# output should be a file path
|
||||
folder = QFileInfo(key).path()
|
||||
if folder == '.':
|
||||
# output name does not include a folder - use default
|
||||
default_folder = ProcessingConfig.getSetting(ProcessingConfig.OUTPUT_FOLDER)
|
||||
key = QDir(default_folder).filePath(key)
|
||||
|
||||
if isinstance(self.parameter, QgsProcessingParameterFolderDestination):
|
||||
return key
|
||||
|
||||
|
@ -35,6 +35,7 @@ from processing.algs.gdal.gdal2tiles import gdal2tiles
|
||||
from processing.algs.gdal.gdalcalc import gdalcalc
|
||||
from processing.algs.gdal.gdaltindex import gdaltindex
|
||||
from processing.algs.gdal.contour import contour
|
||||
from processing.algs.gdal.gdalinfo import gdalinfo
|
||||
from processing.algs.gdal.GridAverage import GridAverage
|
||||
from processing.algs.gdal.GridDataMetrics import GridDataMetrics
|
||||
from processing.algs.gdal.GridInverseDistance import GridInverseDistance
|
||||
@ -44,6 +45,7 @@ from processing.algs.gdal.GridNearestNeighbor import GridNearestNeighbor
|
||||
from processing.algs.gdal.buildvrt import buildvrt
|
||||
from processing.algs.gdal.hillshade import hillshade
|
||||
from processing.algs.gdal.ogr2ogr import ogr2ogr
|
||||
from processing.algs.gdal.ogrinfo import ogrinfo
|
||||
from processing.algs.gdal.proximity import proximity
|
||||
from processing.algs.gdal.rasterize import rasterize
|
||||
from processing.algs.gdal.retile import retile
|
||||
@ -801,6 +803,68 @@ class TestGdalAlgorithms(unittest.TestCase, AlgorithmsTestBase.AlgorithmsTest):
|
||||
self.assertIn('-input_file_list', commands[1])
|
||||
self.assertIn('d:/temp/test.vrt', commands[1])
|
||||
|
||||
def testGdalInfo(self):
|
||||
context = QgsProcessingContext()
|
||||
feedback = QgsProcessingFeedback()
|
||||
source = os.path.join(testDataPath, 'dem.tif')
|
||||
alg = gdalinfo()
|
||||
alg.initAlgorithm()
|
||||
|
||||
self.assertEqual(
|
||||
alg.getConsoleCommands({'INPUT': source,
|
||||
'MIN_MAX': False,
|
||||
'NOGCP': False,
|
||||
'NO_METADATA': False,
|
||||
'STATS': False}, context, feedback),
|
||||
['gdalinfo',
|
||||
source])
|
||||
|
||||
source = os.path.join(testDataPath, 'raster with spaces.tif')
|
||||
self.assertEqual(
|
||||
alg.getConsoleCommands({'INPUT': source,
|
||||
'MIN_MAX': False,
|
||||
'NOGCP': False,
|
||||
'NO_METADATA': False,
|
||||
'STATS': False}, context, feedback),
|
||||
['gdalinfo',
|
||||
'"' + source + '"'])
|
||||
|
||||
self.assertEqual(
|
||||
alg.getConsoleCommands({'INPUT': source,
|
||||
'MIN_MAX': True,
|
||||
'NOGCP': False,
|
||||
'NO_METADATA': False,
|
||||
'STATS': False}, context, feedback),
|
||||
['gdalinfo',
|
||||
'-mm "' + source + '"'])
|
||||
|
||||
self.assertEqual(
|
||||
alg.getConsoleCommands({'INPUT': source,
|
||||
'MIN_MAX': False,
|
||||
'NOGCP': True,
|
||||
'NO_METADATA': False,
|
||||
'STATS': False}, context, feedback),
|
||||
['gdalinfo',
|
||||
'-nogcp "' + source + '"'])
|
||||
|
||||
self.assertEqual(
|
||||
alg.getConsoleCommands({'INPUT': source,
|
||||
'MIN_MAX': False,
|
||||
'NOGCP': False,
|
||||
'NO_METADATA': True,
|
||||
'STATS': False}, context, feedback),
|
||||
['gdalinfo',
|
||||
'-nomd "' + source + '"'])
|
||||
|
||||
self.assertEqual(
|
||||
alg.getConsoleCommands({'INPUT': source,
|
||||
'MIN_MAX': False,
|
||||
'NOGCP': False,
|
||||
'NO_METADATA': False,
|
||||
'STATS': True}, context, feedback),
|
||||
['gdalinfo',
|
||||
'-stats "' + source + '"'])
|
||||
|
||||
def testGdalTindex(self):
|
||||
context = QgsProcessingContext()
|
||||
feedback = QgsProcessingFeedback()
|
||||
@ -1090,6 +1154,48 @@ class TestGdalAlgorithms(unittest.TestCase, AlgorithmsTestBase.AlgorithmsTest):
|
||||
'-f "LIBKML" "d:/temp/my out/check.kml" ' +
|
||||
source + ' polys2'])
|
||||
|
||||
def testOgrInfo(self):
|
||||
context = QgsProcessingContext()
|
||||
feedback = QgsProcessingFeedback()
|
||||
source = os.path.join(testDataPath, 'polys.gml')
|
||||
alg = ogrinfo()
|
||||
alg.initAlgorithm()
|
||||
|
||||
self.assertEqual(
|
||||
alg.getConsoleCommands({'INPUT': source,
|
||||
'SUMMARY_ONLY': True,
|
||||
'NO_METADATA': False}, context, feedback),
|
||||
['ogrinfo',
|
||||
'-al -so ' +
|
||||
source])
|
||||
|
||||
source = os.path.join(testDataPath, 'filename with spaces.gml')
|
||||
self.assertEqual(
|
||||
alg.getConsoleCommands({'INPUT': source,
|
||||
'SUMMARY_ONLY': True,
|
||||
'NO_METADATA': False}, context, feedback),
|
||||
['ogrinfo',
|
||||
'-al -so "' +
|
||||
source + '"'])
|
||||
|
||||
source = os.path.join(testDataPath, 'filename with spaces.gml')
|
||||
self.assertEqual(
|
||||
alg.getConsoleCommands({'INPUT': source,
|
||||
'SUMMARY_ONLY': False,
|
||||
'NO_METADATA': False}, context, feedback),
|
||||
['ogrinfo',
|
||||
'-al "' +
|
||||
source + '"'])
|
||||
|
||||
source = os.path.join(testDataPath, 'filename with spaces.gml')
|
||||
self.assertEqual(
|
||||
alg.getConsoleCommands({'INPUT': source,
|
||||
'SUMMARY_ONLY': True,
|
||||
'NO_METADATA': True}, context, feedback),
|
||||
['ogrinfo',
|
||||
'-al -so -nomd "' +
|
||||
source + '"'])
|
||||
|
||||
def testHillshade(self):
|
||||
context = QgsProcessingContext()
|
||||
feedback = QgsProcessingFeedback()
|
||||
|
@ -29,6 +29,12 @@ from qgis.testing import start_app, unittest
|
||||
from qgis.core import (QgsApplication,
|
||||
QgsCoordinateReferenceSystem,
|
||||
QgsProcessingParameterMatrix,
|
||||
QgsProcessingOutputLayerDefinition,
|
||||
QgsProcessingParameterFeatureSink,
|
||||
QgsProcessingParameterFileDestination,
|
||||
QgsProcessingParameterFolderDestination,
|
||||
QgsProcessingParameterVectorDestination,
|
||||
QgsProcessingParameterRasterDestination,
|
||||
QgsVectorLayer,
|
||||
QgsProject)
|
||||
from qgis.analysis import QgsNativeAlgorithms
|
||||
@ -37,10 +43,13 @@ from processing.gui.AlgorithmDialog import AlgorithmDialog
|
||||
from processing.gui.BatchAlgorithmDialog import BatchAlgorithmDialog
|
||||
from processing.modeler.ModelerParametersDialog import ModelerParametersDialog
|
||||
from processing.gui.wrappers import *
|
||||
from processing.gui.DestinationSelectionPanel import DestinationSelectionPanel
|
||||
|
||||
start_app()
|
||||
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())
|
||||
|
||||
testDataPath = os.path.join(os.path.dirname(__file__), 'testdata')
|
||||
|
||||
|
||||
class AlgorithmDialogTest(unittest.TestCase):
|
||||
|
||||
@ -52,6 +61,10 @@ class AlgorithmDialogTest(unittest.TestCase):
|
||||
|
||||
class WrappersTest(unittest.TestCase):
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
ProcessingConfig.initialize()
|
||||
|
||||
def checkConstructWrapper(self, param, expected_wrapper_class):
|
||||
alg = QgsApplication.processingRegistry().algorithmById('native:centroids')
|
||||
|
||||
@ -270,6 +283,118 @@ class WrappersTest(unittest.TestCase):
|
||||
def testBand(self):
|
||||
self.checkConstructWrapper(QgsProcessingParameterBand('test'), BandWidgetWrapper)
|
||||
|
||||
def testFeatureSink(self):
|
||||
param = QgsProcessingParameterFeatureSink('test')
|
||||
alg = QgsApplication.processingRegistry().algorithmById('native:centroids')
|
||||
panel = DestinationSelectionPanel(param, alg)
|
||||
|
||||
panel.setValue('memory:')
|
||||
v = panel.getValue()
|
||||
self.assertIsInstance(v, QgsProcessingOutputLayerDefinition)
|
||||
self.assertEqual(v.createOptions, {'fileEncoding': 'System'})
|
||||
self.assertEqual(v.sink.staticValue(), 'memory:')
|
||||
|
||||
panel.setValue('''ogr:dbname='/me/a.gpkg' table="d" (geom) sql=''')
|
||||
v = panel.getValue()
|
||||
self.assertIsInstance(v, QgsProcessingOutputLayerDefinition)
|
||||
self.assertEqual(v.createOptions, {'fileEncoding': 'System'})
|
||||
self.assertEqual(v.sink.staticValue(), '''ogr:dbname='/me/a.gpkg' table="d" (geom) sql=''')
|
||||
|
||||
panel.setValue('''postgis:dbname='oraclesux' host=10.1.1.221 port=5432 user='qgis' password='qgis' table="stufff"."output" (the_geom) sql=''')
|
||||
v = panel.getValue()
|
||||
self.assertIsInstance(v, QgsProcessingOutputLayerDefinition)
|
||||
self.assertEqual(v.createOptions, {'fileEncoding': 'System'})
|
||||
self.assertEqual(v.sink.staticValue(), '''postgis:dbname='oraclesux' host=10.1.1.221 port=5432 user='qgis' password='qgis' table="stufff"."output" (the_geom) sql=''')
|
||||
|
||||
panel.setValue('/home/me/test.shp')
|
||||
v = panel.getValue()
|
||||
self.assertIsInstance(v, QgsProcessingOutputLayerDefinition)
|
||||
self.assertEqual(v.createOptions, {'fileEncoding': 'System'})
|
||||
self.assertEqual(v.sink.staticValue(), '/home/me/test.shp')
|
||||
|
||||
ProcessingConfig.setSettingValue(ProcessingConfig.OUTPUT_FOLDER, testDataPath)
|
||||
panel.setValue('test.shp')
|
||||
v = panel.getValue()
|
||||
self.assertIsInstance(v, QgsProcessingOutputLayerDefinition)
|
||||
self.assertEqual(v.createOptions, {'fileEncoding': 'System'})
|
||||
self.assertEqual(v.sink.staticValue(), os.path.join(testDataPath, 'test.shp'))
|
||||
|
||||
def testVectorDestination(self):
|
||||
param = QgsProcessingParameterVectorDestination('test')
|
||||
alg = QgsApplication.processingRegistry().algorithmById('native:centroids')
|
||||
panel = DestinationSelectionPanel(param, alg)
|
||||
|
||||
panel.setValue('''ogr:dbname='/me/a.gpkg' table="d" (geom) sql=''')
|
||||
v = panel.getValue()
|
||||
self.assertIsInstance(v, QgsProcessingOutputLayerDefinition)
|
||||
self.assertEqual(v.createOptions, {'fileEncoding': 'System'})
|
||||
self.assertEqual(v.sink.staticValue(), '''ogr:dbname='/me/a.gpkg' table="d" (geom) sql=''')
|
||||
|
||||
panel.setValue('''postgis:dbname='oraclesux' host=10.1.1.221 port=5432 user='qgis' password='qgis' table="stufff"."output" (the_geom) sql=''')
|
||||
v = panel.getValue()
|
||||
self.assertIsInstance(v, QgsProcessingOutputLayerDefinition)
|
||||
self.assertEqual(v.createOptions, {'fileEncoding': 'System'})
|
||||
self.assertEqual(v.sink.staticValue(), '''postgis:dbname='oraclesux' host=10.1.1.221 port=5432 user='qgis' password='qgis' table="stufff"."output" (the_geom) sql=''')
|
||||
|
||||
panel.setValue('/home/me/test.shp')
|
||||
v = panel.getValue()
|
||||
self.assertIsInstance(v, QgsProcessingOutputLayerDefinition)
|
||||
self.assertEqual(v.createOptions, {'fileEncoding': 'System'})
|
||||
self.assertEqual(v.sink.staticValue(), '/home/me/test.shp')
|
||||
|
||||
ProcessingConfig.setSettingValue(ProcessingConfig.OUTPUT_FOLDER, testDataPath)
|
||||
panel.setValue('test.shp')
|
||||
v = panel.getValue()
|
||||
self.assertIsInstance(v, QgsProcessingOutputLayerDefinition)
|
||||
self.assertEqual(v.createOptions, {'fileEncoding': 'System'})
|
||||
self.assertEqual(v.sink.staticValue(), os.path.join(testDataPath, 'test.shp'))
|
||||
|
||||
def testRasterDestination(self):
|
||||
param = QgsProcessingParameterRasterDestination('test')
|
||||
alg = QgsApplication.processingRegistry().algorithmById('native:centroids')
|
||||
panel = DestinationSelectionPanel(param, alg)
|
||||
|
||||
panel.setValue('/home/me/test.tif')
|
||||
v = panel.getValue()
|
||||
self.assertIsInstance(v, QgsProcessingOutputLayerDefinition)
|
||||
self.assertEqual(v.createOptions, {'fileEncoding': 'System'})
|
||||
self.assertEqual(v.sink.staticValue(), '/home/me/test.tif')
|
||||
|
||||
ProcessingConfig.setSettingValue(ProcessingConfig.OUTPUT_FOLDER, testDataPath)
|
||||
panel.setValue('test.tif')
|
||||
v = panel.getValue()
|
||||
self.assertIsInstance(v, QgsProcessingOutputLayerDefinition)
|
||||
self.assertEqual(v.createOptions, {'fileEncoding': 'System'})
|
||||
self.assertEqual(v.sink.staticValue(), os.path.join(testDataPath, 'test.tif'))
|
||||
|
||||
def testFolderDestination(self):
|
||||
param = QgsProcessingParameterFolderDestination('test')
|
||||
alg = QgsApplication.processingRegistry().algorithmById('native:centroids')
|
||||
panel = DestinationSelectionPanel(param, alg)
|
||||
|
||||
panel.setValue('/home/me/test.tif')
|
||||
v = panel.getValue()
|
||||
self.assertEqual(v, '/home/me/test.tif')
|
||||
|
||||
ProcessingConfig.setSettingValue(ProcessingConfig.OUTPUT_FOLDER, testDataPath)
|
||||
panel.setValue('test.tif')
|
||||
v = panel.getValue()
|
||||
self.assertEqual(v, os.path.join(testDataPath, 'test.tif'))
|
||||
|
||||
def testFileDestination(self):
|
||||
param = QgsProcessingParameterFileDestination('test')
|
||||
alg = QgsApplication.processingRegistry().algorithmById('native:centroids')
|
||||
panel = DestinationSelectionPanel(param, alg)
|
||||
|
||||
panel.setValue('/home/me/test.tif')
|
||||
v = panel.getValue()
|
||||
self.assertEqual(v, '/home/me/test.tif')
|
||||
|
||||
ProcessingConfig.setSettingValue(ProcessingConfig.OUTPUT_FOLDER, testDataPath)
|
||||
panel.setValue('test.tif')
|
||||
v = panel.getValue()
|
||||
self.assertEqual(v, os.path.join(testDataPath, 'test.tif'))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
70
python/plugins/processing/tests/testdata/expected/join_attribute_table_unjoinable.gml
vendored
Normal file
70
python/plugins/processing/tests/testdata/expected/join_attribute_table_unjoinable.gml
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<ogr:FeatureCollection
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://ogr.maptools.org/ join_attribute_table_unjoinable.xsd"
|
||||
xmlns:ogr="http://ogr.maptools.org/"
|
||||
xmlns:gml="http://www.opengis.net/gml">
|
||||
<gml:boundedBy>
|
||||
<gml:Box>
|
||||
<gml:coord><gml:X>0</gml:X><gml:Y>-5</gml:Y></gml:coord>
|
||||
<gml:coord><gml:X>8</gml:X><gml:Y>3</gml:Y></gml:coord>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
|
||||
<gml:featureMember>
|
||||
<ogr:join_attribute_table_unjoinable fid="points.1">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>3,3</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>2</ogr:id>
|
||||
<ogr:id2>1</ogr:id2>
|
||||
</ogr:join_attribute_table_unjoinable>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:join_attribute_table_unjoinable fid="points.2">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>2,2</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>3</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:join_attribute_table_unjoinable>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:join_attribute_table_unjoinable fid="points.3">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>5,2</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>4</ogr:id>
|
||||
<ogr:id2>2</ogr:id2>
|
||||
</ogr:join_attribute_table_unjoinable>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:join_attribute_table_unjoinable fid="points.4">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>4,1</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>5</ogr:id>
|
||||
<ogr:id2>1</ogr:id2>
|
||||
</ogr:join_attribute_table_unjoinable>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:join_attribute_table_unjoinable fid="points.5">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-5</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>6</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:join_attribute_table_unjoinable>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:join_attribute_table_unjoinable fid="points.6">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>8,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>7</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:join_attribute_table_unjoinable>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:join_attribute_table_unjoinable fid="points.7">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>7,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>8</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:join_attribute_table_unjoinable>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:join_attribute_table_unjoinable fid="points.8">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>9</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:join_attribute_table_unjoinable>
|
||||
</gml:featureMember>
|
||||
</ogr:FeatureCollection>
|
37
python/plugins/processing/tests/testdata/expected/join_attribute_table_unjoinable.xsd
vendored
Normal file
37
python/plugins/processing/tests/testdata/expected/join_attribute_table_unjoinable.xsd
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xs:schema targetNamespace="http://ogr.maptools.org/" xmlns:ogr="http://ogr.maptools.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="1.0">
|
||||
<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"/>
|
||||
<xs:element name="FeatureCollection" type="ogr:FeatureCollectionType" substitutionGroup="gml:_FeatureCollection"/>
|
||||
<xs:complexType name="FeatureCollectionType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="gml:AbstractFeatureCollectionType">
|
||||
<xs:attribute name="lockId" type="xs:string" use="optional"/>
|
||||
<xs:attribute name="scope" type="xs:string" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="join_attribute_table_unjoinable" type="ogr:join_attribute_table_unjoinable_Type" substitutionGroup="gml:_Feature"/>
|
||||
<xs:complexType name="join_attribute_table_unjoinable_Type">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="gml:AbstractFeatureType">
|
||||
<xs:sequence>
|
||||
<xs:element name="geometryProperty" type="gml:PointPropertyType" nillable="true" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="id" nillable="true" minOccurs="0" maxOccurs="1">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:integer">
|
||||
<xs:totalDigits value="10"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="id2" nillable="true" minOccurs="0" maxOccurs="1">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:integer">
|
||||
<xs:totalDigits value="10"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
35
python/plugins/processing/tests/testdata/expected/join_by_location_unjoinable.gml
vendored
Normal file
35
python/plugins/processing/tests/testdata/expected/join_by_location_unjoinable.gml
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<ogr:FeatureCollection
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://ogr.maptools.org/ join_by_location_unjoinable.xsd"
|
||||
xmlns:ogr="http://ogr.maptools.org/"
|
||||
xmlns:gml="http://www.opengis.net/gml">
|
||||
<gml:boundedBy>
|
||||
<gml:Box>
|
||||
<gml:coord><gml:X>0</gml:X><gml:Y>-5</gml:Y></gml:coord>
|
||||
<gml:coord><gml:X>8</gml:X><gml:Y>2</gml:Y></gml:coord>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
|
||||
<gml:featureMember>
|
||||
<ogr:join_by_location_unjoinable fid="points.3">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>5,2</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>4</ogr:id>
|
||||
<ogr:id2>2</ogr:id2>
|
||||
</ogr:join_by_location_unjoinable>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:join_by_location_unjoinable fid="points.5">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-5</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>6</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:join_by_location_unjoinable>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:join_by_location_unjoinable fid="points.6">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>8,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>7</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:join_by_location_unjoinable>
|
||||
</gml:featureMember>
|
||||
</ogr:FeatureCollection>
|
37
python/plugins/processing/tests/testdata/expected/join_by_location_unjoinable.xsd
vendored
Normal file
37
python/plugins/processing/tests/testdata/expected/join_by_location_unjoinable.xsd
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xs:schema targetNamespace="http://ogr.maptools.org/" xmlns:ogr="http://ogr.maptools.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="1.0">
|
||||
<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"/>
|
||||
<xs:element name="FeatureCollection" type="ogr:FeatureCollectionType" substitutionGroup="gml:_FeatureCollection"/>
|
||||
<xs:complexType name="FeatureCollectionType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="gml:AbstractFeatureCollectionType">
|
||||
<xs:attribute name="lockId" type="xs:string" use="optional"/>
|
||||
<xs:attribute name="scope" type="xs:string" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="join_by_location_unjoinable" type="ogr:join_by_location_unjoinable_Type" substitutionGroup="gml:_Feature"/>
|
||||
<xs:complexType name="join_by_location_unjoinable_Type">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="gml:AbstractFeatureType">
|
||||
<xs:sequence>
|
||||
<xs:element name="geometryProperty" type="gml:PointPropertyType" nillable="true" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="id" nillable="true" minOccurs="0" maxOccurs="1">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:long">
|
||||
<xs:totalDigits value="10"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="id2" nillable="true" minOccurs="0" maxOccurs="1">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:long">
|
||||
<xs:totalDigits value="10"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
41
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_borders.mgrd
vendored
Normal file
41
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_borders.mgrd
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<SAGA_METADATA>
|
||||
<HISTORY saga-version="2.3.1">
|
||||
<MODULE library="imagery_segmentation" id="0" name="Watershed Segmentation">
|
||||
<OPTION type="grid_system" id="PARAMETERS_GRID_SYSTEM" name="Grid system">
|
||||
<CELLSIZE>0.0001</CELLSIZE>
|
||||
<XMIN>18.666347944200002</XMIN>
|
||||
<XMAX>18.7035479442</XMAX>
|
||||
<YMIN>45.7767514376</YMIN>
|
||||
<YMAX>45.8116514376</YMAX>
|
||||
</OPTION>
|
||||
<OPTION type="choice" id="OUTPUT" name="Output" index="0">Seed Value</OPTION>
|
||||
<OPTION type="choice" id="DOWN" name="Method" index="0">Minima</OPTION>
|
||||
<OPTION type="choice" id="JOIN" name="Join Segments based on Threshold Value" index="0">do not join</OPTION>
|
||||
<OPTION type="double" id="THRESHOLD" name="Threshold">0.500000</OPTION>
|
||||
<OPTION type="boolean" id="EDGE" name="Allow Edge Pixels to be Seeds">TRUE</OPTION>
|
||||
<OPTION type="boolean" id="BBORDERS" name="Borders">TRUE</OPTION>
|
||||
<INPUT type="grid" id="GRID" name="Grid" system="PARAMETERS_GRID_SYSTEM">
|
||||
<MODULE library="io_gdal" id="0" name="Import Raster">
|
||||
<OPTION type="file" id="FILES" name="Files">"/home/ginetto/PROGRAMMING/QGIS/QGIS-master/python/plugins/processing/tests/testdata/dem.tif"</OPTION>
|
||||
<OPTION type="text" id="SELECTION" name="Select from Multiple Bands"/>
|
||||
<OPTION type="boolean" id="SELECT_SORT" name="Alphanumeric Sorting">TRUE</OPTION>
|
||||
<OPTION type="boolean" id="TRANSFORM" name="Transformation">TRUE</OPTION>
|
||||
<OPTION type="choice" id="RESAMPLING" name="Resampling" index="3">B-Spline Interpolation</OPTION>
|
||||
<OUTPUT type="grid_list" id="GRIDS" name="Grids">dem</OUTPUT>
|
||||
</MODULE>
|
||||
</INPUT>
|
||||
<OUTPUT type="data_object" id="BORDERS" name="Borders"/>
|
||||
</MODULE>
|
||||
</HISTORY>
|
||||
<SOURCE>
|
||||
<FILE>/home/ginetto/PROGRAMMING/QGIS/QGIS-master/python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_borders.sgrd</FILE>
|
||||
<DATABASE></DATABASE>
|
||||
<PROJECTION>
|
||||
<OGC_WKT>GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]</OGC_WKT>
|
||||
<PROJ4>+init=epsg:4326 +proj=longlat +a=6378137.000000 +b=6356752.314245 +no_defs</PROJ4>
|
||||
<EPSG>-1</EPSG>
|
||||
</PROJECTION>
|
||||
</SOURCE>
|
||||
<DESCRIPTION></DESCRIPTION>
|
||||
</SAGA_METADATA>
|
1
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_borders.prj
vendored
Normal file
1
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_borders.prj
vendored
Normal file
@ -0,0 +1 @@
|
||||
GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]
|
BIN
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_borders.sdat
vendored
Normal file
BIN
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_borders.sdat
vendored
Normal file
Binary file not shown.
@ -0,0 +1,3 @@
|
||||
<PAMDataset>
|
||||
<SRS>GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]</SRS>
|
||||
</PAMDataset>
|
15
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_borders.sgrd
vendored
Normal file
15
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_borders.sgrd
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
NAME =
|
||||
DESCRIPTION =
|
||||
UNIT =
|
||||
DATAFORMAT = BYTE_UNSIGNED
|
||||
DATAFILE_OFFSET = 0
|
||||
BYTEORDER_BIG = FALSE
|
||||
TOPTOBOTTOM = FALSE
|
||||
POSITION_XMIN = 18.6662979442
|
||||
POSITION_YMIN = 45.7767014376
|
||||
CELLCOUNT_X = 375
|
||||
CELLCOUNT_Y = 352
|
||||
CELLSIZE = 0.0001000000
|
||||
Z_FACTOR = 1.000000
|
||||
Z_OFFSET = 0.000000
|
||||
NODATA_VALUE = 0.000000
|
BIN
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_seeds.dbf
vendored
Normal file
BIN
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_seeds.dbf
vendored
Normal file
Binary file not shown.
49
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_seeds.mshp
vendored
Normal file
49
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_seeds.mshp
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<SAGA_METADATA>
|
||||
<HISTORY saga-version="2.3.1">
|
||||
<MODULE library="imagery_segmentation" id="0" name="Watershed Segmentation">
|
||||
<OPTION type="grid_system" id="PARAMETERS_GRID_SYSTEM" name="Grid system">
|
||||
<CELLSIZE>0.0001</CELLSIZE>
|
||||
<XMIN>18.666347944200002</XMIN>
|
||||
<XMAX>18.7035479442</XMAX>
|
||||
<YMIN>45.7767514376</YMIN>
|
||||
<YMAX>45.8116514376</YMAX>
|
||||
</OPTION>
|
||||
<OPTION type="choice" id="OUTPUT" name="Output" index="0">Seed Value</OPTION>
|
||||
<OPTION type="choice" id="DOWN" name="Method" index="0">Minima</OPTION>
|
||||
<OPTION type="choice" id="JOIN" name="Join Segments based on Threshold Value" index="0">do not join</OPTION>
|
||||
<OPTION type="double" id="THRESHOLD" name="Threshold">0.500000</OPTION>
|
||||
<OPTION type="boolean" id="EDGE" name="Allow Edge Pixels to be Seeds">TRUE</OPTION>
|
||||
<OPTION type="boolean" id="BBORDERS" name="Borders">TRUE</OPTION>
|
||||
<INPUT type="grid" id="GRID" name="Grid" system="PARAMETERS_GRID_SYSTEM">
|
||||
<MODULE library="io_gdal" id="0" name="Import Raster">
|
||||
<OPTION type="file" id="FILES" name="Files">"/home/ginetto/PROGRAMMING/QGIS/QGIS-master/python/plugins/processing/tests/testdata/dem.tif"</OPTION>
|
||||
<OPTION type="text" id="SELECTION" name="Select from Multiple Bands"/>
|
||||
<OPTION type="boolean" id="SELECT_SORT" name="Alphanumeric Sorting">TRUE</OPTION>
|
||||
<OPTION type="boolean" id="TRANSFORM" name="Transformation">TRUE</OPTION>
|
||||
<OPTION type="choice" id="RESAMPLING" name="Resampling" index="3">B-Spline Interpolation</OPTION>
|
||||
<OUTPUT type="grid_list" id="GRIDS" name="Grids">dem</OUTPUT>
|
||||
</MODULE>
|
||||
</INPUT>
|
||||
<OUTPUT type="shapes" id="SEEDS" name="Seed Points">dem [Seeds]</OUTPUT>
|
||||
</MODULE>
|
||||
</HISTORY>
|
||||
<SOURCE>
|
||||
<FILE></FILE>
|
||||
<DATABASE>
|
||||
<FIELDS>
|
||||
<FIELD TYPE="INTEGER">XCELL</FIELD>
|
||||
<FIELD TYPE="INTEGER">YCELL</FIELD>
|
||||
<FIELD TYPE="DOUBLE">VALUE</FIELD>
|
||||
<FIELD TYPE="INTEGER">ID</FIELD>
|
||||
<FIELD TYPE="INTEGER">ID_JOIN</FIELD>
|
||||
</FIELDS>
|
||||
</DATABASE>
|
||||
<PROJECTION>
|
||||
<OGC_WKT>GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]</OGC_WKT>
|
||||
<PROJ4>+init=epsg:4326 +proj=longlat +a=6378137.000000 +b=6356752.314245 +no_defs</PROJ4>
|
||||
<EPSG>-1</EPSG>
|
||||
</PROJECTION>
|
||||
</SOURCE>
|
||||
<DESCRIPTION></DESCRIPTION>
|
||||
</SAGA_METADATA>
|
1
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_seeds.prj
vendored
Normal file
1
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_seeds.prj
vendored
Normal file
@ -0,0 +1 @@
|
||||
GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]
|
BIN
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_seeds.shp
vendored
Normal file
BIN
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_seeds.shp
vendored
Normal file
Binary file not shown.
BIN
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_seeds.shx
vendored
Normal file
BIN
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_seeds.shx
vendored
Normal file
Binary file not shown.
41
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_segments.mgrd
vendored
Normal file
41
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_segments.mgrd
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<SAGA_METADATA>
|
||||
<HISTORY saga-version="2.3.1">
|
||||
<MODULE library="imagery_segmentation" id="0" name="Watershed Segmentation">
|
||||
<OPTION type="grid_system" id="PARAMETERS_GRID_SYSTEM" name="Grid system">
|
||||
<CELLSIZE>0.0001</CELLSIZE>
|
||||
<XMIN>18.666347944200002</XMIN>
|
||||
<XMAX>18.7035479442</XMAX>
|
||||
<YMIN>45.7767514376</YMIN>
|
||||
<YMAX>45.8116514376</YMAX>
|
||||
</OPTION>
|
||||
<OPTION type="choice" id="OUTPUT" name="Output" index="0">Seed Value</OPTION>
|
||||
<OPTION type="choice" id="DOWN" name="Method" index="0">Minima</OPTION>
|
||||
<OPTION type="choice" id="JOIN" name="Join Segments based on Threshold Value" index="0">do not join</OPTION>
|
||||
<OPTION type="double" id="THRESHOLD" name="Threshold">0.500000</OPTION>
|
||||
<OPTION type="boolean" id="EDGE" name="Allow Edge Pixels to be Seeds">TRUE</OPTION>
|
||||
<OPTION type="boolean" id="BBORDERS" name="Borders">TRUE</OPTION>
|
||||
<INPUT type="grid" id="GRID" name="Grid" system="PARAMETERS_GRID_SYSTEM">
|
||||
<MODULE library="io_gdal" id="0" name="Import Raster">
|
||||
<OPTION type="file" id="FILES" name="Files">"/home/ginetto/PROGRAMMING/QGIS/QGIS-master/python/plugins/processing/tests/testdata/dem.tif"</OPTION>
|
||||
<OPTION type="text" id="SELECTION" name="Select from Multiple Bands"/>
|
||||
<OPTION type="boolean" id="SELECT_SORT" name="Alphanumeric Sorting">TRUE</OPTION>
|
||||
<OPTION type="boolean" id="TRANSFORM" name="Transformation">TRUE</OPTION>
|
||||
<OPTION type="choice" id="RESAMPLING" name="Resampling" index="3">B-Spline Interpolation</OPTION>
|
||||
<OUTPUT type="grid_list" id="GRIDS" name="Grids">dem</OUTPUT>
|
||||
</MODULE>
|
||||
</INPUT>
|
||||
<OUTPUT type="grid" id="SEGMENTS" name="Segments">dem [Segments]</OUTPUT>
|
||||
</MODULE>
|
||||
</HISTORY>
|
||||
<SOURCE>
|
||||
<FILE>/home/ginetto/PROGRAMMING/QGIS/QGIS-master/python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_segments.sgrd</FILE>
|
||||
<DATABASE></DATABASE>
|
||||
<PROJECTION>
|
||||
<OGC_WKT>GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]</OGC_WKT>
|
||||
<PROJ4>+init=epsg:4326 +proj=longlat +a=6378137.000000 +b=6356752.314245 +no_defs</PROJ4>
|
||||
<EPSG>-1</EPSG>
|
||||
</PROJECTION>
|
||||
</SOURCE>
|
||||
<DESCRIPTION></DESCRIPTION>
|
||||
</SAGA_METADATA>
|
1
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_segments.prj
vendored
Normal file
1
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_segments.prj
vendored
Normal file
@ -0,0 +1 @@
|
||||
GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]
|
433
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_segments.sdat
vendored
Normal file
433
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_segments.sdat
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -0,0 +1,3 @@
|
||||
<PAMDataset>
|
||||
<SRS>GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]</SRS>
|
||||
</PAMDataset>
|
15
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_segments.sgrd
vendored
Normal file
15
python/plugins/processing/tests/testdata/expected/saga/watershed_segmentation_segments.sgrd
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
NAME = dem [Segments]
|
||||
DESCRIPTION =
|
||||
UNIT =
|
||||
DATAFORMAT = FLOAT
|
||||
DATAFILE_OFFSET = 0
|
||||
BYTEORDER_BIG = FALSE
|
||||
TOPTOBOTTOM = FALSE
|
||||
POSITION_XMIN = 18.6663479442
|
||||
POSITION_YMIN = 45.7767514376
|
||||
CELLCOUNT_X = 373
|
||||
CELLCOUNT_Y = 350
|
||||
CELLSIZE = 0.0001000000
|
||||
Z_FACTOR = 1.000000
|
||||
Z_OFFSET = 0.000000
|
||||
NODATA_VALUE = -999999.000000
|
77
python/plugins/processing/tests/testdata/filename with spaces.gml
vendored
Normal file
77
python/plugins/processing/tests/testdata/filename with spaces.gml
vendored
Normal file
@ -0,0 +1,77 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<ogr:FeatureCollection
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://ogr.maptools.org/ filename with spaces.xsd"
|
||||
xmlns:ogr="http://ogr.maptools.org/"
|
||||
xmlns:gml="http://www.opengis.net/gml">
|
||||
<gml:boundedBy>
|
||||
<gml:Box>
|
||||
<gml:coord><gml:X>0</gml:X><gml:Y>-5</gml:Y></gml:coord>
|
||||
<gml:coord><gml:X>8</gml:X><gml:Y>3</gml:Y></gml:coord>
|
||||
</gml:Box>
|
||||
</gml:boundedBy>
|
||||
|
||||
<gml:featureMember>
|
||||
<ogr:filename_with_spaces fid="points.0">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>1,1</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>1</ogr:id>
|
||||
<ogr:id2>2</ogr:id2>
|
||||
</ogr:filename_with_spaces>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:filename_with_spaces fid="points.1">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>3,3</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>2</ogr:id>
|
||||
<ogr:id2>1</ogr:id2>
|
||||
</ogr:filename_with_spaces>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:filename_with_spaces fid="points.2">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>2,2</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>3</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:filename_with_spaces>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:filename_with_spaces fid="points.3">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>5,2</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>4</ogr:id>
|
||||
<ogr:id2>2</ogr:id2>
|
||||
</ogr:filename_with_spaces>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:filename_with_spaces fid="points.4">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>4,1</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>5</ogr:id>
|
||||
<ogr:id2>1</ogr:id2>
|
||||
</ogr:filename_with_spaces>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:filename_with_spaces fid="points.5">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-5</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>6</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:filename_with_spaces>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:filename_with_spaces fid="points.6">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>8,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>7</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:filename_with_spaces>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:filename_with_spaces fid="points.7">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>7,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>8</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:filename_with_spaces>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ogr:filename_with_spaces fid="points.8">
|
||||
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
|
||||
<ogr:id>9</ogr:id>
|
||||
<ogr:id2>0</ogr:id2>
|
||||
</ogr:filename_with_spaces>
|
||||
</gml:featureMember>
|
||||
</ogr:FeatureCollection>
|
37
python/plugins/processing/tests/testdata/filename with spaces.xsd
vendored
Normal file
37
python/plugins/processing/tests/testdata/filename with spaces.xsd
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xs:schema targetNamespace="http://ogr.maptools.org/" xmlns:ogr="http://ogr.maptools.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="1.0">
|
||||
<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"/>
|
||||
<xs:element name="FeatureCollection" type="ogr:FeatureCollectionType" substitutionGroup="gml:_FeatureCollection"/>
|
||||
<xs:complexType name="FeatureCollectionType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="gml:AbstractFeatureCollectionType">
|
||||
<xs:attribute name="lockId" type="xs:string" use="optional"/>
|
||||
<xs:attribute name="scope" type="xs:string" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="filename_with_spaces" type="ogr:filename_with_spaces_Type" substitutionGroup="gml:_Feature"/>
|
||||
<xs:complexType name="filename_with_spaces_Type">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="gml:AbstractFeatureType">
|
||||
<xs:sequence>
|
||||
<xs:element name="geometryProperty" type="gml:PointPropertyType" nillable="true" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="id" nillable="true" minOccurs="0" maxOccurs="1">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:integer">
|
||||
<xs:totalDigits value="10"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="id2" nillable="true" minOccurs="0" maxOccurs="1">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:integer">
|
||||
<xs:totalDigits value="10"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
@ -2991,6 +2991,25 @@ tests:
|
||||
name: expected/join_attribute_table_subset.gml
|
||||
type: vector
|
||||
|
||||
- algorithm: native:joinattributestable
|
||||
name: Join attributes table, saving unjoinable features
|
||||
params:
|
||||
DISCARD_NONMATCHING: false
|
||||
FIELD: id
|
||||
FIELD_2: ID
|
||||
INPUT:
|
||||
name: points.gml
|
||||
type: vector
|
||||
INPUT_2:
|
||||
name: table2.dbf
|
||||
type: vector
|
||||
METHOD: 1
|
||||
PREFIX: ''
|
||||
results:
|
||||
NON_MATCHING:
|
||||
name: expected/join_attribute_table_unjoinable.gml
|
||||
type: vector
|
||||
|
||||
- algorithm: native:shortestpathpointtopoint
|
||||
name: Shortest path (point to point, shortest route)
|
||||
params:
|
||||
@ -4719,6 +4738,25 @@ tests:
|
||||
fid: skip
|
||||
fid_2: skip
|
||||
|
||||
- algorithm: qgis:joinattributesbylocation
|
||||
name: Join by location, unjoinable
|
||||
params:
|
||||
DISCARD_NONMATCHING: false
|
||||
INPUT:
|
||||
name: custom/points.shp
|
||||
type: vector
|
||||
JOIN:
|
||||
name: polys.gml
|
||||
type: vector
|
||||
METHOD: 0
|
||||
PREDICATE:
|
||||
- 0
|
||||
PREFIX: ''
|
||||
results:
|
||||
NON_MATCHING:
|
||||
name: expected/join_by_location_unjoinable.gml
|
||||
type: vector
|
||||
|
||||
- algorithm: qgis:joinbylocationsummary
|
||||
name: Join by location (summary), intersects
|
||||
params:
|
||||
|
@ -429,3 +429,26 @@ tests:
|
||||
hash: f4ac677152697773262aa1e5f69146a475139014ace77149966ec045
|
||||
type: rasterhash
|
||||
|
||||
- algorithm: saga:watershedsegmentation
|
||||
name: Test (saga:watershedsegmentation)
|
||||
params:
|
||||
'BBORDERS': true
|
||||
DOWN: 0
|
||||
'EDGE': true
|
||||
GRID:
|
||||
name: dem.tif
|
||||
type: raster
|
||||
JOIN: 0
|
||||
OUTPUT: 0
|
||||
THRESHOLD: 0.5
|
||||
results:
|
||||
BORDERS:
|
||||
hash: d0cd8bdc7c8400bedb2b5c1edc4a64b4c9b7c14692a4f30fbf3c5f2d
|
||||
type: rasterhash
|
||||
SEEDS:
|
||||
name: expected/saga/watershed_segmentation_seeds.shp
|
||||
type: vector
|
||||
SEGMENTS:
|
||||
hash: f2e71e3374eb229d387db8f87bc24d09b86ffc23d9fca85f324b566b
|
||||
type: rasterhash
|
||||
|
@ -196,6 +196,9 @@ class TestCase(_TestCase):
|
||||
diff = list(diff)
|
||||
self.assertEqual(0, len(diff), ''.join(diff))
|
||||
|
||||
def assertGeometriesEqual(self, geom0, geom1, geom0_id='geometry 1', geom1_id='geometry 2', precision=14, topo_equal_check=False):
|
||||
self.checkGeometriesEqual(geom0, geom1, geom0_id, geom1_id, use_asserts=True, precision=precision, topo_equal_check=topo_equal_check)
|
||||
|
||||
def checkGeometriesEqual(self, geom0, geom1, geom0_id, geom1_id, use_asserts=False, precision=14, topo_equal_check=False):
|
||||
""" Checks whether two geometries are the same - using either a strict check of coordinates (up to given precision)
|
||||
or by using topological equality (where e.g. a polygon with clockwise is equal to a polygon with counter-clockwise
|
||||
|
@ -104,7 +104,7 @@ def my_sum(value1, value2, feature, parent):
|
||||
<h2>Example usage:</h2>
|
||||
<ul>
|
||||
<li>my_sum(5, 8) -> 13</li>
|
||||
<li>my_sum(\"fiel1\", \"field2\") -> 42</li>
|
||||
<li>my_sum(\"field1\", \"field2\") -> 42</li>
|
||||
</ul>
|
||||
\"\"\"
|
||||
return value1 + value2
|
||||
|
@ -7,6 +7,6 @@
|
||||
{"arg":"value1", "syntaxOnly": true},
|
||||
{"arg":"value2", "syntaxOnly": true},
|
||||
{"arg":"value", "descOnly": true, "description":"a value"}],
|
||||
"examples": [ { "expression":"array(2,10)", "returns":"array: 2, 10"}
|
||||
"examples": [ { "expression":"array(2,10)", "returns":"[ 2, 10 ]"}
|
||||
]
|
||||
}
|
||||
|
@ -4,5 +4,5 @@
|
||||
"description": "Returns an array with the given value added at the end.",
|
||||
"arguments": [ {"arg":"array","description":"an array"},
|
||||
{"arg":"value","description":"the value to add"}],
|
||||
"examples": [ { "expression":"array_append(array(1,2,3),4)", "returns":"array: 1,2,3,4"}]
|
||||
"examples": [ { "expression":"array_append(array(1,2,3),4)", "returns":"[ 1, 2, 3, 4 ]"}]
|
||||
}
|
||||
|
@ -7,6 +7,6 @@
|
||||
{"arg":"array1", "syntaxOnly": true},
|
||||
{"arg":"array2", "syntaxOnly": true},
|
||||
{"arg":"array", "descOnly": true, "description":"an array"}],
|
||||
"examples": [ { "expression":"array_cat(array(1,2),array(2,3))", "returns":"array: 1,2,2,3"}
|
||||
"examples": [ { "expression":"array_cat(array(1,2),array(2,3))", "returns":"[ 1, 2, 2, 3 ]"}
|
||||
]
|
||||
}
|
||||
|
@ -4,6 +4,6 @@
|
||||
"description": "Returns an array containing distinct values of the given array.",
|
||||
"arguments": [
|
||||
{"arg":"array","description":"an array"}],
|
||||
"examples": [ { "expression":"array_distinct(array(1,2,3,2,1))", "returns":"array: 1,2,3"}
|
||||
"examples": [ { "expression":"array_distinct(array(1,2,3,2,1))", "returns":"[ 1, 2, 3 ]"}
|
||||
]
|
||||
}
|
||||
|
12
resources/function_help/json/array_filter
Normal file
12
resources/function_help/json/array_filter
Normal file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "array_filter",
|
||||
"type": "function",
|
||||
"description": "Returns an array with only the items for which the expression evaluates to true.",
|
||||
"arguments": [
|
||||
{"arg":"array","description":"an array"},
|
||||
{"arg":"expression","description":"an expression to evaluate on each item. The variable `@element` will be replaced by the current value."}
|
||||
],
|
||||
"examples": [
|
||||
{ "expression": "array_filter(array(1,2,3),@element < 3)", "returns":"[ 1, 2 ]"}
|
||||
]
|
||||
}
|
13
resources/function_help/json/array_foreach
Normal file
13
resources/function_help/json/array_foreach
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "array_foreach",
|
||||
"type": "function",
|
||||
"description": "Returns an array with the given expression evaluated on each item.",
|
||||
"arguments": [
|
||||
{"arg":"array","description":"an array"},
|
||||
{"arg":"expression","description":"an expression to evaluate on each item. The variable `@element` will be replaced by the current value."}
|
||||
],
|
||||
"examples": [
|
||||
{ "expression": "array_foreach(array('a','b','c'),upper(@element))", "returns":"[ 'A', 'B', 'C' ]"},
|
||||
{ "expression": "array_foreach(array(1,2,3),@element + 10)", "returns":"[ 11, 12, 13 ]"}
|
||||
]
|
||||
}
|
@ -5,5 +5,5 @@
|
||||
"arguments": [ {"arg":"array","description":"an array"},
|
||||
{"arg":"pos","description":"the position where to add (0 based)"},
|
||||
{"arg":"value","description":"the value to add"}],
|
||||
"examples": [ { "expression":"array_insert(array(1,2,3),1,100)", "returns":"array: 1,100,2,3"}]
|
||||
"examples": [ { "expression":"array_insert(array(1,2,3),1,100)", "returns":"[ 1, 100, 2, 3 ]"}]
|
||||
}
|
||||
|
@ -4,5 +4,5 @@
|
||||
"description": "Returns an array with the given value added at the beginning.",
|
||||
"arguments": [ {"arg":"array","description":"an array"},
|
||||
{"arg":"value","description":"the value to add"}],
|
||||
"examples": [ { "expression":"array_prepend(array(1,2,3),0)", "returns":"array: 0,1,2,3"}]
|
||||
"examples": [ { "expression":"array_prepend(array(1,2,3),0)", "returns":"[ 0, 1, 2, 3 ]"}]
|
||||
}
|
||||
|
@ -4,5 +4,5 @@
|
||||
"description": "Returns an array with all the entries of the given value removed.",
|
||||
"arguments": [ {"arg":"array","description":"an array"},
|
||||
{"arg":"value","description":"the values to remove"}],
|
||||
"examples": [ { "expression":"array_remove_all(array('a','b','c','b'),'b')", "returns":"array: 'a','c'"}]
|
||||
"examples": [ { "expression":"array_remove_all(array('a','b','c','b'),'b')", "returns":"[ 'a', 'c' ]"}]
|
||||
}
|
||||
|
@ -4,5 +4,5 @@
|
||||
"description": "Returns an array with the given index removed.",
|
||||
"arguments": [ {"arg":"array","description":"an array"},
|
||||
{"arg":"pos","description":"the position to remove (0 based)"}],
|
||||
"examples": [ { "expression":"array_remove_at(array(1,2,3),1)", "returns":"array: 1,3"}]
|
||||
"examples": [ { "expression":"array_remove_at(array(1,2,3),1)", "returns":"[ 1, 3 ]"}]
|
||||
}
|
||||
|
@ -3,5 +3,5 @@
|
||||
"type": "function",
|
||||
"description": "Returns the given array with array values in reversed order.",
|
||||
"arguments": [ {"arg":"array","description":"an array"} ],
|
||||
"examples": [ { "expression":"array_reverse(array(2,4,0,10))", "returns":"array: 10,0,4,2"}]
|
||||
"examples": [ { "expression":"array_reverse(array(2,4,0,10))", "returns":"[ 10, 0, 4, 2 ]"}]
|
||||
}
|
||||
|
@ -17,35 +17,35 @@
|
||||
],
|
||||
"examples": [{
|
||||
"expression": "array_slice(array(1,2,3,4,5),0,3)",
|
||||
"returns": "array: 1,2,3,4"
|
||||
"returns": "[ 1, 2, 3, 4 ]"
|
||||
},
|
||||
{
|
||||
"expression": "array_slice(array(1,2,3,4,5),0,-1)",
|
||||
"returns": "array: 1,2,3,4,5"
|
||||
"returns": "[ 1, 2, 3, 4, 5 ]"
|
||||
},
|
||||
{
|
||||
"expression": "array_slice(array(1,2,3,4,5),-5,-1)",
|
||||
"returns": "array: 1,2,3,4,5"
|
||||
"returns": "[ 1, 2, 3, 4, 5 ]"
|
||||
},
|
||||
{
|
||||
"expression": "array_slice(array(1,2,3,4,5),0,0)",
|
||||
"returns": "array: 1"
|
||||
"returns": "[ 1 ]"
|
||||
},
|
||||
{
|
||||
"expression": "array_slice(array(1,2,3,4,5),-2,-1)",
|
||||
"returns": "array: 4,5"
|
||||
"returns": "[ 4, 5 ]"
|
||||
},
|
||||
{
|
||||
"expression": "array_slice(array(1,2,3,4,5),-1,-1)",
|
||||
"returns": "array: 5"
|
||||
"returns": "[ 5 ]"
|
||||
},
|
||||
{
|
||||
"expression": "array_slice(array('Dufour','Valmiera','Chugiak','Brighton'),1,2)",
|
||||
"returns": "array: 'Valmiera','Chugiak'"
|
||||
"returns": "[ 'Valmiera', 'Chugiak' ]"
|
||||
},
|
||||
{
|
||||
"expression": "array_slice(array_slice(array('Dufour','Valmiera','Chugiak','Brighton'),-2,-1)",
|
||||
"returns": "array: 'Chugiak','Brighton'"
|
||||
"returns": "[ 'Chugiak', 'Brighton' ]"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -1,12 +1,13 @@
|
||||
{
|
||||
"name": "array_to_string",
|
||||
"type": "function",
|
||||
"description": "Concatenates array elements into a string separated by a delimiter using and optional string for empty values.",
|
||||
"description": "Concatenates array elements into a string separated by a delimiter and using optional string for empty values.",
|
||||
"arguments": [
|
||||
{"arg":"array", "description":"the input array"},
|
||||
{"arg":"delimiter","optional":true,"default":"','","description":"the string delimiter used to separate concatenated array elements"},
|
||||
{"arg":"empty_value","optional":true,"default":"''","description":"the optional string to use as replacement for empty (zero length) matches"}],
|
||||
"examples": [ { "expression":"array_to_string(array('1','2','3'),',')", "returns":"'1,2,3'"},
|
||||
"examples": [ { "expression":"array_to_string(array('1','2','3'))", "returns":"'1,2,3'"},
|
||||
{ "expression":"array_to_string(array(1,2,3),'-')", "returns":"'1-2-3'"},
|
||||
{ "expression":"array_to_string(array('1','','3'),',','0')", "returns":"'1,0,3'"}
|
||||
]
|
||||
}
|
||||
|
13
resources/function_help/json/generate_series
Normal file
13
resources/function_help/json/generate_series
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "generate_series",
|
||||
"type": "function",
|
||||
"description": "Creates an array containing a sequence of numbers.",
|
||||
"arguments": [
|
||||
{"arg":"start", "description":"first value of the sequence"},
|
||||
{"arg":"stop", "description":"value that ends the sequence once reached"},
|
||||
{"arg":"step","optional":true,"default":"1","description":"value used as the increment between values"}
|
||||
],
|
||||
"examples": [ { "expression":"generate_series(1,5)", "returns":"[ 1, 2, 3, 4, 5 ]"},
|
||||
{ "expression":"generate_series(5,1,-1)", "returns":"[ 5, 4, 3, 2, 1 ]"}
|
||||
]
|
||||
}
|
@ -10,6 +10,6 @@
|
||||
{"arg":"value2", "syntaxOnly": true},
|
||||
{"arg":"key", "descOnly": true, "description":"a key (string)"},
|
||||
{"arg":"value", "descOnly": true, "description":"a value"}],
|
||||
"examples": [ { "expression":"map('1','one','2', 'two')", "returns":"map: 1: 'one', 2: 'two'"}
|
||||
"examples": [ { "expression":"map('1','one','2', 'two')", "returns":"{ '1': 'one', '2': 'two' }"}
|
||||
]
|
||||
}
|
||||
|
@ -3,5 +3,5 @@
|
||||
"type": "function",
|
||||
"description": "Returns all the keys of a map as an array.",
|
||||
"arguments": [ {"arg":"map","description":"a map"}],
|
||||
"examples": [ { "expression":"map_akeys(map('1','one','2','two'))", "returns":"array: '1', '2'"}]
|
||||
"examples": [ { "expression":"map_akeys(map('1','one','2','two'))", "returns":"[ '1', '2' ]"}]
|
||||
}
|
||||
|
@ -3,5 +3,5 @@
|
||||
"type": "function",
|
||||
"description": "Returns all the values of a map as an array.",
|
||||
"arguments": [ {"arg":"map","description":"a map"}],
|
||||
"examples": [ { "expression":"map_avals(map('1','one','2','two'))", "returns":"array: 'one', 'two'"}]
|
||||
"examples": [ { "expression":"map_avals(map('1','one','2','two'))", "returns":"[ 'one', 'two' ]"}]
|
||||
}
|
||||
|
@ -7,6 +7,6 @@
|
||||
{"arg":"map1", "syntaxOnly": true},
|
||||
{"arg":"map2", "syntaxOnly": true},
|
||||
{"arg":"map", "descOnly": true, "description":"a map"}],
|
||||
"examples": [ { "expression":"map_concat(map('1','one', '2','overridden'),map('2','two', '3','three'))", "returns":"map: 1: 'one, 2: 'two', 3: 'three'"}
|
||||
"examples": [ { "expression":"map_concat(map('1','one', '2','overridden'),map('2','two', '3','three'))", "returns":"{ '1': 'one, '2': 'two', '3': 'three' }"}
|
||||
]
|
||||
}
|
||||
|
@ -4,5 +4,5 @@
|
||||
"description": "Returns a map with the given key and its corresponding value deleted.",
|
||||
"arguments": [ {"arg":"map","description":"a map"},
|
||||
{"arg":"key","description":"the key to delete"}],
|
||||
"examples": [ { "expression":"map_delete(map('1','one','2','two'),'2')", "returns":"map: 1: 'one'"}]
|
||||
"examples": [ { "expression":"map_delete(map('1','one','2','two'),'2')", "returns":"{ '1': 'one' }"}]
|
||||
}
|
||||
|
@ -5,5 +5,5 @@
|
||||
"arguments": [ {"arg":"map","description":"a map"},
|
||||
{"arg":"key","description":"the key to add"},
|
||||
{"arg":"value","description":"the value to add"}],
|
||||
"examples": [ { "expression":"map_insert(map('1','one'),'3','three')", "returns":"map: 1: 'one', 3: 'three'"}]
|
||||
"examples": [ { "expression":"map_insert(map('1','one'),'3','three')", "returns":"{ '1': 'one', '3': 'three' }"}]
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "now",
|
||||
"type": "function",
|
||||
"description": "Returns the current date and time.",
|
||||
"description": "Returns the current date and time. The function is static and will return consistent results while evaluating. The time returned is the time when the expression is prepared.",
|
||||
"examples": [ { "expression":"now()", "returns":"2012-07-22T13:24:57"}]
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
{"arg":"string", "description":"the string to capture groups from against the regular expression"},
|
||||
{"arg":"regex","description":"the regular expression used to capture groups"},
|
||||
{"arg":"empty_value","optional":true,"default":"''","description":"the optional string to use as replacement for empty (zero length) matches"}],
|
||||
"examples": [ { "expression":"regexp_matches('QGIS=>rocks','(.*)=>(.*)')", "returns":"array: 'QGIS', 'rocks'"},
|
||||
{ "expression":"regexp_matches('key=>','(.*)=>(.*)','empty value')", "returns":"array: 'key', 'empty value'"}
|
||||
"examples": [ { "expression":"regexp_matches('QGIS=>rocks','(.*)=>(.*)')", "returns":"[ 'QGIS', 'rocks' ]"},
|
||||
{ "expression":"regexp_matches('key=>','(.*)=>(.*)','empty value')", "returns":"[ 'key', 'empty value' ]"}
|
||||
]
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
{"arg":"string", "description":"the input string"},
|
||||
{"arg":"delimiter","optional":true,"default":"','","description":"the string delimiter used to split the input string"},
|
||||
{"arg":"empty_value","optional":true,"default":"''","description":"the optional string to use as replacement for empty (zero length) matches"}],
|
||||
"examples": [ { "expression":"string_to_array('1,2,3',',')", "returns":"array: '1', '2', '3'"},
|
||||
{ "expression":"string_to_array('1,,3',',','0')", "returns":"array: '1', '0', '3'"}
|
||||
"examples": [ { "expression":"string_to_array('1,2,3',',')", "returns":"[ '1', '2', '3' ]"},
|
||||
{ "expression":"string_to_array('1,,3',',','0')", "returns":"[ '1', '0', '3' ]"}
|
||||
]
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
"arguments": [
|
||||
{"arg":"name","description":"the name of the variable to set"},
|
||||
{"arg":"value","description":"the value to set"},
|
||||
{"arg":"node","description":"the expression for which the variable will be available"}
|
||||
{"arg":"expression","description":"the expression for which the variable will be available"}
|
||||
],
|
||||
"examples": [ { "expression":"with_variable('my_sum', 1 + 2 + 3, @my_sum * 2 + @my_sum * 5)", "returns":"42"}]
|
||||
}
|
||||
|
@ -120,6 +120,7 @@ if [ $action = push ]; then
|
||||
echo Download of source translation failed
|
||||
exit 1
|
||||
fi
|
||||
cp i18n/qgis_en.ts /tmp/qgis_en.ts-downloaded
|
||||
elif [ $action = pull ]; then
|
||||
rm i18n/qgis_*.ts
|
||||
|
||||
@ -175,6 +176,7 @@ $LUPDATE -locations absolute -verbose qgis_ts.pro
|
||||
perl -i.bak -ne 'print unless /^\s+<location.*qgs(expression|contexthelp)_texts\.cpp.*$/;' i18n/qgis_*.ts
|
||||
|
||||
if [ $action = push ]; then
|
||||
cp i18n/qgis_en.ts /tmp/qgis_en.ts-uploading
|
||||
echo Pushing translation...
|
||||
fail=1
|
||||
for i in $(seq 10); do
|
||||
|
@ -9,6 +9,7 @@ SET(QGIS_3D_SRCS
|
||||
qgs3dutils.cpp
|
||||
qgscameracontroller.cpp
|
||||
qgscamerapose.cpp
|
||||
qgslayoutitem3dmap.cpp
|
||||
qgsoffscreen3dengine.cpp
|
||||
qgsphongmaterialsettings.cpp
|
||||
qgsraycastingutils_p.cpp
|
||||
@ -53,6 +54,7 @@ SET(QGIS_3D_MOC_HDRS
|
||||
qgs3dmapsettings.h
|
||||
qgsabstract3dengine.h
|
||||
qgscameracontroller.h
|
||||
qgslayoutitem3dmap.h
|
||||
qgsoffscreen3dengine.h
|
||||
qgswindow3dengine.h
|
||||
|
||||
@ -83,6 +85,7 @@ SET(QGIS_3D_HDRS
|
||||
qgs3dutils.h
|
||||
qgscameracontroller.h
|
||||
qgscamerapose.h
|
||||
qgslayoutitem3dmap.h
|
||||
qgsoffscreen3dengine.h
|
||||
qgsphongmaterialsettings.h
|
||||
qgsraycastingutils_p.h
|
||||
@ -131,6 +134,7 @@ INCLUDE_DIRECTORIES(
|
||||
${CMAKE_SOURCE_DIR}/src/core/symbology
|
||||
${CMAKE_SOURCE_DIR}/src/core/metadata
|
||||
${CMAKE_SOURCE_DIR}/src/core/expression
|
||||
${CMAKE_SOURCE_DIR}/src/core/layout
|
||||
${CMAKE_SOURCE_DIR}/src/core/3d
|
||||
${CMAKE_BINARY_DIR}/src/core
|
||||
${CMAKE_BINARY_DIR}/src/3d
|
||||
|
@ -63,6 +63,13 @@ void Qgs3DMapSettings::readXml( const QDomElement &elem, const QgsReadWriteConte
|
||||
elemOrigin.attribute( "y" ).toDouble(),
|
||||
elemOrigin.attribute( "z" ).toDouble() );
|
||||
|
||||
QDomElement elemColor = elem.firstChildElement( "color" );
|
||||
if ( !elemColor.isNull() )
|
||||
{
|
||||
mBackgroundColor = QgsSymbolLayerUtils::decodeColor( elemColor.attribute( "background" ) );
|
||||
mSelectionColor = QgsSymbolLayerUtils::decodeColor( elemColor.attribute( "selection" ) );
|
||||
}
|
||||
|
||||
QDomElement elemCrs = elem.firstChildElement( "crs" );
|
||||
mCrs.readXml( elemCrs );
|
||||
|
||||
@ -147,6 +154,11 @@ QDomElement Qgs3DMapSettings::writeXml( QDomDocument &doc, const QgsReadWriteCon
|
||||
elemOrigin.setAttribute( "z", QString::number( mOrigin.z() ) );
|
||||
elem.appendChild( elemOrigin );
|
||||
|
||||
QDomElement elemColor = doc.createElement( "color" );
|
||||
elemColor.setAttribute( "background", QgsSymbolLayerUtils::encodeColor( mBackgroundColor ) );
|
||||
elemColor.setAttribute( "selection", QgsSymbolLayerUtils::encodeColor( mSelectionColor ) );
|
||||
elem.appendChild( elemColor );
|
||||
|
||||
QDomElement elemCrs = doc.createElement( "crs" );
|
||||
mCrs.writeXml( elemCrs, doc );
|
||||
elem.appendChild( elemCrs );
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user