QGIS User Guide, Release 2.6
This section will show you how to configure the processing framework to include these additional applications,
and it will explain some particular features of the algorithms based on them. Once you have correctly configured
the system,you will be able to execute external algorithms from any component like the toolbox or the graphical
modeler, just like you do with any other geoalgorithm.
By default, all algorithms that rely on an external appplication not shipped with QGIS are not enabled. You can
enable them in the configuration dialog. Make sure that the corresponding application is already installed in your
system. Enabling an algorithm provider without installing the application it needs will cause the algorithms to
appear in the toolbox,but an error will be thrown when you try to execute them.
This is because the algorithm descriptions (needed to create the parameters dialog and provide the information
needed about the algorithm) are not included with each application, but with QGIS instead. That is, they are part
of QGIS, so you have them in your installation even if you have not installed any other software. Running the
algorithm,however,needs the application binaries to be installed in yoursystem.
17.14.1 A note for Windows users
If you are not an advanced user and you are running QGIS on Windows, you might not be interested in reading
the rest of this chapter. Make sure you install QGIS in your system using the standalone installer. That will
automatically install SAGA, GRASS and OTB in your system and configure them so they canbe run fromQGIS.
All the algorithms in the simplified view of the toolbox will be ready to be run without needing any further
configuration. Ifinstalling through OSGeo4Wapplication, make sure you select for insttallation SAGA and OTB
as well.
If you want to know more about how these providers work, or if you want to use some algorithms not included in
the simplified toolbox (such as R scripts),keep on reading.
17.14.2 A note on file formats
When using an external software, opening a file in QGIS does not mean that it can be opened and processed as
well in that other software. In most cases, other software can read what you have opened in QGIS, but in some
cases,thatmightnotbe true. When using databases or uncommon file formats, whetherfor raster or vector layers,
problems might arise. If that happens, try to use well-known file formats that you are sure are understood by both
programs, and check the console output (in the history and log dialog) to know more about what is goingwrong.
Using GRASS raster layers is, for instance, one case inwhich you mighthave trouble andnotbe able to complete
yourworkifyoucallanexternal algorithmusingsucha layer as input. Forthis reason,theselayers willnotappear
as available to algorithms.
You should, however, find no problems at all with vector layers, since QGIS automatically converts from the
original file format to one accepted by the external application before passing the layer to it. This adds extra
processing time, which might be significant if the layer has a large size, so do not be surprised if it takes more
time to process a layer from a DB connection than it does to process one of a similarsize stored in a shapefile.
Providers not using external applications can process any layer that you can open in QGIS, since they open it for
analysis through QGIS.
Regarding output formats, all formats supported by QGIS as output can be used, bothfor raster and vector layers.
Some providers do not support certain formats, but all can export to common raster layer formats that can later
be transformed by QGIS automatically. As in the case of input layers, if this conversion is needed, that might
increase the processing time.
If the extension of the filename specified when calling an algorithm does not match the extension of any of the
formats supported by QGIS, then a suffix will be added to set a default format. In the case of raster layers, the
.tif extension is used,while .shp is used for vectorlayers.
17.14.3 A note on vector layer selections
External applications may also be made aware of the selections that exist in vector layers within QGIS. However,
that requires rewriting all input vector layers, just as if they were originally in a format not supported by the
17.14. Configuring external applications
215
Pdf no thumbnail - Draw thumbnail images for PDF in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Thumbnail Generation with Various Options for Quick PDF Navigation
pdf thumbnails; create pdf thumbnail
Pdf no thumbnail - VB.NET PDF Thumbnail Create SDK: Draw thumbnail images for PDF in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Thumbnail Generation with Various Options for Quick PDF Navigation
create thumbnail from pdf; disable pdf thumbnails
QGIS User Guide, Release 2.6
external application. Only when no selection exists, or the Use only selected features option is not enabled in the
processing general configuration, can a layer be directly passed to an external application.
In other cases, exporting only selected features is needed, which causes execution times to be longer.
SAGA
SAGA algorithms can be run from QGIS if you have SAGA installed in your system and you configure the pro-
cessing framework properly so it can find SAGA executables. In particular, the SAGA command-line executable
is needed to run SAGA algorithms.
If you are running Windows,both the stand-alone installer and the OSGeo4W installer include SAGA along with
QGIS, and the path is automatically configured,so there is no need to do anything else.
If you have installedSAGA yourself (remember,you need version 2.1), the pathto the SAGAexecutable must be
configured. To do this, open the configuration dialog. In the SAGA block, you will find a setting named SAGA
Folder. Enter the path to the folder where SAGA is installed. Close the configuration dialog, and now you are
ready torun SAGAalgorithms from QGIS.
If you are runningLinux, SAGA binaries are not included with SEXTANTE, so you have todownload and install
the software yourself. Please check the SAGA website for more information. SAGA 2.1 is needed.
In this case, there is no need to configure the path to the SAGA executable, and you will not see those folders.
Instead, you must make sure that SAGA is properly installed and its folder is added to the PATH environment
variable. Just open a console and type saga_cmd to checkthat the systemcan findwhere the SAGAbinaries are
located.
17.14.4 About SAGA grid system limitations
MostSAGAalgorithms thatrequire severalinput raster layers require them tohave the same grid system. That is,
they must cover the same geographic area and have the same cell size,so their corresponding grids match. When
callingSAGAalgorithms from QGIS,you can use any layer,regardless of its cell size and extent. When multiple
raster layers are used as input for a SAGA algorithm, QGIS resamples them to a common grid system and then
passes them to SAGA (unless the SAGA algorithmcan operate with layers fromdifferent grid systems).
The definition of that common grid system is controlled by the user, and you will find several parameters in the
SAGA group of the settings window to do so. There are two ways of setting the target grid system:
• Setting it manually. You define the extent by setting the values of the following parameters:
– Resamplingmin X
– Resamplingmax X
– Resamplingmin Y
– Resamplingmax Y
– Resamplingcellsize
Notice that QGIS will resample input layers to that extent,even if they do not overlap with it.
• Setting itautomaticallyfrominput layers. Toselectthis option,just check the Use min coveringgridsystem
for resampling option. All the other settings will be ignored and the minimum extent that covers all the
inputlayers will be used. The cell size ofthe target layeris the maximumofallcellsizes oftheinput layers.
For algorithms that do not use multiple raster layers, or for those that do not need a unique input grid system, no
resampling is performed before calling SAGA,and those parameters are not used.
17.14.5 Limitations for multi-band layers
Unlike QGIS,SAGAhas nosupport formulti-band layers. Ifyou wanttousea multibandlayer(suchas an RGB or
multispectral image), you first have to split it into single-banded images. To do so, you can use the ‘SAGA/Grid
216
Chapter 17. QGIS processing framework
VB.NET Image: Program for Creating Thumbnail from Documents and
as PDF, TIFF, GIF, BMP, etc. It is easy to use this VB.NET thumbnail creation control to create thumbnail through simple VB.NET programming and no additional
generate pdf thumbnails; pdf thumbnail preview
C# Raster - Image Save Options in C#.NET
Tiff Edit. Image Thumbnail. Image Save. Advanced Save Options. Save VB.NET How-to, VB.NET PDF, VB.NET standard ColorProfile to images if there's no ColorProfile in
pdf thumbnail html; pdf files thumbnails
QGIS User Guide, Release 2.6
-Tools/Split RGB image’ algorithm (which creates three images from an RGB image) or the ‘SAGA/Grid -
Tools/Extract band’ algorithm (to extract a single band).
17.14.6 Limitations in cell size
SAGA assumes thatraster layers have the same cell size inthe X and Y axis. If you are workingwith a layer with
different values forhorizontal and vertical cell size,you might get unexpected results. In this case,a warning will
be added to the processing log, indicating that an input layer might not be suitable to be processed by SAGA.
17.14.7 Logging
When QGIScalls SAGA,it does so using its command-line interface, thus passing a set ofcommands to perform
all the required operations. SAGA shows its progress by writing information to the console, which includes the
percentage of processing already done, along with additional content. This output is filtered and used to update
the progress bar while the algorithm is running.
Both the commands sentbyQGISandtheadditionalinformation printedby SAGAcanbe logged along withother
processing log messages, and you might find them useful to track in detail what is going on when QGIS runs a
SAGA algorithm. You will findtwo settings,namely Log console output andLog execution commands, to activate
that logging mechanism.
Most other providers that use an external application and call it through the command-line have similar options,
so you will find themas well inother places in the processing settings list.
R. Creating R scripts
Rintegration inQGISis differentfromthat ofSAGAin thatthere is not apredefinedset ofalgorithms you can run
(except fora few examples). Instead,you shouldwriteyour scripts and call Rcommands,much like youwoulddo
from R, and in a very similar manner to what we saw in the section dedicated to processing scripts. This section
shows you the syntax to use to call those R commands from QGIS and how to use QGIS objects (layers, tables)
in them.
The first thing you have to do, as we saw in the case of SAGA, is to tell QGIS where your R binaries are located.
You can do this usingthe R folder entry in the processingconfiguration dialog. Once you have set that parameter,
you can start creating and executing your own R scripts.
Once again, this is different in Linux, and you just have to make sure that the R folder is included in the PATH
environment variable. If you can start R just typing R in a console, then you are ready to go.
To add a new algorithm that calls an R function (or a more complex R script that you have developed and you
would like to have available from QGIS), you have to create a script file that tells the processing framework how
to perform that operation and the corresponding R commands to do so.
Rscript files have the extension .rsx, and creating them is pretty easy if you just have a basic knowledge of R
syntax and Rscripting. Theyshouldbe storedintheR scripts folder. Youcan setthis folderinthe R settings group
(available fromthe processing settings dialog), just like you do with the folder for regular processing scripts.
Let’s have a look at a very simple scriptfile, which calls the R method spsample to create a randomgrid within
the boundary of the polygons in a given polygon layer. This method belongs to the maptools package. Since
almostall the algorithms that you might like to incorporate into QGISwill useor generate spatialdata, knowledge
ofspatial packages like maptools and,especially,sp, is mandatory.
##polyg=vector
##numpoints=number 10
##output=output vector
##sp=group
pts=spsample(polyg,numpoints,type="random")
output=SpatialPointsDataFrame(pts, as.data.frame(pts))
17.14. Configuring external applications
217
C# Raster - Image Compression in C#.NET
Undefined. The value is 0. It is not support compression. No. The value is 1. It represents no compression. Image Compression In C#.NET.
show pdf thumbnails in; create thumbnail from pdf c#
C# Image: Create Web Image Viewer in C#.NET Application
installed on Windows compatible server, no additional add document file navigation with thumbnail preview support; High fidelity viewing of TIFF, PDF, Word, Excel
how to view pdf thumbnails in; how to create a thumbnail of a pdf document
QGIS User Guide, Release 2.6
The first lines, which start with a double Python comment sign (##), tell QGIS the inputs of the algorithm de-
scribedin the file and the outputs that itwill generate. Theyworkwith exactly the samesyntaxas the SEXTANTE
scripts that we have already seen, so they will not be described here again.
When you declare an input parameter, QGIS uses that information for two things: creating the user interface to
ask the user for the value ofthatparameter and creating a corresponding R variable that can later be used as input
for R commands.
In the above example, we are declaring an input of type vector named polyg. When executing the algorithm,
QGISwill open in R the layer selected by the user andstore it ina variable also namedpolyg. So,the name of a
parameteris also the name ofthe variable that we canuse in R for accesing the value of that parameter (thus, you
should avoid using reserved R words as parameter names).
Spatial elements such as vector and raster layers are read using the readOGR() and brick() commands (you
donot have to worryabout addingthose commands to yourdescriptionfile – QGISwill doit), and they are stored
as Spatial
*
DataFrame objects. Table fields are stored as strings containing the name of the selected field.
Tables are opened using the read.csv() command. If a table entered by the user is not in CSV format, it will
be converted prior to importing it into R.
Additionally, raster files can be read using the readGDAL() command instead of brick() by using the
##usereadgdal.
If you are an advanced user and do not want QGIS to create the object representing the layer, you can use the
##passfilename tag to indicate that you prefer a string with the filename instead. In this case, it is up to you
to open the file before performing any operation on the data it contains.
With the above information, we can now understand the first line of our first example script (the first line not
starting with a Python comment).
pts=spsample(polyg,numpoints,type="random")
The variable polygon alreadycontains a SpatialPolygonsDataFrame object, so it can be used to callthe
spsample method, just like the numpoints one, which indicates the number of points to add to the created
sample grid.
Since we have declared an output of type vector named out, we have to create a variable named out and store a
Spatial
*
DataFrame object in it (in this case,a SpatialPointsDataFrame). Youcan use any name for
your intermediate variables. Just make sure that the variable storing your final result has the same name that you
used to declare it, and that it contains a suitable value.
In this case, the result obtained from the spsample method has to be converted explicitly into a
SpatialPointsDataFrame object, since it is itself an object of class ppp, which is not a suitable class
to be returned to QGIS.
If your algorithm generates raster layers, the way they are saved will depend on whether or not you have used the
#dontuserasterpackage option. In you have used it, layers are saved using the writeGDAL() method.
If not, the writeRaster() method from the raster package will be used.
If you have used the #passfilename option, outputs are generated using the raster package (with
writeRaster()), even though it is not used forthe inputs.
If your algorithm does not generate any layer, but rather a text result in the console instead, you have to indicate
that you want the console to be shown once the execution is finished. To do so, just start the command lines that
produce the results you want to print with the > (‘greater’) sign. The output of all other lines will not be shown.
Forinstance,here is the description file of an algorithmthatperforms a normality test on a given field (column) of
the attributes ofa vector layer:
##layer=vector
##field=field layer
##nortest=group
library(nortest)
>lillie.test(layer[[field]])
The output of the last line is printed, but the output of the first is not (and neither are the outputs from other
command lines added automatically by QGIS).
218
Chapter 17. QGIS processing framework
VB.NET Image: Image and Doc Windows, Web & Mobile Viewers of
for users to do image displaying, thumbnail creation and viewer, image Windows viewer needs no irrelevant application JPEG, PNG, BMP, GIF, TIFF, PDF, Word and
create pdf thumbnails; pdf preview thumbnail
C# TIFF: C#.NET Code to Create Online TIFF Document Viewer
We still demonstrate how to create more web viewers on PDF and Word documents There's no need to add other dependencies to your web project, because they will
how to show pdf thumbnails in; show pdf thumbnail in
QGIS User Guide, Release 2.6
If your algorithm creates any kind of graphics (usingthe plot() method), add the following line:
##showplots
This will cause QGISto redirectallR graphicaloutputs to a temporary file,whichwill be openedonce Rexecution
has finished.
Both graphics and console results will be shown in the processing results manager.
Formoreinformation,please check the scriptfiles providedwith SEXTANTE.Most of themare rathersimple and
will greatly help you understand how to create yourown scripts.
Note: rgdal and maptools libraries are loaded by default, so you do not have to add the corresponding
library() commands (you justhave to make sure that those two packages are installed inyour R distribution).
However, other additional libraries that you might need have to be explicitly loaded. Just add the necessary com-
mands atthe beginning of yourscript. You also have to make sure that the correspondingpackages are installedin
the R distribution used by QGIS.The processing framework will not take care of any package installation. If you
run a script that requires a package that is not installed,the execution will fail,and SEXTANTE will try to detect
which packages are missing. You must install those missing libraries manually before you can run the algorithm.
GRASS
Configuring GRASS is not much different from configuring SAGA. First, the path to the GRASSfolder has to be
defined, but only if you are running Windows. Additionaly, a shell interpreter (usually msys.exe, which can be
found in most GRASSfor Windows distributions)has to be defined and its path set up as well.
By default, the processing framework tries to configure its GRASS connector to use the GRASS distribution that
ships along with QGIS. This should work without problems in most systems, but ifyou experience problems, you
might have to configure the GRASSconnector manually. Also, if you want to use a different GRASSinstallation,
you can change that setting and point to the folder where the other version is installed. GRASS 6.4 is needed for
algorithms to work correctly.
If you are running Linux, you just have to make sure that GRASS is correctly installed, and that it can be run
without problem from a console.
GRASS algorithms use a region for calculations. This region can be defined manually using values similar to
the ones found in the SAGA configuration, or automatically, taking the minimum extent that covers all the input
layers used to execute the algorithm each time. If the latter approach is the behaviour you prefer, just check the
Use min covering region option in the GRASSconfiguration parameters.
The last parameter that has to be configured is related to the mapset. A mapset is needed to run GRASS, and the
processing framework creates a temporary one for each execution. You haveto specify ifthe datayouare working
with uses geographical (lat/lon) coordinates or projected ones.
GDAL
No additional configuration is needed to run GDAL algorithms. Since they are already incorporated into QGIS,
the algorithms can infer their configuration from it.
Orfeo Toolbox
Orfeo Toolbox (OTB) algorithms can be run from QGIS if you have OTB installed in your system and you have
configured QGISproperly,so it can find all necessary files (command-line tools and libraries).
As in the case of SAGA, OTB binaries are included in the stand-alone installer for Windows, but they are not
included if you are runing Linux, so you have to download and install the software yourself. Please check the
OTB website for more information.
17.14. Configuring external applications
219
VB.NET Image: RasterEdge JBIG2 Codec Image Control for VB.NET
Even when you are using lossy image compression solution, no significant information will lose. "Do you have any add-on i can use to print PDF files with JBIG2
pdf thumbnail; pdf thumbnails in
C# Image: Create C#.NET Windows Document Image Viewer | Online
C# Windows Document Image Viewer Features. No need for and viewing multiple document & image formats (PDF, MS Word If you right-click on the thumbnail, there is
pdf thumbnail viewer; thumbnail view in for pdf files
QGIS User Guide, Release 2.6
Once OTB is installed, start QGIS, open the processing configuration dialog and configure the OTB algorithm
provider. In the Orfeo Toolbox (image analysis) block, you will find all settings related to OTB. First, ensure that
algorithms are enabled.
Then, configure the path to the folderwhere OTB command-line tools and libraries are installed:
Usually OTB applications folder points to /usr/lib/otb/applications andOTB command line
tools folder is /usr/bin.
If you use the OSGeo4W
installer, then install otb-bin
package and enter
C:\OSGeo4W\apps\orfeotoolbox\applications
as OTB
applications folder
and
C:\OSGeo4W\bin as OTB command line tools folder. These values should be configured by de-
fault, but if you have a different OTB installation, configure them to the corresponding values in your
system.
TauDEM
To use this provider,you need to install TauDEM command line tools.
17.14.8 Windows
Please visit theTauDEMhomepagefor installation instructions and precompiled binaries for 32-bit and 64-bit
systems. IMPORTANT: You need TauDEM 5.0.6 executables. Version 5.2 is currently not supported.
17.14.9 Linux
There are no packages for most Linux distributions, so you should compile TauDEM by yourself. As TauDEM
uses MPICH2, first install it using your favorite package manager. Alternatively, TauDEM works fine with Open
MPI,so you can use it instead ofMPICH2.
Download TauDEM 5.0.6sourcecode and extract the files insome folder.
Open the linearpart.h file,and afterline
#include "mpi.h"
add a new line with
#include <stdint.h>
so you’ll get
#include "mpi.h"
#include <stdint.h>
Save the changes and close the file. Now open tiffIO.h, find line #include "stdint.h" and replace
quotes ("") with <>, so you’ll get
#include <stdint.h>
Save the changes and close the file. Create a build directory and cd into it
mkdir build
cd build
Configure your buildwith the command
CXX=mpicxx cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
and then compile
220
Chapter 17. QGIS processing framework
C# Image: Tutorial for Document Viewing & Displaying in ASP.NET
in the viewer with a click on a thumbnail. Add No-Postback Navigation Controls to Viewer. Add two powerful & profession imaging controls, PDF document, tiff
can't see pdf thumbnails; pdf thumbnail creator
VB.NET Image: VB.NET DLL for Image Basic Transforming in .NET
NET imaging toolkit is extremely easy to use with no special configuration are dedicated to provide powerful & profession imaging controls, PDF document, tiff
generate thumbnail from pdf; generate pdf thumbnail c#
QGIS User Guide, Release 2.6
make
Finally,to install TauDEM into /usr/local/bin, run
sudo make install
.
17.15 The QGIS Commander
Processing includes a practical tool that allows you to run algorithms without having to use the toolbox, but just
by typing the name of the algorithmyou want to run.
This tool is known as the QGIS commander, and it is just a simple text box with autocompletion where you type
the command you want to run.
Figure 17.29: The QGIS Commander
The Commander is started from the Analysis menu or,more practically, by pressing Shift + Ctrl + M (you
can change that default keyboard shortcut in the QGIS configuration if you prefer a different one). Apart from
executing Processing algorithms, the Commander gives you access to most of the functionality in QGIS, which
means that it gives you a practical and efficient way of running QGIS tasks and allows you to control QGIS with
reduced usage ofbuttons and menus.
Moreover, the Commander is configurable, so you can add your custom commands and have them just a few
keystrokes away,making it a powerful tool to help you become more productive in yourdaily work with QGIS.
17.15.1 Available commands
The commands available in the Commander fall in the followingcategories:
• Processing algorithms.
These are shown as Processing algorithm:
<name of the
algorithm>.
• Menu items. These are shown as Menu item:
<menu entry text>. All menus items available
fromthe QGISinterface are available,even if they are included in a submenu.
• Python functions. You can create short Python functions that will be then included in the list of available
commands. They are shown as Function:
<function name>.
To run any of the above, just start typing and then select the corresponding element from the list of available
commands that appears after filtering the whole list ofcommands with the text you have entered.
In the case of calling a Python function, you can select the entry in the list, which is pre-
fixed by Function: (for instance, Function:
removeall), or just directly type the
function name (‘‘removeall in the previous example). There is no need to add brackets after the func-
tion name.
17.15. The QGIS Commander
221
QGIS User Guide, Release 2.6
17.15.2 Creating custom functions
Custom functions are added by entering the corresponding Python code in the commands.py file that is found
in the .qgis/sextante/commander directory in your user folder. It is just a simple Python file where
you can add the functions that you need.
The file is created with a few example functions the first time you open the Commander. If you haven’t launched
the Commander yet,you cancreate the file yourself. To edit the commands file, use your favorite text editor. You
can also use a built-in editor by calling the edit command fromthe Commander. It will open the editor withthe
commands file,and you can edit it directly and then save your changes.
For instance, you can add the following function,which removes all layers:
from qgis.gui import
*
def removeall():
mapreg = QgsMapLayerRegistry.instance()
mapreg.removeAllMapLayers()
Once you have added the function, it will be available in the Commander, and you can invoke it by typing
removeall. There is no need to do anything apart from writing the function itself.
Functions can receive parameters. Add
*
args to yourfunction definition to receive arguments. When callingthe
function from the Commander, parameters have to be passed separated by spaces.
Here is an example of a functionthat loads a layer and takes a parameter with the filename of the layer to load.
import processing
def load(
*
args):
processing.load(args[0])
If youwant toload the layerin/home/myuser/points.shp,type load /home/myuser/points.shp
in the Commander text box.
.
222
Chapter 17. QGIS processing framework
CHAPTER
18
Processing providers and algorithms
.
18.1 GDAL algorithm provider
GDAL(GeospatialDataAbstractionLibrary)isatranslatorlibraryforrasterandvectorgeospatialdataformats.
.
18.1.1 GDAL analysis
Aspect
Description
<put algortithmdescription here>
Parameters
Input layer [raster] <put parameter description here>
Band number [number] <put parameter description here>
Default: 1
Compute edges [boolean] <put parameter description here>
Default: False
Use Zevenbergen&Thorne formula (instead of the Horn’s one) [boolean] <put parame-
ter description here>
Default: False
Return trigonometric angle (instead of azimuth) [boolean] <put parameter description
here>
Default: False
Return o for flat (instead of -9999) [boolean] <put parameter description here>
Default: False
223
QGIS User Guide, Release 2.6
Outputs
Output file [raster] <put output description here>
Consoleusage
processing.runalg(’gdalogr:aspect’input, band, compute_edges, zevenbergen, trig_angle, zero_flat, output)
See also
Color relief
Description
<put algortithmdescription here>
Parameters
Input layer [raster] <put parameter description here>
Band number [number] <put parameter description here>
Default: 1
Compute edges [boolean] <put parameter description here>
Default: False
Color configuration file [file] <put parameterdescription here>
Matching mode [selection] <put parameterdescription here>
Options:
• 0 — “0,0,0,0” RGBA
• 1 — Exact color
• 2 — Nearest color
Default: 0
Outputs
Output file [raster] <put output description here>
Consoleusage
processing.runalg(’gdalogr:colorrelief’input, band, compute_edges, color_table, match_mode, output)
See also
Fill nodata
Description
<put algortithmdescription here>
224
Chapter 18. Processing providers and algorithms
Documents you may be interested
Documents you may be interested