[pktools] 01/07: Imported Upstream version 2.6.6

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Fri Jan 22 12:08:17 UTC 2016


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository pktools.

commit a9e3ebd71347b53499104cdf19e1728c26768923
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Fri Jan 22 11:48:20 2016 +0100

    Imported Upstream version 2.6.6
---
 ChangeLog                                          |   26 +-
 configure                                          |   22 +-
 configure.ac                                       |    4 +-
 doc/Doxyfile                                       |    4 +-
 doc/apps.dox                                       |    2 +
 doc/{apps.dox => apps.dox~}                        |    3 +
 doc/examples_pkkalman.dox                          |   31 +
 doc/examples_pkkalman.dox~                         |   14 +
 doc/{ => figures}/logo.odg                         |  Bin
 doc/{ => figures}/logo.png                         |  Bin
 doc/html/ConfusionMatrix_8cc_source.html           |    4 +-
 doc/html/ConfusionMatrix_8h_source.html            |    4 +-
 doc/html/CostFactorySVM_8cc_source.html            |    4 +-
 doc/html/CostFactorySVM_8h_source.html             |    4 +-
 doc/html/CostFactory_8h_source.html                |    4 +-
 doc/html/Egcs_8cc_source.html                      |    4 +-
 doc/html/Egcs_8h_source.html                       |    4 +-
 doc/html/FeatureSelector_8h_source.html            |    6 +-
 doc/html/FileReaderAscii_8cc_source.html           |    4 +-
 doc/html/FileReaderAscii_8h_source.html            |    4 +-
 doc/html/FileReaderLas_8cc_source.html             |    4 +-
 doc/html/FileReaderLas_8h_source.html              |    4 +-
 doc/html/Filter2d_8cc_source.html                  | 1701 +++++-----
 doc/html/Filter2d_8h_source.html                   | 2460 +++++++--------
 doc/html/Filter_8cc_source.html                    | 1391 ++++----
 doc/html/Filter_8h_source.html                     | 1540 ++++-----
 doc/html/Filter__old_8h_source.html                |    8 +-
 ...fsann_8h_source.html => ImgGdal_8h_source.html} |   78 +-
 doc/html/ImgRasterGdal_8cc_source.html             |  414 +++
 doc/html/ImgRasterGdal_8h_source.html              |  175 ++
 doc/html/ImgReaderGdal_8cc_source.html             | 1054 +++----
 doc/html/ImgReaderGdal_8h_source.html              |  528 ++--
 doc/html/ImgReaderOgr_8cc_source.html              |  736 ++---
 doc/html/ImgReaderOgr_8h_source.html               | 1761 +++++------
 doc/html/ImgRegression_8cc_source.html             |    6 +-
 doc/html/ImgRegression_8h_source.html              |    6 +-
 ..._source.html => ImgUpdaterGdal_8cc_source.html} |   53 +-
 ...h_source.html => ImgUpdaterGdal_8h_source.html} |   67 +-
 doc/html/ImgWriterGdal_8cc_source.html             |  733 ++---
 doc/html/ImgWriterGdal_8h_source.html              |  390 ++-
 doc/html/ImgWriterOgr_8cc_source.html              | 1128 +++----
 doc/html/ImgWriterOgr_8h_source.html               |   49 +-
 doc/html/IndexValue_8h_source.html                 |    4 +-
 doc/html/OptFactory_8h_source.html                 |    4 +-
 doc/html/Optionpk_8h_source.html                   |    4 +-
 doc/html/PosValue_8h_source.html                   |    4 +-
 doc/html/ProcessingPktoolsPlugin_8py_source.html   |    4 +-
 doc/html/StatFactory_8h_source.html                | 2877 +++++++++--------
 ..._pkdsm2shadow.html => Vector2d_8cc_source.html} |   27 +-
 doc/html/Vector2d_8h_source.html                   |    4 +-
 doc/html/____init_____8py_source.html              |    4 +-
 doc/html/annotated.html                            |   58 +-
 ...gui-gcc-Debug_2moc__mainwindow_8cpp_source.html |    4 +-
 ...e__gui-gcc-Debug_2ui__mainwindow_8h_source.html |    4 +-
 ...i-gcc-Release_2moc__mainwindow_8cpp_source.html |    4 +-
 ..._gui-gcc-Release_2ui__mainwindow_8h_source.html |    4 +-
 ...gui-gcc-Debug_2moc__mainwindow_8cpp_source.html |    4 +-
 ...p__gui-gcc-Debug_2ui__mainwindow_8h_source.html |    4 +-
 ...i-gcc-Release_2moc__mainwindow_8cpp_source.html |    4 +-
 ..._gui-gcc-Release_2ui__mainwindow_8h_source.html |    4 +-
 ...gui-gcc-Debug_2moc__mainwindow_8cpp_source.html |    4 +-
 ...f__gui-gcc-Debug_2ui__mainwindow_8h_source.html |    4 +-
 ...i-gcc-Release_2moc__mainwindow_8cpp_source.html |    4 +-
 ..._gui-gcc-Release_2ui__mainwindow_8h_source.html |    4 +-
 ...gui-gcc-Debug_2moc__mainwindow_8cpp_source.html |    4 +-
 ...t__gui-gcc-Debug_2ui__mainwindow_8h_source.html |    4 +-
 ...i-gcc-Release_2moc__mainwindow_8cpp_source.html |    4 +-
 ..._gui-gcc-Release_2ui__mainwindow_8h_source.html |    4 +-
 ...gui-gcc-Debug_2moc__mainwindow_8cpp_source.html |    4 +-
 ...m__gui-gcc-Debug_2ui__mainwindow_8h_source.html |    4 +-
 ...i-gcc-Release_2moc__mainwindow_8cpp_source.html |    4 +-
 ..._gui-gcc-Release_2ui__mainwindow_8h_source.html |    4 +-
 doc/html/classBadConversion-members.html           |    4 +-
 doc/html/classBadConversion.html                   |    4 +-
 doc/html/classCache-members.html                   |    4 +-
 doc/html/classCache.html                           |    4 +-
 doc/html/classCompare__IndexValue-members.html     |    4 +-
 doc/html/classCompare__IndexValue.html             |    4 +-
 doc/html/classCompare__PosValue-members.html       |    4 +-
 doc/html/classCompare__PosValue.html               |    4 +-
 doc/html/classCostFactory-members.html             |    4 +-
 doc/html/classCostFactory.html                     |    4 +-
 doc/html/classCostFactoryANN-members.html          |    4 +-
 doc/html/classCostFactoryANN.html                  |    4 +-
 doc/html/classCostFactorySVM-members.html          |    4 +-
 doc/html/classCostFactorySVM.html                  |    4 +-
 doc/html/classDataModel-members.html               |    4 +-
 doc/html/classDataModel.html                       |    4 +-
 doc/html/classDecrease__IndexValue-members.html    |    4 +-
 doc/html/classDecrease__IndexValue.html            |    4 +-
 doc/html/classDecrease__PosValue-members.html      |    4 +-
 doc/html/classDecrease__PosValue.html              |    4 +-
 doc/html/classEgcs-members.html                    |    4 +-
 doc/html/classEgcs.html                            |    4 +-
 doc/html/classFANN_1_1neural__net-members.html     |    4 +-
 doc/html/classFANN_1_1neural__net.html             |    4 +-
 doc/html/classFANN_1_1training__data-members.html  |    4 +-
 doc/html/classFANN_1_1training__data.html          |    4 +-
 doc/html/classFeatureSelector-members.html         |    4 +-
 doc/html/classFeatureSelector.html                 |    4 +-
 doc/html/classFileReaderAscii-members.html         |    4 +-
 doc/html/classFileReaderAscii.html                 |    4 +-
 doc/html/classFileReaderLas-members.html           |    4 +-
 doc/html/classFileReaderLas.html                   |    4 +-
 doc/html/classImgRasterGdal-members.html           |  126 +
 doc/html/classImgRasterGdal.html                   |  257 ++
 ...aph.map => classImgRasterGdal__coll__graph.map} |    2 +-
 doc/html/classImgRasterGdal__coll__graph.md5       |    1 +
 doc/html/classImgRasterGdal__coll__graph.png       |  Bin 0 -> 9624 bytes
 doc/html/classImgRasterGdal__inherit__graph.map    |    5 +
 doc/html/classImgRasterGdal__inherit__graph.md5    |    1 +
 doc/html/classImgRasterGdal__inherit__graph.png    |  Bin 0 -> 12506 bytes
 doc/html/classImgReaderGdal-members.html           |  134 +-
 doc/html/classImgReaderGdal.html                   |  299 +-
 doc/html/classImgReaderGdal__coll__graph.map       |    5 +-
 doc/html/classImgReaderGdal__coll__graph.md5       |    2 +-
 doc/html/classImgReaderGdal__coll__graph.png       |  Bin 11843 -> 14605 bytes
 doc/html/classImgReaderGdal__inherit__graph.map    |    4 +
 doc/html/classImgReaderGdal__inherit__graph.md5    |    1 +
 doc/html/classImgReaderGdal__inherit__graph.png    |  Bin 0 -> 6726 bytes
 doc/html/classImgReaderOgr-members.html            |    4 +-
 doc/html/classImgReaderOgr.html                    |    4 +-
 doc/html/classImgUpdaterGdal-members.html          |  178 ++
 doc/html/classImgUpdaterGdal.html                  |  445 +++
 doc/html/classImgUpdaterGdal__coll__graph.map      |    7 +
 doc/html/classImgUpdaterGdal__coll__graph.md5      |    1 +
 doc/html/classImgUpdaterGdal__coll__graph.png      |  Bin 0 -> 34794 bytes
 doc/html/classImgUpdaterGdal__inherit__graph.map   |    5 +
 doc/html/classImgUpdaterGdal__inherit__graph.md5   |    1 +
 doc/html/classImgUpdaterGdal__inherit__graph.png   |  Bin 0 -> 12542 bytes
 doc/html/classImgWriterGdal-members.html           |  116 +-
 doc/html/classImgWriterGdal.html                   |  239 +-
 doc/html/classImgWriterGdal__coll__graph.map       |    5 +-
 doc/html/classImgWriterGdal__coll__graph.md5       |    2 +-
 doc/html/classImgWriterGdal__coll__graph.png       |  Bin 14112 -> 16361 bytes
 doc/html/classImgWriterGdal__inherit__graph.map    |    4 +
 doc/html/classImgWriterGdal__inherit__graph.md5    |    1 +
 doc/html/classImgWriterGdal__inherit__graph.png    |  Bin 0 -> 6909 bytes
 doc/html/classImgWriterOgr-members.html            |    4 +-
 doc/html/classImgWriterOgr.html                    |    4 +-
 doc/html/classIncrease__IndexValue-members.html    |    4 +-
 doc/html/classIncrease__IndexValue.html            |    4 +-
 doc/html/classIncrease__PosValue-members.html      |    4 +-
 doc/html/classIncrease__PosValue.html              |    4 +-
 doc/html/classKernel-members.html                  |    4 +-
 doc/html/classKernel.html                          |    4 +-
 doc/html/classLastReturnFilter-members.html        |    4 +-
 doc/html/classLastReturnFilter.html                |    4 +-
 doc/html/classMainWindow-members.html              |    4 +-
 doc/html/classMainWindow.html                      |    4 +-
 doc/html/classONE__CLASS__Q-members.html           |    4 +-
 doc/html/classONE__CLASS__Q.html                   |    4 +-
 doc/html/classOptFactory-members.html              |    4 +-
 doc/html/classOptFactory.html                      |    4 +-
 doc/html/classOptionpk-members.html                |   30 +-
 doc/html/classOptionpk.html                        |   29 +-
 doc/html/classQMatrix-members.html                 |    4 +-
 doc/html/classQMatrix.html                         |    4 +-
 doc/html/classSVC__Q-members.html                  |    4 +-
 doc/html/classSVC__Q.html                          |    4 +-
 doc/html/classSVR__Q-members.html                  |    4 +-
 doc/html/classSVR__Q.html                          |    4 +-
 doc/html/classSolver-members.html                  |    4 +-
 doc/html/classSolver.html                          |    4 +-
 doc/html/classSolver__NU-members.html              |    4 +-
 doc/html/classSolver__NU.html                      |    4 +-
 doc/html/classUi_1_1MainWindow-members.html        |    4 +-
 doc/html/classUi_1_1MainWindow.html                |    4 +-
 doc/html/classUi__MainWindow-members.html          |    4 +-
 doc/html/classUi__MainWindow.html                  |    4 +-
 doc/html/classVector2d-members.html                |    4 +-
 doc/html/classVector2d.html                        |    4 +-
 ...confusionmatrix_1_1ConfusionMatrix-members.html |    4 +-
 .../classconfusionmatrix_1_1ConfusionMatrix.html   |    4 +-
 doc/html/classes.html                              |   84 +-
 doc/html/classfilter2d_1_1Filter2d-members.html    |    4 +-
 doc/html/classfilter2d_1_1Filter2d.html            |    4 +-
 doc/html/classfilter_1_1Filter-members.html        |   28 +-
 doc/html/classfilter_1_1Filter.html                |   16 +-
 ...lassimgregression_1_1ImgRegression-members.html |    4 +-
 doc/html/classimgregression_1_1ImgRegression.html  |    4 +-
 ...sPlugin_1_1ProcessingPktoolsPlugin-members.html |    4 +-
 ...ngPktoolsPlugin_1_1ProcessingPktoolsPlugin.html |    4 +-
 ...qgis_1_1pkcomposite_1_1pkcomposite-members.html |    4 +-
 .../classqgis_1_1pkcomposite_1_1pkcomposite.html   |    4 +-
 .../classqgis_1_1pkcrop_1_1pkcrop-members.html     |    4 +-
 doc/html/classqgis_1_1pkcrop_1_1pkcrop.html        |    4 +-
 ...diff__accuracy_1_1pkdiff__accuracy-members.html |    4 +-
 ...is_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html |    4 +-
 ...lassqgis_1_1pkextract_1_1pkextract-members.html |    4 +-
 doc/html/classqgis_1_1pkextract_1_1pkextract.html  |    4 +-
 ...pkextract__grid_1_1pkextract__grid-members.html |    4 +-
 ...qgis_1_1pkextract__grid_1_1pkextract__grid.html |    4 +-
 ...tract__random_1_1pkextract__random-members.html |    4 +-
 ..._1_1pkextract__random_1_1pkextract__random.html |    4 +-
 ...lter__spatial_1_1pkfilter__spatial-members.html |    4 +-
 ..._1_1pkfilter__spatial_1_1pkfilter__spatial.html |    4 +-
 ...er__spectral_1_1pkfilter__spectral-members.html |    4 +-
 ..._1pkfilter__spectral_1_1pkfilter__spectral.html |    4 +-
 ...qgis_1_1pkfilterdem_1_1pkfilterdem-members.html |    4 +-
 .../classqgis_1_1pkfilterdem_1_1pkfilterdem.html   |    4 +-
 ...lassqgis_1_1pkgetmask_1_1pkgetmask-members.html |    4 +-
 doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html  |    4 +-
 ...lassqgis_1_1pklas2img_1_1pklas2img-members.html |    4 +-
 doc/html/classqgis_1_1pklas2img_1_1pklas2img.html  |    4 +-
 ...lassqgis_1_1pkreclass_1_1pkreclass-members.html |    4 +-
 doc/html/classqgis_1_1pkreclass_1_1pkreclass.html  |    4 +-
 ...lassqgis_1_1pksetmask_1_1pksetmask-members.html |    4 +-
 doc/html/classqgis_1_1pksetmask_1_1pksetmask.html  |    4 +-
 doc/html/classqgis_1_1pksvm_1_1pksvm-members.html  |    4 +-
 doc/html/classqgis_1_1pksvm_1_1pksvm.html          |    4 +-
 ...orithmProvider_1_1pktoolsAlgorithmProvider.html |    4 +-
 ...toolsAlgorithm_1_1pktoolsAlgorithm-members.html |    4 +-
 ...is_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html |    4 +-
 ...is_1_1pktoolsUtils_1_1pktoolsUtils-members.html |    4 +-
 .../classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html |    4 +-
 ...ools_1_1pkcomposite_1_1pkcomposite-members.html |    4 +-
 ...s_1_1pktools_1_1pkcomposite_1_1pkcomposite.html |    4 +-
 ...gis_1_1pktools_1_1pkcrop_1_1pkcrop-members.html |    4 +-
 .../classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html  |    4 +-
 ...diff__accuracy_1_1pkdiff__accuracy-members.html |    4 +-
 ...ls_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html |    4 +-
 ...1pktools_1_1pkextract_1_1pkextract-members.html |    4 +-
 ...sqgis_1_1pktools_1_1pkextract_1_1pkextract.html |    4 +-
 ...pkextract__grid_1_1pkextract__grid-members.html |    4 +-
 ...ools_1_1pkextract__grid_1_1pkextract__grid.html |    4 +-
 ...tract__random_1_1pkextract__random-members.html |    4 +-
 ..._1_1pkextract__random_1_1pkextract__random.html |    4 +-
 ...lter__spatial_1_1pkfilter__spatial-members.html |    4 +-
 ..._1_1pkfilter__spatial_1_1pkfilter__spatial.html |    4 +-
 ...er__spectral_1_1pkfilter__spectral-members.html |    4 +-
 ..._1pkfilter__spectral_1_1pkfilter__spectral.html |    4 +-
 ...ools_1_1pkfilterdem_1_1pkfilterdem-members.html |    4 +-
 ...s_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html |    4 +-
 ...1pktools_1_1pkgetmask_1_1pkgetmask-members.html |    4 +-
 ...sqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html |    4 +-
 ...1pktools_1_1pklas2img_1_1pklas2img-members.html |    4 +-
 ...sqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html |    4 +-
 ...1pktools_1_1pkreclass_1_1pkreclass-members.html |    4 +-
 ...sqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html |    4 +-
 ...1pktools_1_1pksetmask_1_1pksetmask-members.html |    4 +-
 ...sqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html |    4 +-
 ...sqgis_1_1pktools_1_1pksvm_1_1pksvm-members.html |    4 +-
 .../classqgis_1_1pktools_1_1pksvm_1_1pksvm.html    |    4 +-
 ...toolsAlgorithm_1_1pktoolsAlgorithm-members.html |    4 +-
 ...ls_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html |    4 +-
 ...ls_1_1pktoolsUtils_1_1pktoolsUtils-members.html |    4 +-
 ...1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html |    4 +-
 .../classstatfactory_1_1StatFactory-members.html   |  151 +-
 doc/html/classstatfactory_1_1StatFactory.html      |   16 +-
 doc/html/config_8h_source.html                     |   10 +-
 doc/html/dir_0af1587c8378955de40f48b4bd1869f0.html |    6 +-
 doc/html/dir_0f38b5d14ac73b43e2a48a75f9e70be8.html |    4 +-
 doc/html/dir_0f63d6441a2c250919e1e8723011eb2f.html |    4 +-
 doc/html/dir_2676862852e3d558e3597542a81ecc63.html |    4 +-
 doc/html/dir_280a0ba2820d23d6529bf494f1ea3ddd.html |    4 +-
 doc/html/dir_35acdce8930fac877097c845a64519e5.html |    4 +-
 doc/html/dir_41d189c72498e24f979b227eb8e138b1.html |    4 +-
 doc/html/dir_4dfaa1fe1382d1276d1c80b1d5035ade.html |    4 +-
 doc/html/dir_53adf0b982dc8545998aae3f283a5a58.html |    8 +-
 doc/html/dir_5785acc8d2e42f8795bdbe936856f26d.html |    4 +-
 doc/html/dir_5f1e10fd305b434def78aaf73fd56d60.html |    4 +-
 doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html |    4 +-
 doc/html/dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html |   14 +-
 doc/html/dir_849702d4228bd835bdf1201002937cb3.html |    4 +-
 doc/html/dir_89a0bd85ecec8fbb2c320310670be290.html |    4 +-
 doc/html/dir_ab1bbd5a6b4bd6507847335527b029bb.html |    4 +-
 doc/html/dir_b66e135988e27fdc966ddddb8708f514.html |    4 +-
 doc/html/dir_b6b6de371025fb67c6b8623f3d3cd2ce.html |    4 +-
 doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d.html |    4 +-
 doc/html/dir_b8eb6544d8d9ffceba16909a7b9d17d7.html |    4 +-
 doc/html/dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html |    4 +-
 doc/html/dir_e28b2035b152bb51229fe7a0fca4e376.html |    4 +-
 doc/html/dir_e61db0d85028141ec5940fd7f2a6e0fc.html |    4 +-
 doc/html/dir_e6df591b0639d4c4807ef64d058833e2.html |    4 +-
 doc/html/dir_ed1df9621940d6aa1183c365ad1750d2.html |    4 +-
 doc/html/dir_f92e37ed5759424bff98155847b1034b.html |    4 +-
 doc/html/files.html                                |   58 +-
 doc/html/functions.html                            |    4 +-
 doc/html/functions_func.html                       |    4 +-
 doc/html/functions_rela.html                       |    4 +-
 doc/html/graph_legend.html                         |    4 +-
 doc/html/hierarchy.html                            |  175 +-
 doc/html/index.html                                |    4 +-
 doc/html/inherit_graph_18.map                      |    5 +-
 doc/html/inherit_graph_18.md5                      |    2 +-
 doc/html/inherit_graph_18.png                      |  Bin 1492 -> 8335 bytes
 doc/html/inherit_graph_21.map                      |    2 +-
 doc/html/inherit_graph_21.md5                      |    2 +-
 doc/html/inherit_graph_21.png                      |  Bin 1671 -> 1481 bytes
 doc/html/inherit_graph_22.map                      |    2 +-
 doc/html/inherit_graph_22.md5                      |    2 +-
 doc/html/inherit_graph_22.png                      |  Bin 1481 -> 1737 bytes
 doc/html/inherit_graph_23.map                      |    2 +-
 doc/html/inherit_graph_23.md5                      |    2 +-
 doc/html/inherit_graph_23.png                      |  Bin 1737 -> 1754 bytes
 doc/html/inherit_graph_24.map                      |    2 +-
 doc/html/inherit_graph_24.md5                      |    2 +-
 doc/html/inherit_graph_24.png                      |  Bin 1754 -> 1346 bytes
 doc/html/inherit_graph_25.map                      |    2 +-
 doc/html/inherit_graph_25.md5                      |    2 +-
 doc/html/inherit_graph_25.png                      |  Bin 1346 -> 1822 bytes
 doc/html/inherit_graph_26.map                      |    2 +-
 doc/html/inherit_graph_26.md5                      |    2 +-
 doc/html/inherit_graph_26.png                      |  Bin 1822 -> 2329 bytes
 doc/html/inherit_graph_27.map                      |    2 +-
 doc/html/inherit_graph_27.md5                      |    2 +-
 doc/html/inherit_graph_27.png                      |  Bin 2329 -> 1572 bytes
 doc/html/inherit_graph_28.map                      |    5 +-
 doc/html/inherit_graph_28.md5                      |    2 +-
 doc/html/inherit_graph_28.png                      |  Bin 1572 -> 7860 bytes
 doc/html/inherit_graph_29.map                      |    5 +-
 doc/html/inherit_graph_29.md5                      |    2 +-
 doc/html/inherit_graph_29.png                      |  Bin 7860 -> 1411 bytes
 doc/html/inherit_graph_30.map                      |   29 +-
 doc/html/inherit_graph_30.md5                      |    2 +-
 doc/html/inherit_graph_30.png                      |  Bin 1411 -> 167041 bytes
 doc/html/inherit_graph_31.map                      |   30 +-
 doc/html/inherit_graph_31.md5                      |    2 +-
 doc/html/inherit_graph_31.png                      |  Bin 167041 -> 5862 bytes
 doc/html/inherit_graph_32.map                      |    4 +-
 doc/html/inherit_graph_32.md5                      |    2 +-
 doc/html/inherit_graph_32.png                      |  Bin 5862 -> 9013 bytes
 doc/html/inherit_graph_33.map                      |    3 +-
 doc/html/inherit_graph_33.md5                      |    2 +-
 doc/html/inherit_graph_33.png                      |  Bin 9013 -> 1956 bytes
 doc/html/inherit_graph_34.map                      |    2 +-
 doc/html/inherit_graph_34.md5                      |    2 +-
 doc/html/inherit_graph_34.png                      |  Bin 1956 -> 2724 bytes
 doc/html/inherit_graph_35.map                      |    2 +-
 doc/html/inherit_graph_35.md5                      |    2 +-
 doc/html/inherit_graph_35.png                      |  Bin 2724 -> 1915 bytes
 doc/html/inherit_graph_36.map                      |    2 +-
 doc/html/inherit_graph_36.md5                      |    2 +-
 doc/html/inherit_graph_36.png                      |  Bin 1915 -> 2334 bytes
 doc/html/inherit_graph_37.map                      |    6 +-
 doc/html/inherit_graph_37.md5                      |    2 +-
 doc/html/inherit_graph_37.png                      |  Bin 2334 -> 8435 bytes
 doc/html/inherit_graph_38.map                      |    7 +-
 doc/html/inherit_graph_38.md5                      |    2 +-
 doc/html/inherit_graph_38.png                      |  Bin 8435 -> 1729 bytes
 doc/html/inherit_graph_39.map                      |    3 +-
 doc/html/inherit_graph_39.md5                      |    2 +-
 doc/html/inherit_graph_39.png                      |  Bin 1729 -> 1477 bytes
 doc/html/inherit_graph_40.map                      |    2 +-
 doc/html/inherit_graph_40.md5                      |    2 +-
 doc/html/inherit_graph_40.png                      |  Bin 1477 -> 1721 bytes
 doc/html/inherit_graph_41.map                      |    2 +-
 doc/html/inherit_graph_41.md5                      |    2 +-
 doc/html/inherit_graph_41.png                      |  Bin 1721 -> 1134 bytes
 doc/html/inherit_graph_42.map                      |    2 +-
 doc/html/inherit_graph_42.md5                      |    2 +-
 doc/html/inherit_graph_42.png                      |  Bin 1134 -> 1161 bytes
 doc/html/inherit_graph_43.map                      |    2 +-
 doc/html/inherit_graph_43.md5                      |    2 +-
 doc/html/inherit_graph_43.png                      |  Bin 1161 -> 1350 bytes
 doc/html/inherit_graph_44.map                      |    2 +-
 doc/html/inherit_graph_44.md5                      |    2 +-
 doc/html/inherit_graph_44.png                      |  Bin 1350 -> 1221 bytes
 doc/html/inherit_graph_45.map                      |    3 +-
 doc/html/inherit_graph_45.md5                      |    2 +-
 doc/html/inherit_graph_45.png                      |  Bin 1221 -> 2164 bytes
 doc/html/inherits.html                             |   64 +-
 doc/html/md_apps.html                              |    6 +-
 doc/html/md_description_pkstat.html                |    4 +-
 doc/html/md_examples_pkann.html                    |    4 +-
 doc/html/md_examples_pkascii2img.html              |    4 +-
 doc/html/md_examples_pkascii2ogr.html              |    4 +-
 doc/html/md_examples_pkcomposite.html              |    4 +-
 doc/html/md_examples_pkcreatect.html               |    4 +-
 doc/html/md_examples_pkcrop.html                   |    4 +-
 doc/html/md_examples_pkdiff.html                   |    4 +-
 doc/html/md_examples_pkdsm2shadow.html             |    4 +-
 doc/html/md_examples_pkdumpimg.html                |    4 +-
 doc/html/md_examples_pkdumpogr.html                |    4 +-
 doc/html/md_examples_pkextract.html                |    4 +-
 doc/html/md_examples_pkfilter.html                 |    4 +-
 doc/html/md_examples_pkgetmask.html                |    4 +-
 doc/html/md_examples_pkinfo.html                   |    4 +-
 doc/html/md_examples_pkkalman.html                 |   75 +
 doc/html/md_examples_pkpolygonize.html             |    4 +-
 doc/html/md_examples_pkreclass.html                |    4 +-
 doc/html/md_examples_pksetmask.html                |    4 +-
 doc/html/md_examples_pksieve.html                  |    4 +-
 doc/html/md_examples_pkstatogr.html                |    4 +-
 doc/html/md_examples_pksvm.html                    |    4 +-
 doc/html/md_faq_pkcomposite.html                   |    4 +-
 doc/html/md_faq_pksetmask.html                     |    4 +-
 doc/html/md_header.html                            |    4 +-
 doc/html/md_installation_linux.html                |   27 +-
 doc/html/md_installation_plugins.html              |    4 +-
 doc/html/md_installation_windows.html              |   38 +-
 doc/html/md_mainpage.html                          |    4 +-
 doc/html/myfann__cpp_8h_source.html                |    4 +-
 doc/html/pages.html                                |   96 +-
 doc/html/pkann.html                                |    6 +-
 doc/html/pkann_8cc_source.html                     | 2400 +++++++-------
 doc/html/pkascii2img.html                          |    4 +-
 doc/html/pkascii2img_8cc_source.html               |    6 +-
 doc/html/pkascii2ogr.html                          |    4 +-
 doc/html/pkascii2ogr_8cc_source.html               |    4 +-
 doc/html/pkcomposite.html                          |   12 +-
 doc/html/pkcomposite_8cc_source.html               | 2282 +++++++-------
 doc/html/pkcomposite_8py_source.html               |    4 +-
 doc/html/pkcomposite__gui_2main_8cc_source.html    |    4 +-
 .../pkcomposite__gui_2mainwindow_8cc_source.html   |    4 +-
 .../pkcomposite__gui_2mainwindow_8h_source.html    |    4 +-
 doc/html/pkcreatect.html                           |    6 +-
 doc/html/pkcreatect_8cc_source.html                |   10 +-
 doc/html/pkcrop.html                               |   14 +-
 doc/html/pkcrop_8cc_source.html                    | 1402 +++++----
 doc/html/pkcrop_8py_source.html                    |    4 +-
 doc/html/pkcrop__gui_2main_8cc_source.html         |    4 +-
 doc/html/pkcrop__gui_2mainwindow_8cc_source.html   |    4 +-
 doc/html/pkcrop__gui_2mainwindow_8h_source.html    |    4 +-
 doc/html/pkdiff.html                               |    6 +-
 doc/html/pkdiff_8cc_source.html                    | 1728 +++++-----
 doc/html/pkdiff__accuracy_8py_source.html          |    4 +-
 doc/html/pkdiff__gui_2main_8cpp_source.html        |    4 +-
 doc/html/pkdiff__gui_2mainwindow_8cpp_source.html  |    4 +-
 doc/html/pkdiff__gui_2mainwindow_8h_source.html    |    4 +-
 doc/html/pkdsm2shadow.html                         |    6 +-
 doc/html/pkdsm2shadow_8cc_source.html              |   12 +-
 doc/html/pkdumpimg.html                            |    4 +-
 doc/html/pkdumpimg_8cc_source.html                 |    6 +-
 doc/html/pkdumpogr.html                            |    4 +-
 doc/html/pkdumpogr_8cc_source.html                 |    4 +-
 doc/html/pkdumpogr_8h_source.html                  |    4 +-
 doc/html/pkeditogr_8cc_source.html                 |    4 +-
 doc/html/pkegcs.html                               |    4 +-
 doc/html/pkegcs_8cc_source.html                    |    6 +-
 doc/html/pkenhance_8cc_source.html                 |    8 +-
 doc/html/pkextract.html                            |    4 +-
 doc/html/pkextract_8cc_source.html                 | 3209 +++++++++----------
 doc/html/pkextract_8py_source.html                 |    4 +-
 doc/html/pkextract__grid_8py_source.html           |    4 +-
 doc/html/pkextract__gui_2main_8cpp_source.html     |    4 +-
 .../pkextract__gui_2mainwindow_8cpp_source.html    |    4 +-
 doc/html/pkextract__gui_2mainwindow_8h_source.html |    4 +-
 doc/html/pkextract__random_8py_source.html         |    4 +-
 doc/html/pkfillnodata.html                         |    4 +-
 doc/html/pkfillnodata_8cc_source.html              |    4 +-
 doc/html/pkfilter.html                             |   10 +-
 doc/html/pkfilter_8cc_source.html                  | 1863 +++++------
 doc/html/pkfilter__spatial_8py_source.html         |    4 +-
 doc/html/pkfilter__spectral_8py_source.html        |    4 +-
 doc/html/pkfilterascii.html                        |    4 +-
 doc/html/pkfilterascii_8cc_source.html             |    4 +-
 doc/html/pkfilterdem.html                          |    6 +-
 doc/html/pkfilterdem_8cc_source.html               |   12 +-
 doc/html/pkfilterdem_8py_source.html               |    4 +-
 doc/html/pkfsann.html                              |    4 +-
 doc/html/pkfsann_8cc_source.html                   |    8 +-
 doc/html/pkfsann_8h_source.html                    |    4 +-
 doc/html/pkfssvm.html                              |    4 +-
 doc/html/pkfssvm_8cc_source.html                   |    8 +-
 doc/html/pkgetmask.html                            |    6 +-
 doc/html/pkgetmask_8cc_source.html                 |   12 +-
 doc/html/pkgetmask_8py_source.html                 |    4 +-
 doc/html/pkinfo.html                               |    4 +-
 doc/html/pkinfo_8cc_source.html                    |   10 +-
 doc/html/pkkalman.html                             |  117 +-
 doc/html/pkkalman1_8cc_source.html                 |    8 +-
 doc/html/pkkalman_8cc_source.html                  | 3304 +++++++++++---------
 doc/html/pklas2img.html                            |    6 +-
 doc/html/pklas2img_8cc_source.html                 |   12 +-
 doc/html/pklas2img_8py_source.html                 |    6 +-
 doc/html/pkndvi_8cc_source.html                    |    6 +-
 doc/html/pkoptsvm.html                             |    4 +-
 doc/html/pkoptsvm_8cc_source.html                  | 1203 ++++---
 doc/html/pkpolygonize.html                         |    4 +-
 doc/html/pkpolygonize_8cc_source.html              |    6 +-
 doc/html/pkreclass.html                            |    6 +-
 doc/html/pkreclass_8cc_source.html                 |  660 ++--
 doc/html/pkreclass_8py_source.html                 |    4 +-
 doc/html/pkregann.html                             |    4 +-
 doc/html/pkregann_8cc_source.html                  |    4 +-
 doc/html/pksensormodel_8h_source.html              |    4 +-
 doc/html/pksetmask.html                            |    6 +-
 doc/html/pksetmask_8cc_source.html                 |   12 +-
 doc/html/pksetmask_8py_source.html                 |    4 +-
 doc/html/pksieve.html                              |    4 +-
 doc/html/pksieve_8cc_source.html                   |    8 +-
 doc/html/pkstat.html                               |    4 +-
 doc/html/pkstat_8cc_source.html                    | 1781 ++++++-----
 doc/html/pkstatascii.html                          |    4 +-
 doc/html/pkstatascii_8cc_source.html               |    4 +-
 doc/html/pkstatogr.html                            |    4 +-
 doc/html/pkstatogr_8cc_source.html                 |    4 +-
 doc/html/{pkdsm2shadow.html => pkstatprofile.html} |   78 +-
 ...c_source.html => pkstatprofile_8cc_source.html} |  284 +-
 doc/html/{pkdsm2shadow.html => pkstatz.html}       |   78 +-
 doc/html/pksvm.html                                |    8 +-
 doc/html/pksvm_8cc_source.html                     | 2449 +++++++--------
 doc/html/pksvm_8py_source.html                     |    4 +-
 doc/html/pksvm__gui_2main_8cpp_source.html         |    4 +-
 doc/html/pksvm__gui_2mainwindow_8cpp_source.html   |    4 +-
 doc/html/pksvm__gui_2mainwindow_8h_source.html     |    4 +-
 doc/html/pktestOption_8cc_source.html              |    4 +-
 doc/html/pktoolsAlgorithmProvider_8py_source.html  |    4 +-
 doc/html/pktoolsAlgorithm_8py_source.html          |    4 +-
 doc/html/pktoolsUtils_8py_source.html              |    4 +-
 ...ktools_2ProcessingPktoolsPlugin_8py_source.html |    4 +-
 doc/html/pktools_2____init_____8py_source.html     |    4 +-
 doc/html/pktools_2pkcomposite_8py_source.html      |    4 +-
 doc/html/pktools_2pkcrop_8py_source.html           |    4 +-
 doc/html/pktools_2pkdiff__accuracy_8py_source.html |    4 +-
 doc/html/pktools_2pkextract_8py_source.html        |    4 +-
 doc/html/pktools_2pkextract__grid_8py_source.html  |    4 +-
 .../pktools_2pkextract__random_8py_source.html     |    4 +-
 .../pktools_2pkfilter__spatial_8py_source.html     |    4 +-
 .../pktools_2pkfilter__spectral_8py_source.html    |    4 +-
 doc/html/pktools_2pkfilterdem_8py_source.html      |    4 +-
 doc/html/pktools_2pkgetmask_8py_source.html        |    4 +-
 doc/html/pktools_2pklas2img_8py_source.html        |    4 +-
 doc/html/pktools_2pkreclass_8py_source.html        |    4 +-
 doc/html/pktools_2pksetmask_8py_source.html        |    4 +-
 doc/html/pktools_2pksvm_8py_source.html            |    4 +-
 ...tools_2pktoolsAlgorithmProvider_8py_source.html |    4 +-
 doc/html/pktools_2pktoolsAlgorithm_8py_source.html |    4 +-
 doc/html/pktools_2pktoolsUtils_8py_source.html     |    4 +-
 doc/html/structIndexValue-members.html             |    4 +-
 doc/html/structIndexValue.html                     |    4 +-
 doc/html/structPosValue-members.html               |    4 +-
 doc/html/structPosValue.html                       |    4 +-
 doc/html/structSolver_1_1SolutionInfo-members.html |    4 +-
 doc/html/structSolver_1_1SolutionInfo.html         |    4 +-
 doc/html/structdecision__function-members.html     |    4 +-
 doc/html/structdecision__function.html             |    4 +-
 doc/html/structsvm__model-members.html             |    4 +-
 doc/html/structsvm__model.html                     |    4 +-
 doc/html/structsvm__node-members.html              |    4 +-
 doc/html/structsvm__node.html                      |    4 +-
 doc/html/structsvm__parameter-members.html         |    4 +-
 doc/html/structsvm__parameter.html                 |    4 +-
 doc/html/structsvm__problem-members.html           |    4 +-
 doc/html/structsvm__problem.html                   |    4 +-
 doc/html/svm_8cpp_source.html                      |    4 +-
 doc/html/svm_8h_source.html                        |    4 +-
 doc/installation_linux.dox                         |   45 +
 doc/installation_windows.dox                       |   41 +-
 src/algorithms/FeatureSelector.h                   |    2 +-
 src/apps/Makefile.am                               |    4 +-
 src/apps/Makefile.in                               |   41 +-
 src/apps/pkann.cc                                  |   46 +-
 src/apps/pkcomposite.cc                            |   29 +-
 src/apps/pkcrop.cc                                 |   38 +-
 src/apps/pkextract.cc                              |   77 +-
 src/apps/pkfsann.cc                                |    4 +-
 src/apps/pkfssvm.cc                                |    4 +-
 src/apps/pkinfo.cc                                 |    2 +-
 src/apps/pkkalman.cc                               | 2491 ++++++++-------
 src/apps/pkoptsvm.cc                               |    4 +-
 src/apps/pkstatprofile.cc                          |   20 +-
 src/apps/pksvm.cc                                  |   43 +-
 src/imageclasses/ImgRasterGdal.cc                  |  342 ++
 src/imageclasses/ImgRasterGdal.h                   |  100 +
 src/imageclasses/ImgReaderGdal.cc                  |  331 +-
 src/imageclasses/ImgReaderGdal.h                   |   67 +-
 src/imageclasses/ImgReaderOgr.cc                   |   31 +-
 src/imageclasses/ImgUpdaterGdal.cc                 |   45 +
 src/imageclasses/ImgUpdaterGdal.h                  |   39 +
 src/imageclasses/ImgWriterGdal.cc                  |  262 +-
 src/imageclasses/ImgWriterGdal.h                   |   39 +-
 src/imageclasses/Makefile.am                       |    4 +-
 src/imageclasses/Makefile.in                       |   11 +-
 566 files changed, 25773 insertions(+), 23107 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3e819ef..5ae0525 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -418,7 +418,9 @@ version 2.6.4
 version 2.6.5
  - GTiff default output image format for all applications
  - ImgReaderOgr.h patch for gdal 2.0 (ticket #46270), thanks to Bas Couwenberg
- - ImgReaderOgr.cc patch for gdal 2.0 (ticket #46270), thanks to Bas Couwenberg
+ - ImgReaderOgr.cc
+	patch for gdal 2.0 (ticket #46270), thanks to Bas Couwenberg
+	read features (bands) in readDataImageOgr should be [bB][0-9]
  - ImgWriterOgr.h patch for gdal 2.0 (ticket #46270), thanks to Bas Couwenberg
  - ImgWriterOgr.cc patch for gdal 2.0 (ticket #46270), thanks to Bas Couwenberg
  - cmake support, thanks to Peter Bunting and Kris Vanhoof
@@ -435,7 +437,23 @@ version 2.6.5
 	performace gain: keep all input images open and read line for all inputs at once. Warning for large number of input: 1) memory issues, 2) GDAL_MAX_DATASET_POOL_SIZE which defaults to 100 3) restriction in Linux: number of file handles that can be opened by a process is generally limited to 1024.
  - pkstatprofile
 	Calculate statistical functions on temporal/spectral profile (multi-band rater dataset), replaces some functionality in pkfilter -dz 1. Supports multiple functions to produced multi-band output
-Todo:
- - todo for API
-	ImgReaderGdal (ImgWriterGdal) open in update mode (check gdal_edit.py: http://searchcode.com/codesearch/view/18938404)
+
+version 2.6.6
+ - pkcrop
+	support -align option to align output bounding box to input image
+ - pkcrop
+	support -align option to align output bounding box to first input image
+ - pkkalman
+	bug loop icol beyond limits and start counting from jcol (ticket #46880)
+ - ImgRasterGdal
+	new base class for ImgReaderGdal and ImgWriterGdal
+ - ImgUpdaterGdal
+	new class for reading GDAL raster datasets in update mode
+ - ImgReaderGdal
+	derived from base class ImgRasterGdal
+ - ImgWriterGdal
+	derived from base class ImgRasterGdal
+ - pkkalman
+	first release
+	support multi-band input and output
 
diff --git a/configure b/configure
index 3bc9b17..09f39d2 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for pktools 2.6.5.
+# Generated by GNU Autoconf 2.69 for pktools 2.6.6.
 #
 # Report bugs to <kempenep at gmail.com>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='pktools'
 PACKAGE_TARNAME='pktools'
-PACKAGE_VERSION='2.6.5'
-PACKAGE_STRING='pktools 2.6.5'
+PACKAGE_VERSION='2.6.6'
+PACKAGE_STRING='pktools 2.6.6'
 PACKAGE_BUGREPORT='kempenep at gmail.com'
 PACKAGE_URL=''
 
@@ -1366,7 +1366,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures pktools 2.6.5 to adapt to many kinds of systems.
+\`configure' configures pktools 2.6.6 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1436,7 +1436,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of pktools 2.6.5:";;
+     short | recursive ) echo "Configuration of pktools 2.6.6:";;
    esac
   cat <<\_ACEOF
 
@@ -1562,7 +1562,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-pktools configure 2.6.5
+pktools configure 2.6.6
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2323,7 +2323,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by pktools $as_me 2.6.5, which was
+It was created by pktools $as_me 2.6.6, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3187,7 +3187,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='pktools'
- VERSION='2.6.5'
+ VERSION='2.6.6'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -19597,7 +19597,7 @@ fi
 # For information on how to properly maintain the library version information,
 # refer to the libtool manual, section "Updating library version information":
 # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
-PKTOOLS_SO_VERSION=1:5:0
+PKTOOLS_SO_VERSION=1:6:0
 
 
 # files to generate via autotools (.am or .in source files)
@@ -20175,7 +20175,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by pktools $as_me 2.6.5, which was
+This file was extended by pktools $as_me 2.6.6, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -20241,7 +20241,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-pktools config.status 2.6.5
+pktools config.status 2.6.6
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
index 4b7cdd1..909a3ad 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([pktools], [2.6.5], [kempenep at gmail.com])
+AC_INIT([pktools], [2.6.6], [kempenep at gmail.com])
 #AM_INIT_AUTOMAKE([-Wall -Werror foreign])
 AM_INIT_AUTOMAKE([-Wall -Wno-extra-portability foreign])
 #AM_INIT_AUTOMAKE([subdir-objects]) #not working due to bug in autoconf, see Debian list: Bug #752993)
@@ -114,7 +114,7 @@ AC_SUBST([LIBS])
 # For information on how to properly maintain the library version information,
 # refer to the libtool manual, section "Updating library version information":
 # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
-AC_SUBST([PKTOOLS_SO_VERSION], [1:5:0])
+AC_SUBST([PKTOOLS_SO_VERSION], [1:6:0])
 
 # files to generate via autotools (.am or .in source files)
 AC_CONFIG_HEADERS([config.h])
diff --git a/doc/Doxyfile b/doc/Doxyfile
index 6892989..628836d 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -38,7 +38,7 @@ PROJECT_NAME           = pktools
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 2.6.5
+PROJECT_NUMBER         = 2.6.6
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -51,7 +51,7 @@ PROJECT_BRIEF          = "Processing Kernel for geospatial data"
 # and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
 # to the output directory.
 
-PROJECT_LOGO           = logo.png
+PROJECT_LOGO           = figures/logo.png
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
 # into which the generated documentation will be written. If a relative path is
diff --git a/doc/apps.dox b/doc/apps.dox
index b30b3f2..b0ee58a 100644
--- a/doc/apps.dox
+++ b/doc/apps.dox
@@ -19,6 +19,7 @@
 - \ref pkfssvm  feature selection for support vector machine classifier pksvm
 - \ref pkgetmask  program to create mask image based on values in input raster image
 - \ref pkinfo  Report basic information from raster datasets (similar to gdalinfo)
+- \ref pkkalman  produce kalman filtered raster time series
 - \ref pklas2img  Rasterize LAS/LAZ point clouds with filtering/compositing options
 - \ref pkoptsvm  program to optimize parameters for support vector machine classifier pksvm
 - \ref pkpolygonize  program to make vector file from raster image
@@ -29,4 +30,5 @@
 - \ref pkstatascii  program to calculate basic statistics from text file
 - \ref pkstat  program to calculate basic statistics from raster dataset
 - \ref pkstatogr  program to calculate basic statistics from vector file
+- \ref pkstatprofile  program to calculate statistics in temporal or spectral profile
 - \ref pksvm  classify raster image using Support Vector Machine
diff --git a/doc/apps.dox b/doc/apps.dox~
similarity index 93%
copy from doc/apps.dox
copy to doc/apps.dox~
index b30b3f2..836cf34 100644
--- a/doc/apps.dox
+++ b/doc/apps.dox~
@@ -19,6 +19,8 @@
 - \ref pkfssvm  feature selection for support vector machine classifier pksvm
 - \ref pkgetmask  program to create mask image based on values in input raster image
 - \ref pkinfo  Report basic information from raster datasets (similar to gdalinfo)
+- \ref pkkalman1 
+- \ref pkkalman  produce kalman filtered raster time series
 - \ref pklas2img  Rasterize LAS/LAZ point clouds with filtering/compositing options
 - \ref pkoptsvm  program to optimize parameters for support vector machine classifier pksvm
 - \ref pkpolygonize  program to make vector file from raster image
@@ -29,4 +31,5 @@
 - \ref pkstatascii  program to calculate basic statistics from text file
 - \ref pkstat  program to calculate basic statistics from raster dataset
 - \ref pkstatogr  program to calculate basic statistics from vector file
+- \ref pkstatprofile  program to calculate statistics in temporal or spectral profile
 - \ref pksvm  classify raster image using Support Vector Machine
diff --git a/doc/examples_pkkalman.dox b/doc/examples_pkkalman.dox
new file mode 100644
index 0000000..c0a26cf
--- /dev/null
+++ b/doc/examples_pkkalman.dox
@@ -0,0 +1,31 @@
+\section examples_pkkalman Examples of pkkalman
+
+Assimilate fine spatial resolution NDVI time series acquired at (100 m) with median spatial resolution NDVI time series (300 m). Both time series consist of ten acquisitions in time (provided as a multi-band raster dataset), but fine spatial resolution data are sparse due to cloud coverage. Missing data are characterized by the option -obsnodata. Coarse spatial resolution data have occasional cloud cover too (-modnodata 255). The spatial coverage of the model must be at least the spatial [...]
+
+\code
+pkkalman -obs fine_10band.tif -mod coarse_10band.tif -obsnodata 255 -modnodata 255 -dir forward -ofw fine_filled.tif
+\endcode
+
+Same as above, but run in forward, backward and smooth mode. Here we provide output filenames for the uncertainties of the predicted time series.
+
+\code
+pkkalman -obs fine_10band.tif -mod coarse_10band.tif -obsnodata 255 -modnodata 255 -dir forward -ofw fine_forward_10band.tif -u_ofw fine_forward_uncert_10band.tif -dir backward -ofb fine_backward_10band.tif -u_obw fine_backward_uncert_10band.tif -dir smooth -ofw fine_smooth_10band.tif -u_ofb fine_smooth_uncert_10band.tif
+\endcode
+
+If the observation time series is not complete, i.e., has less acquisitions than the model, we must explicitly provide the time sequence. Here, the observation at fine spatial resolution is based on two acquisitions only (at times 3 and 8). The model at coarse spatial resolution is based on ten acquisitions (at times 1-10).
+
+\code
+pkkalman -obs fine_2band.tif -mod coarse_10band.tif -obsnodata 255 -modnodata 255 -dir forward -ofw fine_forward_10band.tif -tmod 1 -tmod 2 -tmod 3 -tmod 4 -tmod 5 -tmod 6 -tmod 7 -tmod 8 -tmod 9 -tmod 10 -tobs 3 -tobs 8
+\endcode
+
+In the following example the missing data are not coded within the observations, but read from an external mask:
+
+\code
+pkkalman -obs fine_10band.tif -mod coarse_10band.tif -obsmask finemask_10band.tif -modmask coarsemask_10band.tif -msknodata 1 -mskband 0 -dir forward -ofw fine_forward_10band.tif
+\endcode
+
+The observations and model can be provided as multiple single-band raster datasets. The time sequence for the two observations and ten model inputs are explicitly provided via the options -tobs and tmod.
+
+\code
+pkkalman -obs fine_1.tif -obs fine_2.tif -obsmask finemask_1.tif -obs finemask_2.tif -mod coarse_1.tif -mod coarse_2.tif -mod coarse_3.tif -mod coarse_4.tif -mod coarse_5.tif -mod coarse_6.tif -mod coarse_7.tif -mod coarse_8.tif -mod coarse_9.tif -mod coarse_10.tif -modmask coarsemask_1.tif -modmask coarsemask_2.tif -modmask coarsemask_3.tif -modmask coarsemask_4.tif -modmask coarsemask_5.tif -modmask coarsemask_6.tif -modmask coarsemask_7.tif -modmask coarsemask_8.tif -modmask coarsemas [...]
+\endcode
diff --git a/doc/examples_pkkalman.dox~ b/doc/examples_pkkalman.dox~
new file mode 100644
index 0000000..9cf0f99
--- /dev/null
+++ b/doc/examples_pkkalman.dox~
@@ -0,0 +1,14 @@
+\section examples_pkkalman Examples of pkkalman
+
+Assimilate fine spatial resolution NDVI time series acquired at (100 m) with median spatial resolution NDVI time series (300 m). Both time series have temporal resolution of 10 days, but fine spatial resolution data are sparse due to cloud coverage (missing data characterized by -obsnodata 255). Coarse spatial resolution data have occasional cloud cover too (-modnodata 255). Run the kalman filter in forward mode only.
+
+\code
+pkkalman -obs fine.tif -mod coarse.tif -obsnodata 255 -modnodata 255 -dir forward -ofw fine_filled.tif
+\endcode
+
+Same as above, but run in forward, backward and smooth mode. Write uncertainties of predicted time series as fine_forward_uncert.tif.
+
+\code
+pkkalman -obs fine.tif -mod coarse.tif -obsnodata 255 -modnodata 255 -dir forward -ofw fine_forward.tif -dir backward -ofb fine_backward.tif -dir smooth -ofw fine_smooth.tif -u_ofw fine_forward_uncert.tif -u_obw fine_backward_uncert.tif -u_ofb fine_smooth_uncert.tif
+\endcode
+
diff --git a/doc/logo.odg b/doc/figures/logo.odg
similarity index 100%
rename from doc/logo.odg
rename to doc/figures/logo.odg
diff --git a/doc/logo.png b/doc/figures/logo.png
similarity index 100%
rename from doc/logo.png
rename to doc/figures/logo.png
diff --git a/doc/html/ConfusionMatrix_8cc_source.html b/doc/html/ConfusionMatrix_8cc_source.html
index 5a93722..15b696c 100644
--- a/doc/html/ConfusionMatrix_8cc_source.html
+++ b/doc/html/ConfusionMatrix_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -342,7 +342,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ConfusionMatrix_8h_source.html b/doc/html/ConfusionMatrix_8h_source.html
index 45bb08e..aa1cccd 100644
--- a/doc/html/ConfusionMatrix_8h_source.html
+++ b/doc/html/ConfusionMatrix_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -256,7 +256,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/CostFactorySVM_8cc_source.html b/doc/html/CostFactorySVM_8cc_source.html
index ac006d5..1984842 100644
--- a/doc/html/CostFactorySVM_8cc_source.html
+++ b/doc/html/CostFactorySVM_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -240,7 +240,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/CostFactorySVM_8h_source.html b/doc/html/CostFactorySVM_8h_source.html
index 5a90967..653bf06 100644
--- a/doc/html/CostFactorySVM_8h_source.html
+++ b/doc/html/CostFactorySVM_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -115,7 +115,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/CostFactory_8h_source.html b/doc/html/CostFactory_8h_source.html
index 793631d..dd35020 100644
--- a/doc/html/CostFactory_8h_source.html
+++ b/doc/html/CostFactory_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -121,7 +121,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Egcs_8cc_source.html b/doc/html/Egcs_8cc_source.html
index 2c29ee3..d85a99d 100644
--- a/doc/html/Egcs_8cc_source.html
+++ b/doc/html/Egcs_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -264,7 +264,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Egcs_8h_source.html b/doc/html/Egcs_8h_source.html
index ec92fd3..8a47643 100644
--- a/doc/html/Egcs_8h_source.html
+++ b/doc/html/Egcs_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -112,7 +112,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/FeatureSelector_8h_source.html b/doc/html/FeatureSelector_8h_source.html
index 02f7eae..34b6759 100644
--- a/doc/html/FeatureSelector_8h_source.html
+++ b/doc/html/FeatureSelector_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -403,7 +403,7 @@
 <div class="line"><a name="l00349"></a><span class="lineno">  349</span>     }</div>
 <div class="line"><a name="l00350"></a><span class="lineno">  350</span>     tmpset.push_front(last);</div>
 <div class="line"><a name="l00351"></a><span class="lineno">  351</span>   }</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   <span class="keywordflow">if</span>(maxCost<0){<span class="comment">//all levels removed were catched</span></div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   <span class="keywordflow">if</span>(maxCost<0){<span class="comment">//all levels removed were caught</span></div>
 <div class="line"><a name="l00353"></a><span class="lineno">  353</span>     subset=catchset;</div>
 <div class="line"><a name="l00354"></a><span class="lineno">  354</span>   }</div>
 <div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <span class="comment">//test: assert list contains no duplicate elements</span></div>
@@ -424,7 +424,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/FileReaderAscii_8cc_source.html b/doc/html/FileReaderAscii_8cc_source.html
index 2070eba..828f1c2 100644
--- a/doc/html/FileReaderAscii_8cc_source.html
+++ b/doc/html/FileReaderAscii_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -297,7 +297,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/FileReaderAscii_8h_source.html b/doc/html/FileReaderAscii_8h_source.html
index 6587f87..69ac361 100644
--- a/doc/html/FileReaderAscii_8h_source.html
+++ b/doc/html/FileReaderAscii_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -358,7 +358,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/FileReaderLas_8cc_source.html b/doc/html/FileReaderLas_8cc_source.html
index 4080306..125f4c6 100644
--- a/doc/html/FileReaderLas_8cc_source.html
+++ b/doc/html/FileReaderLas_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -237,7 +237,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/FileReaderLas_8h_source.html b/doc/html/FileReaderLas_8h_source.html
index 15bf5eb..6f6a68e 100644
--- a/doc/html/FileReaderLas_8h_source.html
+++ b/doc/html/FileReaderLas_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -130,7 +130,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Filter2d_8cc_source.html b/doc/html/Filter2d_8cc_source.html
index 3e54bce..7714075 100644
--- a/doc/html/Filter2d_8cc_source.html
+++ b/doc/html/Filter2d_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -508,874 +508,877 @@
 <div class="line"><a name="l00454"></a><span class="lineno">  454</span>       }</div>
 <div class="line"><a name="l00455"></a><span class="lineno">  455</span>         }</div>
 <div class="line"><a name="l00456"></a><span class="lineno">  456</span>         <span class="keywordflow">switch</span>(getFilterType(method)){</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>         <span class="keywordflow">case</span>(filter2d::median):</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>             outBuffer[x/down]=stat.median(windowBuffer);</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>         <span class="keywordflow">case</span>(filter2d::var):{</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>             outBuffer[x/down]=stat.var(windowBuffer);</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>         }</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>         <span class="keywordflow">case</span>(filter2d::stdev):{</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>             outBuffer[x/down]=sqrt(stat.var(windowBuffer));</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         }</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         <span class="keywordflow">case</span>(filter2d::mean):{</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>             outBuffer[x/down]=stat.mean(windowBuffer);</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         }</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>         <span class="keywordflow">case</span>(filter2d::min):{</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>            outBuffer[x/down]=stat.mymin(windowBuffer);</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>         }</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>         <span class="keywordflow">case</span>(filter2d::ismin):{</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>            <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>             outBuffer[x/down]=(stat.mymin(windowBuffer)==windowBuffer[centre])? 1:0;</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         }</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         <span class="keywordflow">case</span>(filter2d::minmax):{<span class="comment">//is the same as homog?</span></div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>           <span class="keywordtype">double</span> min=0;</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>           <span class="keywordtype">double</span> max=0;</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>             stat.minmax(windowBuffer,windowBuffer.begin(),windowBuffer.end(),min,max);</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>             <span class="keywordflow">if</span>(min!=max)</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>               outBuffer[x/down]=0;</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>               outBuffer[x/down]=windowBuffer[centre];<span class="comment">//centre pixels</span></div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>           }</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>         }</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>         <span class="keywordflow">case</span>(filter2d::max):{</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>             outBuffer[x/down]=stat.mymax(windowBuffer);</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>         }</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>         <span class="keywordflow">case</span>(filter2d::ismax):{</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>             outBuffer[x/down]=(stat.mymax(windowBuffer)==windowBuffer[centre])? 1:0;</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>         }</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>         <span class="keywordflow">case</span>(filter2d::order):{</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>             <span class="keywordtype">double</span> lbound=0;</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>             <span class="keywordtype">double</span> ubound=dimX*dimY;</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>             <span class="keywordtype">double</span> theMin=stat.mymin(windowBuffer);</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>             <span class="keywordtype">double</span> theMax=stat.mymax(windowBuffer);</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>             <span class="keywordtype">double</span> scale=(ubound-lbound)/(theMax-theMin);</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>             outBuffer[x/down]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(scale*(windowBuffer[centre]-theMin)+lbound);</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>           }</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>         }</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>         <span class="keywordflow">case</span>(filter2d::sum):{</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>           outBuffer[x/down]=stat.sum(windowBuffer);</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>         }</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">case</span>(filter2d::percentile):{</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       assert(m_threshold.size());</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       outBuffer[x/down]=stat.percentile(windowBuffer,windowBuffer.begin(),windowBuffer.end(),m_threshold[0]);</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     }</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         <span class="keywordflow">case</span>(filter2d::proportion):{</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>         <span class="keywordtype">double</span> sum=stat.sum(windowBuffer);</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         <span class="keywordflow">if</span>(sum)</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>           outBuffer[x/down]=100.0*windowBuffer[centre]/stat.sum(windowBuffer);</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>           outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       }</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     }</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         <span class="keywordflow">case</span>(filter2d::homog):</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="keywordflow">if</span>(occurrence.size()==1)<span class="comment">//all values in window are the same</span></div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>         <span class="keywordflow">case</span>(filter2d::heterog):{</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       <span class="keywordflow">if</span>(occurrence.size()==windowBuffer.size())</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>         outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="keywordflow">else</span>      </div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       <span class="comment">// if(occurrence.size()==1)//all values in window are the same</span></div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       <span class="comment">//   outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</span></div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="comment">// else</span></div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       <span class="comment">//   outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</span></div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>           <span class="comment">// break;</span></div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>           <span class="comment">// for(std::vector<double>::const_iterator wit=windowBuffer.begin();wit!=windowBuffer.end();++wit){</span></div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>           <span class="comment">//   if(wit==windowBuffer.begin()+windowBuffer.size()/2)</span></div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>           <span class="comment">//     continue;</span></div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>           <span class="comment">//   else if(*wit!=inBuffer[(dimY-1)/2][x]){</span></div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>           <span class="comment">//     outBuffer[x/down]=1;</span></div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>       <span class="comment">//     break;</span></div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       <span class="comment">//   }</span></div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>           <span class="comment">//   else if(*wit==inBuffer[(dimY-1)/2][x]){//todo:wit mag niet central pixel zijn</span></div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>           <span class="comment">//     outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</span></div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>           <span class="comment">//     break;</span></div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>           <span class="comment">//   }</span></div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>           <span class="comment">// }</span></div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>           <span class="comment">// break;</span></div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         }</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>         <span class="keywordflow">case</span>(filter2d::density):{</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>         std::vector<short>::const_iterator vit=m_class.begin();</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>         <span class="keywordflow">while</span>(vit!=m_class.end())</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>           outBuffer[x/down]+=100.0*occurrence[*(vit++)]/windowBuffer.size();</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       }</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     }</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>         <span class="keywordflow">case</span>(filter2d::countid):{</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordflow">if</span>(windowBuffer.size())</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         outBuffer[x/down]=occurrence.size();</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     }</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>         <span class="keywordflow">case</span>(filter2d::mode):{</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="keywordflow">if</span>(occurrence.size()){</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>             std::map<long int,int>::const_iterator maxit=occurrence.begin();</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>             <span class="keywordflow">for</span>(std::map<long int,int>::const_iterator mit=occurrence.begin();mit!=occurrence.end();++mit){</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>               <span class="keywordflow">if</span>(mit->second>maxit->second)</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>                 maxit=mit;</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>             }</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>             <span class="keywordflow">if</span>(occurrence[inBuffer[(dimY-1)/2][x]]<maxit->second)<span class="comment">//</span></div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>               outBuffer[x/down]=maxit->first;</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>             <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>               outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       }</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>         }</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>         <span class="keywordflow">case</span>(filter2d::threshold):{</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>           assert(m_class.size()==m_threshold.size());</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>             outBuffer[x/down]=inBuffer[(dimY-1)/2][x];<span class="comment">//initialize with original value (in case thresholds not met)</span></div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>               <span class="keywordflow">if</span>(100.0*(occurrence[m_class[iclass]])/windowBuffer.size()>m_threshold[iclass])</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>                 outBuffer[x/down]=m_class[iclass];</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>             }</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>           }</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         }</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         <span class="keywordflow">case</span>(filter2d::scramble):{<span class="comment">//could be done more efficiently window by window with random shuffling entire buffer and assigning entire buffer at once to output image...</span></div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>             <span class="keywordtype">int</span> randomIndex=std::rand()%windowBuffer.size();</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>         <span class="keywordflow">if</span>(randomIndex>=windowBuffer.size())</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>           outBuffer[x/down]=windowBuffer.back();</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(randomIndex<0)</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>           outBuffer[x/down]=windowBuffer[0];</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>           outBuffer[x/down]=windowBuffer[randomIndex];</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>           }</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>         }</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>         <span class="keywordflow">case</span>(filter2d::mixed):{</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>           <span class="keyword">enum</span> Type { BF=11, CF=12, MF=13, NF=20, W=30 };</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>           <span class="keywordtype">double</span> nBF=occurrence[BF];</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>           <span class="keywordtype">double</span> nCF=occurrence[CF];</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>           <span class="keywordtype">double</span> nMF=occurrence[MF];</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>           <span class="keywordtype">double</span> nNF=occurrence[NF];</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>           <span class="keywordtype">double</span> nW=occurrence[W];</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>             <span class="keywordflow">if</span>((nBF+nCF+nMF)&&(nBF+nCF+nMF>=nNF+nW)){<span class="comment">//forest</span></div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>               <span class="keywordflow">if</span>(nBF/(nBF+nCF)>=0.75)</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>                 outBuffer[x/down]=BF;</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nCF/(nBF+nCF)>=0.75)</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>                 outBuffer[x/down]=CF;</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>                 outBuffer[x/down]=MF;</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>             }</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>             <span class="keywordflow">else</span>{<span class="comment">//non-forest</span></div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>               <span class="keywordflow">if</span>(nW&&(nW>=nNF))</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>                 outBuffer[x/down]=W;</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>                 outBuffer[x/down]=NF;</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>             }</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>           }</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>         outBuffer[x/down]=inBuffer[indexJ][indexI];</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>         }</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         <span class="keywordflow">default</span>:{</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       std::ostringstream ess;</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>       ess << <span class="stringliteral">"Error: filter method "</span> << method << <span class="stringliteral">" not supported"</span> << std::endl;</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     }</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>         }</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       }</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       progress=(1.0+y/down);</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       progress+=(output.nrOfRow()*iband);</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       progress/=output.nrOfBand()*output.nrOfRow();</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       <span class="comment">//write outBuffer to file</span></div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>         output.writeData(outBuffer,GDT_Float64,y/down,iband);</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       }</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>         <span class="keywordflow">case</span>(filter2d::nvalid):</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       outBuffer[x/down]=stat.nvalid(windowBuffer);</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>         <span class="keywordflow">case</span>(filter2d::median):</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>             outBuffer[x/down]=stat.median(windowBuffer);</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>         <span class="keywordflow">case</span>(filter2d::var):{</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>             outBuffer[x/down]=stat.var(windowBuffer);</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>         }</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>         <span class="keywordflow">case</span>(filter2d::stdev):{</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>             outBuffer[x/down]=sqrt(stat.var(windowBuffer));</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>         }</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>         <span class="keywordflow">case</span>(filter2d::mean):{</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>             outBuffer[x/down]=stat.mean(windowBuffer);</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         }</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         <span class="keywordflow">case</span>(filter2d::min):{</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>            outBuffer[x/down]=stat.mymin(windowBuffer);</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         }</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>         <span class="keywordflow">case</span>(filter2d::ismin):{</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>            <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>             outBuffer[x/down]=(stat.mymin(windowBuffer)==windowBuffer[centre])? 1:0;</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>         }</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>         <span class="keywordflow">case</span>(filter2d::minmax):{<span class="comment">//is the same as homog?</span></div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>           <span class="keywordtype">double</span> min=0;</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           <span class="keywordtype">double</span> max=0;</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>             stat.minmax(windowBuffer,windowBuffer.begin(),windowBuffer.end(),min,max);</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>             <span class="keywordflow">if</span>(min!=max)</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>               outBuffer[x/down]=0;</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>               outBuffer[x/down]=windowBuffer[centre];<span class="comment">//centre pixels</span></div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>           }</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>         }</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>         <span class="keywordflow">case</span>(filter2d::max):{</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>             outBuffer[x/down]=stat.mymax(windowBuffer);</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>         }</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>         <span class="keywordflow">case</span>(filter2d::ismax):{</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>             outBuffer[x/down]=(stat.mymax(windowBuffer)==windowBuffer[centre])? 1:0;</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>         }</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>         <span class="keywordflow">case</span>(filter2d::order):{</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>           <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>             <span class="keywordtype">double</span> lbound=0;</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>             <span class="keywordtype">double</span> ubound=dimX*dimY;</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>             <span class="keywordtype">double</span> theMin=stat.mymin(windowBuffer);</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>             <span class="keywordtype">double</span> theMax=stat.mymax(windowBuffer);</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>             <span class="keywordtype">double</span> scale=(ubound-lbound)/(theMax-theMin);</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>             outBuffer[x/down]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(scale*(windowBuffer[centre]-theMin)+lbound);</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>           }</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>         }</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>         <span class="keywordflow">case</span>(filter2d::sum):{</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>           outBuffer[x/down]=stat.sum(windowBuffer);</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>         }</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     <span class="keywordflow">case</span>(filter2d::percentile):{</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       assert(m_threshold.size());</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       outBuffer[x/down]=stat.percentile(windowBuffer,windowBuffer.begin(),windowBuffer.end(),m_threshold[0]);</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     }</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         <span class="keywordflow">case</span>(filter2d::proportion):{</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>         <span class="keywordtype">double</span> sum=stat.sum(windowBuffer);</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>         <span class="keywordflow">if</span>(sum)</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>           outBuffer[x/down]=100.0*windowBuffer[centre]/stat.sum(windowBuffer);</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>           outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       }</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     }</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         <span class="keywordflow">case</span>(filter2d::homog):</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       <span class="keywordflow">if</span>(occurrence.size()==1)<span class="comment">//all values in window are the same</span></div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>         outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>         <span class="keywordflow">case</span>(filter2d::heterog):{</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       <span class="keywordflow">if</span>(occurrence.size()==windowBuffer.size())</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>         outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       <span class="keywordflow">else</span>      </div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       <span class="comment">// if(occurrence.size()==1)//all values in window are the same</span></div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       <span class="comment">//   outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</span></div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       <span class="comment">// else</span></div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       <span class="comment">//   outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</span></div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>           <span class="comment">// break;</span></div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>           <span class="comment">// for(std::vector<double>::const_iterator wit=windowBuffer.begin();wit!=windowBuffer.end();++wit){</span></div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>           <span class="comment">//   if(wit==windowBuffer.begin()+windowBuffer.size()/2)</span></div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>           <span class="comment">//     continue;</span></div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>           <span class="comment">//   else if(*wit!=inBuffer[(dimY-1)/2][x]){</span></div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>           <span class="comment">//     outBuffer[x/down]=1;</span></div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       <span class="comment">//     break;</span></div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       <span class="comment">//   }</span></div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>           <span class="comment">//   else if(*wit==inBuffer[(dimY-1)/2][x]){//todo:wit mag niet central pixel zijn</span></div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>           <span class="comment">//     outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>           <span class="comment">//     break;</span></div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>           <span class="comment">//   }</span></div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>           <span class="comment">// }</span></div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>           <span class="comment">// break;</span></div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>         }</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>         <span class="keywordflow">case</span>(filter2d::density):{</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>         std::vector<short>::const_iterator vit=m_class.begin();</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>         <span class="keywordflow">while</span>(vit!=m_class.end())</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>           outBuffer[x/down]+=100.0*occurrence[*(vit++)]/windowBuffer.size();</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       }</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     }</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>         <span class="keywordflow">case</span>(filter2d::countid):{</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       <span class="keywordflow">if</span>(windowBuffer.size())</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>         outBuffer[x/down]=occurrence.size();</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     }</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>         <span class="keywordflow">case</span>(filter2d::mode):{</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordflow">if</span>(occurrence.size()){</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>             std::map<long int,int>::const_iterator maxit=occurrence.begin();</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>             <span class="keywordflow">for</span>(std::map<long int,int>::const_iterator mit=occurrence.begin();mit!=occurrence.end();++mit){</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>               <span class="keywordflow">if</span>(mit->second>maxit->second)</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>                 maxit=mit;</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>             }</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>             <span class="keywordflow">if</span>(occurrence[inBuffer[(dimY-1)/2][x]]<maxit->second)<span class="comment">//</span></div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>               outBuffer[x/down]=maxit->first;</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>             <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>               outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       }</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>         }</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>         <span class="keywordflow">case</span>(filter2d::threshold):{</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>           assert(m_class.size()==m_threshold.size());</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>             outBuffer[x/down]=inBuffer[(dimY-1)/2][x];<span class="comment">//initialize with original value (in case thresholds not met)</span></div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>               <span class="keywordflow">if</span>(100.0*(occurrence[m_class[iclass]])/windowBuffer.size()>m_threshold[iclass])</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>                 outBuffer[x/down]=m_class[iclass];</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>             }</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>           }</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>         }</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>         <span class="keywordflow">case</span>(filter2d::scramble):{<span class="comment">//could be done more efficiently window by window with random shuffling entire buffer and assigning entire buffer at once to output image...</span></div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>             <span class="keywordtype">int</span> randomIndex=std::rand()%windowBuffer.size();</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>         <span class="keywordflow">if</span>(randomIndex>=windowBuffer.size())</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>           outBuffer[x/down]=windowBuffer.back();</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(randomIndex<0)</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>           outBuffer[x/down]=windowBuffer[0];</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>           outBuffer[x/down]=windowBuffer[randomIndex];</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>           }</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>         }</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>         <span class="keywordflow">case</span>(filter2d::mixed):{</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>           <span class="keyword">enum</span> Type { BF=11, CF=12, MF=13, NF=20, W=30 };</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>           <span class="keywordtype">double</span> nBF=occurrence[BF];</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>           <span class="keywordtype">double</span> nCF=occurrence[CF];</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>           <span class="keywordtype">double</span> nMF=occurrence[MF];</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>           <span class="keywordtype">double</span> nNF=occurrence[NF];</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>           <span class="keywordtype">double</span> nW=occurrence[W];</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>             <span class="keywordflow">if</span>((nBF+nCF+nMF)&&(nBF+nCF+nMF>=nNF+nW)){<span class="comment">//forest</span></div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>               <span class="keywordflow">if</span>(nBF/(nBF+nCF)>=0.75)</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>                 outBuffer[x/down]=BF;</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nCF/(nBF+nCF)>=0.75)</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>                 outBuffer[x/down]=CF;</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>                 outBuffer[x/down]=MF;</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>             }</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>             <span class="keywordflow">else</span>{<span class="comment">//non-forest</span></div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>               <span class="keywordflow">if</span>(nW&&(nW>=nNF))</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>                 outBuffer[x/down]=W;</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>                 outBuffer[x/down]=NF;</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>             }</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>           }</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         outBuffer[x/down]=inBuffer[indexJ][indexI];</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>         }</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>         <span class="keywordflow">default</span>:{</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       std::ostringstream ess;</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>       ess << <span class="stringliteral">"Error: filter method "</span> << method << <span class="stringliteral">" not supported"</span> << std::endl;</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     }</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>         }</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       }</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       progress=(1.0+y/down);</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       progress+=(output.nrOfRow()*iband);</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       progress/=output.nrOfBand()*output.nrOfRow();</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       <span class="comment">//write outBuffer to file</span></div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>         output.writeData(outBuffer,GDT_Float64,y/down,iband);</div>
 <div class="line"><a name="l00695"></a><span class="lineno">  695</span>       }</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     }</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>   }</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>   pfnProgress(1.0,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span> }</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span> </div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span> <span class="keywordtype">void</span> filter2d::Filter2d::mrf(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <span class="keywordtype">double</span> beta, <span class="keywordtype">bool [...]
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>   assert(m_class.size()>1);</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> fullBeta(m_class.size(),m_class.size());</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1)</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<m_class.size();++iclass2)</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       fullBeta[iclass1][iclass2]=beta;</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   mrf(input,output,dimX,dimY,fullBeta,eightConnectivity,down,verbose);</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span> }</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span> </div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span> <span class="comment">//beta[classTo][classFrom]</span></div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span> <span class="keywordtype">void</span> filter2d::Filter2d::mrf(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <a class="code" href="classVector2d.html">Vector2d<double></a> beta, < [...]
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span> {</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span> </div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>   assert(dimX);</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>   assert(dimY);</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       }</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     }</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>   }</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>   pfnProgress(1.0,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span> }</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span> </div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span> <span class="keywordtype">void</span> filter2d::Filter2d::mrf(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <span class="keywordtype">double</span> beta, <span class="keywordtype">bool [...]
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>   assert(m_class.size()>1);</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> fullBeta(m_class.size(),m_class.size());</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1)</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<m_class.size();++iclass2)</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       fullBeta[iclass1][iclass2]=beta;</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>   mrf(input,output,dimX,dimY,fullBeta,eightConnectivity,down,verbose);</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span> }</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span> </div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span> <span class="comment">//beta[classTo][classFrom]</span></div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span> <span class="keywordtype">void</span> filter2d::Filter2d::mrf(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <a class="code" href="classVector2d.html">Vector2d<double></a> beta, < [...]
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span> {</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
 <div class="line"><a name="l00721"></a><span class="lineno">  721</span> </div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>   <a class="code" href="classVector2d.html">Vector2d<short></a> inBuffer(dimY,input.nrOfCol());</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> outBuffer(m_class.size(),(input.nrOfCol()+down-1)/down);</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>   assert(input.nrOfBand()==1);</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>   assert(output.nrOfBand()==m_class.size());</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>   assert(m_class.size()>1);</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>   assert(beta.size()==m_class.size());</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>   <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       input.readData(inBuffer[indexJ],GDT_Int16,abs(j));</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     }</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       std::cerr << errorstring << <span class="stringliteral">"in line "</span> << indexJ << std::endl;</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>   assert(dimX);</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>   assert(dimY);</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span> </div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>   <a class="code" href="classVector2d.html">Vector2d<short></a> inBuffer(dimY,input.nrOfCol());</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> outBuffer(m_class.size(),(input.nrOfCol()+down-1)/down);</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>   assert(input.nrOfBand()==1);</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   assert(output.nrOfBand()==m_class.size());</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   assert(m_class.size()>1);</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>   assert(beta.size()==m_class.size());</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>   <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       input.readData(inBuffer[indexJ],GDT_Int16,abs(j));</div>
 <div class="line"><a name="l00737"></a><span class="lineno">  737</span>     }</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>     ++indexJ;</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>   }</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>       <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>       <span class="keywordflow">if</span>(dimY>1)</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>       <span class="keywordflow">if</span>(y+dimY/2<input.nrOfRow()){</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>     <span class="keywordflow">if</span>(dimY>1)</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       inBuffer.push_back(inBuffer.back());</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>           input.readData(inBuffer[inBuffer.size()-1],GDT_Int16,y+dimY/2);</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>         }</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>         <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>           std::cerr << errorstring << <span class="stringliteral">"in line "</span> << y << std::endl;</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>     <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>       std::cerr << errorstring << <span class="stringliteral">"in line "</span> << indexJ << std::endl;</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>     }</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     ++indexJ;</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>   }</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>       <span class="keywordflow">if</span>(dimY>1)</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       <span class="keywordflow">if</span>(y+dimY/2<input.nrOfRow()){</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>     <span class="keywordflow">if</span>(dimY>1)</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       inBuffer.push_back(inBuffer.back());</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>           input.readData(inBuffer[inBuffer.size()-1],GDT_Int16,y+dimY/2);</div>
 <div class="line"><a name="l00755"></a><span class="lineno">  755</span>         }</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       }</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>         <span class="keywordtype">int</span> over=y+dimY/2-input.nrOfRow();</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>         assert(index>=0);</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>         assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       }</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>     }</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>     <span class="keywordflow">if</span>((y+1+down/2)%down)</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>       <span class="keywordflow">if</span>((x+1+down/2)%down)</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       std::vector<short> potential(m_class.size());</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         potential[iclass]=0;</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>         outBuffer[iclass][x/down]=0;</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       }</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>       std::vector<double> windowBuffer;</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>       <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>           <span class="keywordflow">if</span>(i!=0&&j!=0&&!eightConnectivity)</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>           <span class="keywordflow">if</span>(i==0&&j==0)</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>           indexI=x+i;</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>           <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>           <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>             indexI=-indexI;</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nrOfCol())</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>             indexI=input.nrOfCol()-i;</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>           <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>             indexJ=-j;</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nrOfRow())</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>             indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>             indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>           <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>               masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>             }</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>           }</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>           <span class="keywordflow">if</span>(!masked){</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>               <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass])</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>                 potential[iclass]+=1;</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>             }</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>           }</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>         }</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       }</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       <span class="keywordtype">double</span> norm=0;</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1){</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     assert(beta[iclass1].size()==m_class.size());</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>         <span class="keywordtype">double</span> pot=0;</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<m_class.size();++iclass2)</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       <span class="keywordflow">if</span>(iclass2!=iclass1)</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>         pot+=potential[iclass2]*beta[iclass1][iclass2];</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>         <span class="keywordtype">double</span> prior=exp(-pot);</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>         outBuffer[iclass1][x/down]=prior;</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         norm+=prior;</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       }</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       <span class="keywordflow">if</span>(norm){</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1)</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>           outBuffer[iclass1][x/down]/=norm;</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       }</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     }</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     progress=(1.0+y/down)/output.nrOfRow();</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     <span class="comment">//write outBuffer to file</span></div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>     assert(outBuffer.size()==m_class.size());</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     assert(y<output.nrOfRow());</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       assert(outBuffer[iclass].size()==output.nrOfCol());</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         output.writeData(outBuffer[iclass],GDT_Float64,y/down,iclass);</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       }</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         std::cerr << errorstring << <span class="stringliteral">"in class "</span> << iclass << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>         <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>           std::cerr << errorstring << <span class="stringliteral">"in line "</span> << y << std::endl;</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>         }</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       }</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>         <span class="keywordtype">int</span> over=y+dimY/2-input.nrOfRow();</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>         assert(index>=0);</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>         assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>         inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       }</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     }</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     <span class="keywordflow">if</span>((y+1+down/2)%down)</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       <span class="keywordflow">if</span>((x+1+down/2)%down)</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       std::vector<short> potential(m_class.size());</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>         potential[iclass]=0;</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>         outBuffer[iclass][x/down]=0;</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>       }</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>       std::vector<double> windowBuffer;</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>           <span class="keywordflow">if</span>(i!=0&&j!=0&&!eightConnectivity)</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>           <span class="keywordflow">if</span>(i==0&&j==0)</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>           indexI=x+i;</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>           <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>           <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>             indexI=-indexI;</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nrOfCol())</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>             indexI=input.nrOfCol()-i;</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>           <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>             indexJ=-j;</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nrOfRow())</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>             indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>             indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>           <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>               masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>             }</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>           }</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>           <span class="keywordflow">if</span>(!masked){</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>               <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass])</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>                 potential[iclass]+=1;</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>             }</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>           }</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>         }</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       }</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       <span class="keywordtype">double</span> norm=0;</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1){</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     assert(beta[iclass1].size()==m_class.size());</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>         <span class="keywordtype">double</span> pot=0;</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<m_class.size();++iclass2)</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       <span class="keywordflow">if</span>(iclass2!=iclass1)</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         pot+=potential[iclass2]*beta[iclass1][iclass2];</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         <span class="keywordtype">double</span> prior=exp(-pot);</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>         outBuffer[iclass1][x/down]=prior;</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         norm+=prior;</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>       }</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       <span class="keywordflow">if</span>(norm){</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1)</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>           outBuffer[iclass1][x/down]/=norm;</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       }</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     }</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>     progress=(1.0+y/down)/output.nrOfRow();</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>     <span class="comment">//write outBuffer to file</span></div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     assert(outBuffer.size()==m_class.size());</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>     assert(y<output.nrOfRow());</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       assert(outBuffer[iclass].size()==output.nrOfCol());</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         output.writeData(outBuffer[iclass],GDT_Float64,y/down,iclass);</div>
 <div class="line"><a name="l00838"></a><span class="lineno">  838</span>       }</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     }</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>   }</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span> }</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span> </div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span> <span class="keywordtype">void</span> filter2d::Filter2d::shift(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">double</span> offsetX, <span class="keywordtype">double</span> offsetY, <span class="keywordtype">double</span> randomSigma, RESAMPLE  [...]
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span> {</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>   assert(input.nrOfCol()==output.nrOfCol());</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>   assert(input.nrOfRow()==output.nrOfRow());</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>   assert(input.nrOfBand()==output.nrOfBand());</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>   <span class="comment">//process band per band in memory</span></div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> inBuffer(input.nrOfRow(),output.nrOfCol());</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> outBuffer(input.nrOfRow(),output.nrOfCol());</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>     input.readDataBlock(inBuffer,GDT_Float64,0,inBuffer.nCols()-1,0,inBuffer.nRows()-1,iband);</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>     shift(inBuffer,outBuffer,offsetX,offsetY,randomSigma,resample,verbose);</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     output.writeDataBlock(outBuffer,GDT_Float64,0,outBuffer.nCols()-1,0,outBuffer.nRows()-1,iband);</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>   }</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span> }</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span> </div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span> <span class="comment">//todo: re-implement without dependency of CImg and reg libraries</span></div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span> <span class="comment">// void filter2d::Filter2d::dwt_texture(const std::string& inputFilename, const std::string& outputFilename,int dim, int scale, int down, int iband, bool verbose)</span></div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span> <span class="comment">//   ImgReaderGdal input;</span></div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span> <span class="comment">//   ImgWriterGdal output;</span></div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span> <span class="comment">//   if(verbose)</span></div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span> <span class="comment">//     std::cout << "opening file " << inputFilename << std::endl;</span></div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span> <span class="comment">//   input.open(inputFilename);</span></div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span> <span class="comment">//   double magicX=1,magicY=1;</span></div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span> <span class="comment">//   output.open(outputFilename,(input.nrOfCol()+down-1)/down,(input.nrOfRow()+down-1)/down,scale*3,GDT_Float32,input.getImageType());</span></div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span> <span class="comment">//   if(input.isGeoRef()){</span></div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span> <span class="comment">//     output.setProjection(input.getProjection());</span></div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span> <span class="comment">//     output.copyGeoTransform(input);</span></div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span> <span class="comment">//   if(verbose)</span></div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span> <span class="comment">//     std::cout << "Dimension texture (row x col x band) = " << (input.nrOfCol()+down-1)/down << " x " << (input.nrOfRow()+down-1)/down << " x " << scale*3 << std::endl;</span></div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span> <span class="comment">//   assert(dim%2);</span></div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span> <span class="comment">//   int dimX=dim;</span></div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span> <span class="comment">//   int dimY=dim;</span></div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span> <span class="comment">//   Vector2d<float> inBuffer(dimY,input.nrOfCol());</span></div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span> <span class="comment">//   Vector2d<float> outBuffer(scale*3,(input.nrOfCol()+down-1)/down);</span></div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span> <span class="comment">//   //initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span> <span class="comment">//   int indexI=0;</span></div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span> <span class="comment">//   int indexJ=0;</span></div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span> <span class="comment">//   for(int j=-dimY/2;j<(dimY+1)/2;++j){</span></div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span> <span class="comment">//     try{</span></div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span> <span class="comment">//       if(verbose)</span></div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span> <span class="comment">//  cout << "reading input line " << abs(j) << std::endl;</span></div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span> <span class="comment">//       input.readData(inBuffer[indexJ],GDT_Float32,abs(j),iband);</span></div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span> <span class="comment">//       ++indexJ;</span></div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span> <span class="comment">//     catch(std::string errorstring){</span></div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span> <span class="comment">//       std::cerr << errorstring << "in band " << iband << ", line " << indexJ << std::endl;</span></div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>         std::cerr << errorstring << <span class="stringliteral">"in class "</span> << iclass << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       }</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     }</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>   }</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span> }</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span> </div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span> <span class="keywordtype">void</span> filter2d::Filter2d::shift(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">double</span> offsetX, <span class="keywordtype">double</span> offsetY, <span class="keywordtype">double</span> randomSigma, RESAMPLE  [...]
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span> {</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>   assert(input.nrOfCol()==output.nrOfCol());</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>   assert(input.nrOfRow()==output.nrOfRow());</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>   assert(input.nrOfBand()==output.nrOfBand());</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>   <span class="comment">//process band per band in memory</span></div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> inBuffer(input.nrOfRow(),output.nrOfCol());</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> outBuffer(input.nrOfRow(),output.nrOfCol());</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>     input.readDataBlock(inBuffer,GDT_Float64,0,inBuffer.nCols()-1,0,inBuffer.nRows()-1,iband);</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>     shift(inBuffer,outBuffer,offsetX,offsetY,randomSigma,resample,verbose);</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>     output.writeDataBlock(outBuffer,GDT_Float64,0,outBuffer.nCols()-1,0,outBuffer.nRows()-1,iband);</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>   }</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span> }</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span> </div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span> <span class="comment">//todo: re-implement without dependency of CImg and reg libraries</span></div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span> <span class="comment">// void filter2d::Filter2d::dwt_texture(const std::string& inputFilename, const std::string& outputFilename,int dim, int scale, int down, int iband, bool verbose)</span></div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span> <span class="comment">//   ImgReaderGdal input;</span></div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span> <span class="comment">//   ImgWriterGdal output;</span></div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span> <span class="comment">//   if(verbose)</span></div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span> <span class="comment">//     std::cout << "opening file " << inputFilename << std::endl;</span></div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span> <span class="comment">//   input.open(inputFilename);</span></div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span> <span class="comment">//   double magicX=1,magicY=1;</span></div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span> <span class="comment">//   output.open(outputFilename,(input.nrOfCol()+down-1)/down,(input.nrOfRow()+down-1)/down,scale*3,GDT_Float32,input.getImageType());</span></div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span> <span class="comment">//   if(input.isGeoRef()){</span></div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span> <span class="comment">//     output.setProjection(input.getProjection());</span></div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span> <span class="comment">//     output.copyGeoTransform(input);</span></div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span> <span class="comment">//   if(verbose)</span></div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span> <span class="comment">//     std::cout << "Dimension texture (row x col x band) = " << (input.nrOfCol()+down-1)/down << " x " << (input.nrOfRow()+down-1)/down << " x " << scale*3 << std::endl;</span></div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span> <span class="comment">//   assert(dim%2);</span></div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span> <span class="comment">//   int dimX=dim;</span></div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span> <span class="comment">//   int dimY=dim;</span></div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span> <span class="comment">//   Vector2d<float> inBuffer(dimY,input.nrOfCol());</span></div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span> <span class="comment">//   Vector2d<float> outBuffer(scale*3,(input.nrOfCol()+down-1)/down);</span></div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span> <span class="comment">//   //initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span> <span class="comment">//   int indexI=0;</span></div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span> <span class="comment">//   int indexJ=0;</span></div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span> <span class="comment">//   for(int j=-dimY/2;j<(dimY+1)/2;++j){</span></div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span> <span class="comment">//     try{</span></div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span> <span class="comment">//       if(verbose)</span></div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span> <span class="comment">//  cout << "reading input line " << abs(j) << std::endl;</span></div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span> <span class="comment">//       input.readData(inBuffer[indexJ],GDT_Float32,abs(j),iband);</span></div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span> <span class="comment">//       ++indexJ;</span></div>
 <div class="line"><a name="l00896"></a><span class="lineno">  896</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span> <span class="comment">//   const char* pszMessage;</span></div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span> <span class="comment">//   void* pProgressArg=NULL;</span></div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span> <span class="comment">//   GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span> <span class="comment">//   double progress=0;</span></div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span> <span class="comment">//   pfnProgress(progress,pszMessage,pProgressArg);</span></div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span> <span class="comment">//   for(int y=0;y<input.nrOfRow();y+=down){</span></div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span> <span class="comment">//     if(verbose)</span></div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span> <span class="comment">//       std::cout << "calculating line " << y/down << std::endl;</span></div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span> <span class="comment">//     if(y){//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span> <span class="comment">//       //erase first line from inBuffer</span></div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span> <span class="comment">//       inBuffer.erase(inBuffer.begin());</span></div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span> <span class="comment">//       //read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span> <span class="comment">//       if(y+dimY/2<input.nrOfRow()){</span></div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span> <span class="comment">//  //allocate buffer</span></div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span> <span class="comment">//  inBuffer.push_back(inBuffer.back());</span></div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span> <span class="comment">//  try{</span></div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span> <span class="comment">//    if(verbose)</span></div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span> <span class="comment">//      std::cout << "reading input line " << y+dimY/2 << std::endl;</span></div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span> <span class="comment">//           input.readData(inBuffer[inBuffer.size()-1],GDT_Float32,y+dimY/2,iband);</span></div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span> <span class="comment">//  }</span></div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span> <span class="comment">//  catch(std::string errorstring){</span></div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span> <span class="comment">//    std::cerr << errorstring << "in band " << iband << ", line " << y << std::endl;</span></div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span> <span class="comment">//     catch(std::string errorstring){</span></div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span> <span class="comment">//       std::cerr << errorstring << "in band " << iband << ", line " << indexJ << std::endl;</span></div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span> <span class="comment">//   const char* pszMessage;</span></div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span> <span class="comment">//   void* pProgressArg=NULL;</span></div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span> <span class="comment">//   GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span> <span class="comment">//   double progress=0;</span></div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span> <span class="comment">//   pfnProgress(progress,pszMessage,pProgressArg);</span></div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span> <span class="comment">//   for(int y=0;y<input.nrOfRow();y+=down){</span></div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span> <span class="comment">//     if(verbose)</span></div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span> <span class="comment">//       std::cout << "calculating line " << y/down << std::endl;</span></div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span> <span class="comment">//     if(y){//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span> <span class="comment">//       //erase first line from inBuffer</span></div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span> <span class="comment">//       inBuffer.erase(inBuffer.begin());</span></div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span> <span class="comment">//       //read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span> <span class="comment">//       if(y+dimY/2<input.nrOfRow()){</span></div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span> <span class="comment">//  //allocate buffer</span></div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span> <span class="comment">//  inBuffer.push_back(inBuffer.back());</span></div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span> <span class="comment">//  try{</span></div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span> <span class="comment">//    if(verbose)</span></div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span> <span class="comment">//      std::cout << "reading input line " << y+dimY/2 << std::endl;</span></div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span> <span class="comment">//           input.readData(inBuffer[inBuffer.size()-1],GDT_Float32,y+dimY/2,iband);</span></div>
 <div class="line"><a name="l00920"></a><span class="lineno">  920</span> <span class="comment">//  }</span></div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span> <span class="comment">//       }</span></div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span> <span class="comment">//     for(int x=0;x<input.nrOfCol();x+=down){</span></div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span> <span class="comment">//       Vector2d<double> texture_feature(scale,3);</span></div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span> <span class="comment">//       CImg<> texture_in(dimX,dimY);</span></div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span> <span class="comment">//       int r=0;//index for row of texture_in</span></div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span> <span class="comment">//       for(int j=-dimY/2;j<(dimY+1)/2;++j){</span></div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span> <span class="comment">//  int c=0;</span></div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span> <span class="comment">//  for(int i=-dimX/2;i<(dimX+1)/2;++i){</span></div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span> <span class="comment">//    indexI=x+i;</span></div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span> <span class="comment">//    //check if out of bounds</span></div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span> <span class="comment">//    if(indexI<0)</span></div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span> <span class="comment">//      indexI=-indexI;</span></div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span> <span class="comment">//    else if(indexI>=input.nrOfCol())</span></div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span> <span class="comment">//      indexI=input.nrOfCol()-i;</span></div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span> <span class="comment">//    if(y+j<0)</span></div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span> <span class="comment">//      indexJ=-j;</span></div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span> <span class="comment">//    else if(y+j>=input.nrOfRow())</span></div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span> <span class="comment">//      indexJ=dimY/2-j;//indexJ=inBuffer.size()-1-j;</span></div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span> <span class="comment">//    else</span></div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span> <span class="comment">//      indexJ=dimY/2+j;</span></div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span> <span class="comment">//    assert(indexJ<inBuffer.size());</span></div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span> <span class="comment">//    assert(indexI<inBuffer[indexJ].size());</span></div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span> <span class="comment">//    texture_in(r,c)=inBuffer[indexJ][indexI];</span></div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span> <span class="comment">//    c++;</span></div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span> <span class="comment">//  }</span></div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span> <span class="comment">//  ++r;</span></div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span> <span class="comment">//       }</span></div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span> <span class="comment">//       texture_in.dwt_texture(texture_feature,scale);</span></div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span> <span class="comment">//       for(int v=0;v<scale*3;++v)</span></div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span> <span class="comment">//  outBuffer[v][x/down]=texture_feature[v/3][v%3];</span></div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span> <span class="comment">//     //write outBuffer to file</span></div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span> <span class="comment">//     try{</span></div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span> <span class="comment">//       if(verbose)</span></div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span> <span class="comment">//         std::cout << "writing line " << y/down << std::endl;</span></div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span> <span class="comment">//       for(int v=0;v<scale*3;++v)</span></div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span> <span class="comment">//         output.writeData(outBuffer[v],GDT_Float32,y/down,v);</span></div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span> <span class="comment">//     catch(std::string errorstring){</span></div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span> <span class="comment">//       std::cerr << errorstring << "in band " << iband << ", line " << y << std::endl;</span></div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span> <span class="comment">//  catch(std::string errorstring){</span></div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span> <span class="comment">//    std::cerr << errorstring << "in band " << iband << ", line " << y << std::endl;</span></div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span> <span class="comment">//  }</span></div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span> <span class="comment">//       }</span></div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span> <span class="comment">//     for(int x=0;x<input.nrOfCol();x+=down){</span></div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span> <span class="comment">//       Vector2d<double> texture_feature(scale,3);</span></div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span> <span class="comment">//       CImg<> texture_in(dimX,dimY);</span></div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span> <span class="comment">//       int r=0;//index for row of texture_in</span></div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span> <span class="comment">//       for(int j=-dimY/2;j<(dimY+1)/2;++j){</span></div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span> <span class="comment">//  int c=0;</span></div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span> <span class="comment">//  for(int i=-dimX/2;i<(dimX+1)/2;++i){</span></div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span> <span class="comment">//    indexI=x+i;</span></div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span> <span class="comment">//    //check if out of bounds</span></div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span> <span class="comment">//    if(indexI<0)</span></div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span> <span class="comment">//      indexI=-indexI;</span></div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span> <span class="comment">//    else if(indexI>=input.nrOfCol())</span></div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span> <span class="comment">//      indexI=input.nrOfCol()-i;</span></div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span> <span class="comment">//    if(y+j<0)</span></div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span> <span class="comment">//      indexJ=-j;</span></div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span> <span class="comment">//    else if(y+j>=input.nrOfRow())</span></div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span> <span class="comment">//      indexJ=dimY/2-j;//indexJ=inBuffer.size()-1-j;</span></div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span> <span class="comment">//    else</span></div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span> <span class="comment">//      indexJ=dimY/2+j;</span></div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span> <span class="comment">//    assert(indexJ<inBuffer.size());</span></div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span> <span class="comment">//    assert(indexI<inBuffer[indexJ].size());</span></div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span> <span class="comment">//    texture_in(r,c)=inBuffer[indexJ][indexI];</span></div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span> <span class="comment">//    c++;</span></div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span> <span class="comment">//  }</span></div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span> <span class="comment">//  ++r;</span></div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span> <span class="comment">//       }</span></div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span> <span class="comment">//       texture_in.dwt_texture(texture_feature,scale);</span></div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span> <span class="comment">//       for(int v=0;v<scale*3;++v)</span></div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span> <span class="comment">//  outBuffer[v][x/down]=texture_feature[v/3][v%3];</span></div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span> <span class="comment">//     //write outBuffer to file</span></div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span> <span class="comment">//     try{</span></div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span> <span class="comment">//       if(verbose)</span></div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span> <span class="comment">//         std::cout << "writing line " << y/down << std::endl;</span></div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span> <span class="comment">//       for(int v=0;v<scale*3;++v)</span></div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span> <span class="comment">//         output.writeData(outBuffer[v],GDT_Float32,y/down,v);</span></div>
 <div class="line"><a name="l00962"></a><span class="lineno">  962</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span> <span class="comment">//     progress=(1.0+y)/output.nrOfRow();</span></div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span> <span class="comment">//     pfnProgress(progress,pszMessage,pProgressArg);</span></div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span> <span class="comment">//   input.close();</span></div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span> <span class="comment">//   output.close();</span></div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span> </div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span> <span class="keywordtype">void</span> filter2d::Filter2d::morphology(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <span cla [...]
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span> {</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span> </div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>   assert(dimX);</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>   assert(dimY);</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span> <span class="comment">//     catch(std::string errorstring){</span></div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span> <span class="comment">//       std::cerr << errorstring << "in band " << iband << ", line " << y << std::endl;</span></div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span> <span class="comment">//     progress=(1.0+y)/output.nrOfRow();</span></div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span> <span class="comment">//     pfnProgress(progress,pszMessage,pProgressArg);</span></div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span> <span class="comment">//   input.close();</span></div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span> <span class="comment">//   output.close();</span></div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span> </div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span> <span class="keywordtype">void</span> filter2d::Filter2d::morphology(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <span cla [...]
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span> {</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
 <div class="line"><a name="l00980"></a><span class="lineno">  980</span> </div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> inBuffer(dimY,input.nrOfCol());</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>     std::vector<double> outBuffer(input.nrOfCol());</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>     <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>     <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>     <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>     input.readData(inBuffer[indexJ],GDT_Float64,abs(j),iband);</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     ++indexJ;</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>       }</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>     std::cerr << errorstring << <span class="stringliteral">"in line "</span> << indexJ << std::endl;</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>   assert(dimX);</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>   assert(dimY);</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span> </div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> inBuffer(dimY,input.nrOfCol());</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>     std::vector<double> outBuffer(input.nrOfCol());</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>     <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>     <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>     <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     input.readData(inBuffer[indexJ],GDT_Float64,abs(j),iband);</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>     ++indexJ;</div>
 <div class="line"><a name="l00995"></a><span class="lineno">  995</span>       }</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>     }</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>       <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>     <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>     <span class="keywordflow">if</span>(dimY>1)</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>     <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     <span class="keywordflow">if</span>(y+dimY/2<input.nrOfRow()){</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>       <span class="keywordflow">if</span>(dimY>1)</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         inBuffer.push_back(inBuffer.back());</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>             input.readData(inBuffer[inBuffer.size()-1],GDT_Float64,y+dimY/2,iband);</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       }</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>     std::cerr << errorstring << <span class="stringliteral">"in line "</span> << indexJ << std::endl;</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>       }</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>     }</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>     <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     <span class="keywordflow">if</span>(dimY>1)</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>     <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>     <span class="keywordflow">if</span>(y+dimY/2<input.nrOfRow()){</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>       <span class="keywordflow">if</span>(dimY>1)</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>         inBuffer.push_back(inBuffer.back());</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>             input.readData(inBuffer[inBuffer.size()-1],GDT_Float64,y+dimY/2,iband);</div>
 <div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>       }</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>     }</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>           <span class="keywordtype">int</span> over=y+dimY/2-input.nrOfRow();</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>           <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>           assert(index>=0);</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>           assert(index<inBuffer.size());</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>           inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         }</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>       }</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         <span class="keywordtype">double</span> currentValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>     outBuffer[x]=currentValue;</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     std::vector<double> statBuffer;</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>     <span class="keywordtype">bool</span> currentMasked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>         <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>       <span class="keywordflow">if</span>(currentValue==m_noDataValues[imask]){</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         currentMasked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>       }</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>     }</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>     <span class="keywordflow">if</span>(currentMasked){</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>       outBuffer[x]=currentValue;</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>         std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       }</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>     }</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>           <span class="keywordtype">int</span> over=y+dimY/2-input.nrOfRow();</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>           <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>           assert(index>=0);</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>           assert(index<inBuffer.size());</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>           inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         }</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>       }</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>         <span class="keywordtype">double</span> currentValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>     outBuffer[x]=currentValue;</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>     std::vector<double> statBuffer;</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     <span class="keywordtype">bool</span> currentMasked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>       <span class="keywordflow">if</span>(currentValue==m_noDataValues[imask]){</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>         currentMasked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>       }</div>
 <div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     }</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>               <span class="keywordtype">double</span> d2=i*i+j*j;<span class="comment">//square distance</span></div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>               <span class="keywordflow">if</span>(disc&&(d2>(dimX/2)*(dimY/2)))</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>                 <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           <span class="keywordflow">if</span>(angle.size()){</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>             <span class="keywordtype">double</span> theta;</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>         <span class="comment">//use polar coordinates in radians</span></div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>             <span class="keywordflow">if</span>(i>0){</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           <span class="keywordflow">if</span>(j<0)</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>             theta=atan(static_cast<double>(-j)/(static_cast<double>(i)));</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>             theta=-atan(static_cast<double>(j)/(static_cast<double>(i)));</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>         }</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(i<0){</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>           <span class="keywordflow">if</span>(j<0)</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>             theta=PI-atan(static_cast<double>(-j)/(static_cast<double>(-i)));</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>             theta=PI+atan(static_cast<double>(j)/(static_cast<double>(-i)));</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>         }</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(j<0)</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>               theta=PI/2.0;</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(j>0)</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>               theta=3.0*PI/2.0;</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>         <span class="comment">//convert to North (0), East (90), South (180), West (270) in degrees</span></div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>         theta=360-(theta/PI*180)+90;</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>         <span class="keywordflow">if</span>(theta<0)</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>           theta+=360;</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>         <span class="keywordflow">while</span>(theta>360)</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>           theta-=360;</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>         <span class="keywordtype">bool</span> alligned=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iangle=0;iangle<angle.size();++iangle){</div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>           <span class="keywordflow">if</span>(sqrt((theta-angle[iangle])*(theta-angle[iangle]))<10){</div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>             alligned=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>           }</div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>         }</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>         <span class="keywordflow">if</span>(!alligned)</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>           }</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>           indexI=x+i;</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>           <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>           <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>         indexI=-indexI;</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nrOfCol())</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>         indexI=input.nrOfCol()-i;</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>           <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>         indexJ=-j;</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nrOfRow())</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>                 indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>                 indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>               <span class="comment">//todo: introduce novalue as this: ?</span></div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>               <span class="comment">// if(inBuffer[indexJ][indexI]==(m_noDataValues.size())? m_noDataValues[0] : 0)</span></div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>               <span class="comment">//   continue;</span></div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>               <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>         <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         }</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>           }</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>           <span class="keywordflow">if</span>(!masked){</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>         <span class="keywordtype">short</span> binValue=0;</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>           <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass]){</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>             binValue=1;</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>           }</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         }</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         <span class="keywordflow">if</span>(m_class.size())</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>           statBuffer.push_back(binValue);</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>           statBuffer.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>           }</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         }</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>           }</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       <span class="keywordflow">if</span>(statBuffer.size()){</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>             <span class="keywordflow">switch</span>(getFilterType(method)){</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>             <span class="keywordflow">case</span>(filter2d::dilate):</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>               outBuffer[x]=stat.mymax(statBuffer);</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>             <span class="keywordflow">case</span>(filter2d::erode):</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>               outBuffer[x]=stat.mymin(statBuffer);</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>     <span class="keywordflow">if</span>(currentMasked){</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>       outBuffer[x]=currentValue;</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>     }</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>               <span class="keywordtype">double</span> d2=i*i+j*j;<span class="comment">//square distance</span></div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>               <span class="keywordflow">if</span>(disc&&(d2>(dimX/2)*(dimY/2)))</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>                 <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>           <span class="keywordflow">if</span>(angle.size()){</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>             <span class="keywordtype">double</span> theta;</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>         <span class="comment">//use polar coordinates in radians</span></div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>             <span class="keywordflow">if</span>(i>0){</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>           <span class="keywordflow">if</span>(j<0)</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>             theta=atan(static_cast<double>(-j)/(static_cast<double>(i)));</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>             theta=-atan(static_cast<double>(j)/(static_cast<double>(i)));</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>         }</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(i<0){</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>           <span class="keywordflow">if</span>(j<0)</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>             theta=PI-atan(static_cast<double>(-j)/(static_cast<double>(-i)));</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>             theta=PI+atan(static_cast<double>(j)/(static_cast<double>(-i)));</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>         }</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(j<0)</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>               theta=PI/2.0;</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(j>0)</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>               theta=3.0*PI/2.0;</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>         <span class="comment">//convert to North (0), East (90), South (180), West (270) in degrees</span></div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>         theta=360-(theta/PI*180)+90;</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>         <span class="keywordflow">if</span>(theta<0)</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>           theta+=360;</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>         <span class="keywordflow">while</span>(theta>360)</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>           theta-=360;</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>         <span class="keywordtype">bool</span> alligned=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iangle=0;iangle<angle.size();++iangle){</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>           <span class="keywordflow">if</span>(sqrt((theta-angle[iangle])*(theta-angle[iangle]))<10){</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>             alligned=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>           }</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>         }</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>         <span class="keywordflow">if</span>(!alligned)</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>           }</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>           indexI=x+i;</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>           <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>           <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>         indexI=-indexI;</div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nrOfCol())</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>         indexI=input.nrOfCol()-i;</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>           <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>         indexJ=-j;</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nrOfRow())</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>                 indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>                 indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>               <span class="comment">//todo: introduce novalue as this: ?</span></div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>               <span class="comment">// if(inBuffer[indexJ][indexI]==(m_noDataValues.size())? m_noDataValues[0] : 0)</span></div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>               <span class="comment">//   continue;</span></div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>               <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>         }</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>           }</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>           <span class="keywordflow">if</span>(!masked){</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>         <span class="keywordtype">short</span> binValue=0;</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>           <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass]){</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>             binValue=1;</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>           }</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         }</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         <span class="keywordflow">if</span>(m_class.size())</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>           statBuffer.push_back(binValue);</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>           statBuffer.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>           }</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>         }</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>           }</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       <span class="keywordflow">if</span>(statBuffer.size()){</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>             <span class="keywordflow">switch</span>(getFilterType(method)){</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>             <span class="keywordflow">case</span>(filter2d::dilate):</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>               outBuffer[x]=stat.mymax(statBuffer);</div>
 <div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>             <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>               std::ostringstream ess;</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>               ess << <span class="stringliteral">"Error:  morphology method "</span> << method << <span class="stringliteral">" not supported, choose "</span> << filter2d::dilate << <span class="stringliteral">" (dilate) or "</span> << filter2d::erode << <span class="stringliteral">" (erode)"</span> << std::endl;</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>               <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>             }</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>           }</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>       <span class="keywordflow">if</span>(outBuffer[x]&&m_class.size())</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>         outBuffer[x]=m_class[0];</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>     }</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       }</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>       <span class="comment">//write outBuffer to file</span></div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         output.writeData(outBuffer,GDT_Float64,y,iband);</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>       }</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>     std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>             <span class="keywordflow">case</span>(filter2d::erode):</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>               outBuffer[x]=stat.mymin(statBuffer);</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>             <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>               std::ostringstream ess;</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>               ess << <span class="stringliteral">"Error:  morphology method "</span> << method << <span class="stringliteral">" not supported, choose "</span> << filter2d::dilate << <span class="stringliteral">" (dilate) or "</span> << filter2d::erode << <span class="stringliteral">" (erode)"</span> << std::endl;</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>               <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>             }</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>           }</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       <span class="keywordflow">if</span>(outBuffer[x]&&m_class.size())</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>         outBuffer[x]=m_class[0];</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>     }</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>       }</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>       <span class="comment">//write outBuffer to file</span></div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>         output.writeData(outBuffer,GDT_Float64,y,iband);</div>
 <div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>       }</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       progress=(1.0+y);</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       progress+=(output.nrOfRow()*iband);</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>       progress/=output.nrOfBand()*output.nrOfRow();</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>     }</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>   }</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span> }</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span> </div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span> <span class="keywordtype">void</span> filter2d::Filter2d::shadowDsm(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">double</span> sza, <span class="keywordtype">double</span> saa, <span class="keywordtype">double</span> pixelSize, <span class="ke [...]
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> inputBuffer;</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> outputBuffer;</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>   input.readDataBlock(inputBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, 0);</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>   shadowDsm(inputBuffer, outputBuffer, sza, saa, pixelSize, shadowFlag);</div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>   output.writeDataBlock(outputBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,0);</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span> }</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span> </div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtForward(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>     dwtForward(theBuffer, wavelet_type, family);</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>   }</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span> }</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span> </div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtInverse(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>     dwtInverse(theBuffer, wavelet_type, family);</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>   }</div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span> }</div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span> </div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtCut(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut, <sp [...]
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>     dwtCut(theBuffer, wavelet_type, family, cut);</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>   }</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span> }</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> </div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> <span class="keywordtype">void</span> filter2d::Filter2d::linearFeature(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">float</span> angle, <span class="keywordtype">float</span> angleStep, <span class="keywordtype">float</span> maxDistance, <spa [...]
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> inputBuffer;</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>   std::vector< Vector2d<float> > outputBuffer;</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>   input.readDataBlock(inputBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, band);</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>   <span class="keywordflow">if</span>(maxDistance<=0)</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>     maxDistance=sqrt(static_cast<float>(input.nrOfCol()*input.nrOfRow()));</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>   linearFeature(inputBuffer,outputBuffer,angle,angleStep,maxDistance,eps, l1, a1, l2, a2,verbose);</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<outputBuffer.size();++iband)</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     output.writeDataBlock(outputBuffer[iband],GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span> }</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> </div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span> <span class="keywordtype">void</span> filter2d::Filter2d::linearFeature(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<float></a>& input, std::vector< <a class="code" href="classVector2d.html">Vector2d<float></a> >& output, <span class="keywordtype">float</span> angle, <span class="keywordtype">float</span> angleStep, <span class="keywordtype">flo [...]
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> {</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>   output.clear();</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>   <span class="keywordtype">int</span> nband=0;<span class="comment">//linear feature</span></div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>   <span class="keywordflow">if</span>(l1)</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>     ++nband;</div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>   <span class="keywordflow">if</span>(a1)</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>     ++nband;</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>   <span class="keywordflow">if</span>(l2)</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>     ++nband;</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>   <span class="keywordflow">if</span>(a2)</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>     ++nband;</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>   output.resize(nband);</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.size();++iband)</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>     output[iband].resize(input.nRows(),input.nCols());</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>   <span class="keywordflow">if</span>(maxDistance<=0)</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>     maxDistance=sqrt(static_cast<float>(input.nRows()*input.nCols()));</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>       <span class="keywordtype">float</span> currentValue=input[y][x];</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>       <span class="comment">//find values equal to current value with some error margin</span></div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>       <span class="comment">//todo: add distance for two opposite directions</span></div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>       <span class="keywordtype">float</span> lineDistance1=0;<span class="comment">//longest line of object</span></div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>       <span class="keywordtype">float</span> lineDistance2=maxDistance;<span class="comment">//shortest line of object</span></div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       <span class="keywordtype">float</span> lineAngle1=0;<span class="comment">//angle to longest line (North=0)</span></div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       <span class="keywordtype">float</span> lineAngle2=0;<span class="comment">//angle to shortest line (North=0)</span></div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>       <span class="keywordtype">float</span> northAngle=0;<span class="comment">//rotating angle</span></div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       <span class="keywordflow">for</span>(northAngle=0;northAngle<180;northAngle+=angleStep){</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>     <span class="keywordflow">if</span>(angle<=360&&angle>=0&&angle!=northAngle)</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>     <span class="comment">//test</span></div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>       std::cout << <span class="stringliteral">"northAngle: "</span> << northAngle << std::endl;</div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>     <span class="keywordtype">float</span> currentDistance=0;</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>     <span class="keywordtype">float</span> theDir=0;</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> side=0;side<=1;side+=1){</div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>       theDir=PI/2.0-DEG2RAD(northAngle)+side*PI;<span class="comment">//in radians</span></div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>       <span class="comment">//test</span></div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>         std::cout << <span class="stringliteral">"theDir in deg: "</span> << RAD2DEG(theDir) << std::endl;</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>       <span class="keywordflow">if</span>(theDir<0)</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>         theDir+=2*PI;</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>       <span class="comment">//test</span></div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>         std::cout << <span class="stringliteral">"theDir in deg: "</span> << RAD2DEG(theDir) << std::endl;</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>       <span class="keywordtype">float</span> nextValue=currentValue;</div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>       <span class="keywordflow">for</span>(<span class="keywordtype">float</span> currentRay=1;currentRay<maxDistance;++currentRay){</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>         indexI=x+currentRay*cos(theDir);</div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>         indexJ=y-currentRay*sin(theDir);</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>         <span class="keywordflow">if</span>(indexJ<0||indexJ>=input.size())</div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>         <span class="keywordflow">if</span>(indexI<0||indexI>=input[indexJ].size())</div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>         nextValue=input[indexJ][indexI];</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>           std::cout << <span class="stringliteral">"x: "</span> << x << std::endl;</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>           std::cout << <span class="stringliteral">"y: "</span> << y << std::endl;</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>           std::cout << <span class="stringliteral">"currentValue: "</span> << currentValue << std::endl;</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>           std::cout << <span class="stringliteral">"theDir in degrees: "</span> << RAD2DEG(theDir) << std::endl;</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>           std::cout << <span class="stringliteral">"cos(theDir): "</span> << cos(theDir) << std::endl;</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>           std::cout << <span class="stringliteral">"sin(theDir): "</span> << sin(theDir) << std::endl;</div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>           std::cout << <span class="stringliteral">"currentRay: "</span> << currentRay << std::endl;</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>           std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << std::endl;</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>           std::cout << <span class="stringliteral">"indexI: "</span> << indexI << std::endl;</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>           std::cout << <span class="stringliteral">"indexJ: "</span> << indexJ << std::endl;</div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>           std::cout << <span class="stringliteral">"nextValue: "</span> << nextValue << std::endl;</div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         }</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>         <span class="keywordflow">if</span>(fabs(currentValue-nextValue)<=eps){</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>           ++currentDistance;</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>           <span class="comment">//test</span></div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>           <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>         std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << <span class="stringliteral">", continue"</span> << std::endl;</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>         }</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>           <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>         std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << <span class="stringliteral">", break"</span> << std::endl;</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>         }</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>       }</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>     }</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>     <span class="keywordflow">if</span>(lineDistance1<currentDistance){</div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>       lineDistance1=currentDistance;</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>       lineAngle1=northAngle;</div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>     }</div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>     <span class="keywordflow">if</span>(lineDistance2>currentDistance){</div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>       lineDistance2=currentDistance;</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>       lineAngle2=northAngle;</div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>     }</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>     <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>       std::cout << <span class="stringliteral">"lineDistance1: "</span> << lineDistance1 << std::endl;</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>       std::cout << <span class="stringliteral">"lineAngle1: "</span> << lineAngle1 << std::endl;</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>       std::cout << <span class="stringliteral">"lineDistance2: "</span> << lineDistance2 << std::endl;</div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>       std::cout << <span class="stringliteral">"lineAngle2: "</span> << lineAngle2 << std::endl;</div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>     }</div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>       }</div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>       <span class="keywordtype">int</span> iband=0;</div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>       <span class="keywordflow">if</span>(l1)</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>     output[iband++][y][x]=lineDistance1;</div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>       <span class="keywordflow">if</span>(a1)</div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>     output[iband++][y][x]=lineAngle1;</div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>       <span class="keywordflow">if</span>(l2)</div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>     output[iband++][y][x]=lineDistance2;</div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>       <span class="keywordflow">if</span>(a2)</div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>     output[iband++][y][x]=lineAngle2;</div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>       assert(iband==nband);</div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>     }</div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>     progress/=input.nRows();</div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>   }</div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>     std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>       }</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       progress=(1.0+y);</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       progress+=(output.nrOfRow()*iband);</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       progress/=output.nrOfBand()*output.nrOfRow();</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>     }</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>   }</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span> }</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span> </div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> <span class="keywordtype">void</span> filter2d::Filter2d::shadowDsm(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">double</span> sza, <span class="keywordtype">double</span> saa, <span class="keywordtype">double</span> pixelSize, <span class="ke [...]
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> inputBuffer;</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> outputBuffer;</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>   input.readDataBlock(inputBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, 0);</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>   shadowDsm(inputBuffer, outputBuffer, sza, saa, pixelSize, shadowFlag);</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>   output.writeDataBlock(outputBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,0);</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span> }</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span> </div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtForward(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>     dwtForward(theBuffer, wavelet_type, family);</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>   }</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span> }</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span> </div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtInverse(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     dwtInverse(theBuffer, wavelet_type, family);</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>   }</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span> }</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span> </div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtCut(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut, <sp [...]
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>     dwtCut(theBuffer, wavelet_type, family, cut);</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>   }</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span> }</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span> </div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span> <span class="keywordtype">void</span> filter2d::Filter2d::linearFeature(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">float</span> angle, <span class="keywordtype">float</span> angleStep, <span class="keywordtype">float</span> maxDistance, <spa [...]
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> inputBuffer;</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>   std::vector< Vector2d<float> > outputBuffer;</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>   input.readDataBlock(inputBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, band);</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>   <span class="keywordflow">if</span>(maxDistance<=0)</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     maxDistance=sqrt(static_cast<float>(input.nrOfCol()*input.nrOfRow()));</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>   linearFeature(inputBuffer,outputBuffer,angle,angleStep,maxDistance,eps, l1, a1, l2, a2,verbose);</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<outputBuffer.size();++iband)</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>     output.writeDataBlock(outputBuffer[iband],GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> }</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span> </div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span> <span class="keywordtype">void</span> filter2d::Filter2d::linearFeature(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<float></a>& input, std::vector< <a class="code" href="classVector2d.html">Vector2d<float></a> >& output, <span class="keywordtype">float</span> angle, <span class="keywordtype">float</span> angleStep, <span class="keywordtype">flo [...]
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span> {</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>   output.clear();</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>   <span class="keywordtype">int</span> nband=0;<span class="comment">//linear feature</span></div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>   <span class="keywordflow">if</span>(l1)</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     ++nband;</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>   <span class="keywordflow">if</span>(a1)</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     ++nband;</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>   <span class="keywordflow">if</span>(l2)</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>     ++nband;</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>   <span class="keywordflow">if</span>(a2)</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>     ++nband;</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>   output.resize(nband);</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.size();++iband)</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>     output[iband].resize(input.nRows(),input.nCols());</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>   <span class="keywordflow">if</span>(maxDistance<=0)</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>     maxDistance=sqrt(static_cast<float>(input.nRows()*input.nCols()));</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>       <span class="keywordtype">float</span> currentValue=input[y][x];</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>       <span class="comment">//find values equal to current value with some error margin</span></div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       <span class="comment">//todo: add distance for two opposite directions</span></div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       <span class="keywordtype">float</span> lineDistance1=0;<span class="comment">//longest line of object</span></div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>       <span class="keywordtype">float</span> lineDistance2=maxDistance;<span class="comment">//shortest line of object</span></div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       <span class="keywordtype">float</span> lineAngle1=0;<span class="comment">//angle to longest line (North=0)</span></div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>       <span class="keywordtype">float</span> lineAngle2=0;<span class="comment">//angle to shortest line (North=0)</span></div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>       <span class="keywordtype">float</span> northAngle=0;<span class="comment">//rotating angle</span></div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>       <span class="keywordflow">for</span>(northAngle=0;northAngle<180;northAngle+=angleStep){</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>     <span class="keywordflow">if</span>(angle<=360&&angle>=0&&angle!=northAngle)</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>       std::cout << <span class="stringliteral">"northAngle: "</span> << northAngle << std::endl;</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>     <span class="keywordtype">float</span> currentDistance=0;</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>     <span class="keywordtype">float</span> theDir=0;</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> side=0;side<=1;side+=1){</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>       theDir=PI/2.0-DEG2RAD(northAngle)+side*PI;<span class="comment">//in radians</span></div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>         std::cout << <span class="stringliteral">"theDir in deg: "</span> << RAD2DEG(theDir) << std::endl;</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>       <span class="keywordflow">if</span>(theDir<0)</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>         theDir+=2*PI;</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>         std::cout << <span class="stringliteral">"theDir in deg: "</span> << RAD2DEG(theDir) << std::endl;</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>       <span class="keywordtype">float</span> nextValue=currentValue;</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>       <span class="keywordflow">for</span>(<span class="keywordtype">float</span> currentRay=1;currentRay<maxDistance;++currentRay){</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>         indexI=x+currentRay*cos(theDir);</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>         indexJ=y-currentRay*sin(theDir);</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>         <span class="keywordflow">if</span>(indexJ<0||indexJ>=input.size())</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         <span class="keywordflow">if</span>(indexI<0||indexI>=input[indexJ].size())</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>         nextValue=input[indexJ][indexI];</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>         <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>           std::cout << <span class="stringliteral">"x: "</span> << x << std::endl;</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>           std::cout << <span class="stringliteral">"y: "</span> << y << std::endl;</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>           std::cout << <span class="stringliteral">"currentValue: "</span> << currentValue << std::endl;</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>           std::cout << <span class="stringliteral">"theDir in degrees: "</span> << RAD2DEG(theDir) << std::endl;</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>           std::cout << <span class="stringliteral">"cos(theDir): "</span> << cos(theDir) << std::endl;</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>           std::cout << <span class="stringliteral">"sin(theDir): "</span> << sin(theDir) << std::endl;</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>           std::cout << <span class="stringliteral">"currentRay: "</span> << currentRay << std::endl;</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>           std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << std::endl;</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>           std::cout << <span class="stringliteral">"indexI: "</span> << indexI << std::endl;</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>           std::cout << <span class="stringliteral">"indexJ: "</span> << indexJ << std::endl;</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>           std::cout << <span class="stringliteral">"nextValue: "</span> << nextValue << std::endl;</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>         }</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>         <span class="keywordflow">if</span>(fabs(currentValue-nextValue)<=eps){</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>           ++currentDistance;</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>           <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>         std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << <span class="stringliteral">", continue"</span> << std::endl;</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>         }</div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>           <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>         std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << <span class="stringliteral">", break"</span> << std::endl;</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>         }</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>       }</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>     }</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>     <span class="keywordflow">if</span>(lineDistance1<currentDistance){</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>       lineDistance1=currentDistance;</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>       lineAngle1=northAngle;</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>     }</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>     <span class="keywordflow">if</span>(lineDistance2>currentDistance){</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>       lineDistance2=currentDistance;</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>       lineAngle2=northAngle;</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>     }</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>     <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>       std::cout << <span class="stringliteral">"lineDistance1: "</span> << lineDistance1 << std::endl;</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>       std::cout << <span class="stringliteral">"lineAngle1: "</span> << lineAngle1 << std::endl;</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>       std::cout << <span class="stringliteral">"lineDistance2: "</span> << lineDistance2 << std::endl;</div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>       std::cout << <span class="stringliteral">"lineAngle2: "</span> << lineAngle2 << std::endl;</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>     }</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>       }</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>       <span class="keywordtype">int</span> iband=0;</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>       <span class="keywordflow">if</span>(l1)</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>     output[iband++][y][x]=lineDistance1;</div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>       <span class="keywordflow">if</span>(a1)</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>     output[iband++][y][x]=lineAngle1;</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>       <span class="keywordflow">if</span>(l2)</div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>     output[iband++][y][x]=lineDistance2;</div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>       <span class="keywordflow">if</span>(a2)</div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>     output[iband++][y][x]=lineAngle2;</div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>       assert(iband==nband);</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>     }</div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>     progress/=input.nRows();</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>   }</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span> }</div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Filter2d_8h_source.html b/doc/html/Filter2d_8h_source.html
index caf024e..24a7561 100644
--- a/doc/html/Filter2d_8h_source.html
+++ b/doc/html/Filter2d_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -112,7 +112,7 @@
 <div class="line"><a name="l00058"></a><span class="lineno">   58</span> </div>
 <div class="line"><a name="l00059"></a><span class="lineno">   59</span> <span class="keyword">namespace </span>filter2d</div>
 <div class="line"><a name="l00060"></a><span class="lineno">   60</span> {</div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="keyword">enum</span> FILTER_TYPE { median=100, var=101 , min=102, max=103, sum=104, mean=105, minmax=106, dilate=107, erode=108, close=109, open=110, homog=111, sobelx=112, sobely=113, sobelxy=114, sobelyx=115, smooth=116, density=117, mode=118, mixed=119, threshold=120, ismin=121, ismax=122, heterog=123, order=124, stdev=125, mrf=126, dwt=127, dwti=128, dwt_cut=129, scramble=130, shift=131, line [...]
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="keyword">enum</span> FILTER_TYPE { median=100, var=101 , min=102, max=103, sum=104, mean=105, minmax=106, dilate=107, erode=108, close=109, open=110, homog=111, sobelx=112, sobely=113, sobelxy=114, sobelyx=115, smooth=116, density=117, mode=118, mixed=119, threshold=120, ismin=121, ismax=122, heterog=123, order=124, stdev=125, mrf=126, dwt=127, dwti=128, dwt_cut=129, scramble=130, shift=131, line [...]
 <div class="line"><a name="l00062"></a><span class="lineno">   62</span> </div>
 <div class="line"><a name="l00063"></a><span class="lineno">   63</span>   <span class="keyword">enum</span> RESAMPLE { NEAR = 0, BILINEAR = 1, BICUBIC = 2 };<span class="comment">//bicubic not supported yet...</span></div>
 <div class="line"><a name="l00064"></a><span class="lineno">   64</span>   </div>
@@ -186,1239 +186,1243 @@
 <div class="line"><a name="l00132"></a><span class="lineno">  132</span>   <span class="keyword">static</span> <span class="keywordtype">void</span> initMap(std::map<std::string, FILTER_TYPE>& m_filterMap){</div>
 <div class="line"><a name="l00133"></a><span class="lineno">  133</span>     <span class="comment">//initialize selMap</span></div>
 <div class="line"><a name="l00134"></a><span class="lineno">  134</span>     m_filterMap[<span class="stringliteral">"median"</span>]=filter2d::median;</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     m_filterMap[<span class="stringliteral">"var"</span>]=filter2d::var;</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     m_filterMap[<span class="stringliteral">"min"</span>]=filter2d::min;</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     m_filterMap[<span class="stringliteral">"max"</span>]=filter2d::max;</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     m_filterMap[<span class="stringliteral">"sum"</span>]=filter2d::sum;</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     m_filterMap[<span class="stringliteral">"mean"</span>]=filter2d::mean;</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     m_filterMap[<span class="stringliteral">"minmax"</span>]=filter2d::minmax;</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     m_filterMap[<span class="stringliteral">"dilate"</span>]=filter2d::dilate;</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     m_filterMap[<span class="stringliteral">"erode"</span>]=filter2d::erode;</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     m_filterMap[<span class="stringliteral">"close"</span>]=filter2d::close;</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     m_filterMap[<span class="stringliteral">"open"</span>]=filter2d::open;</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     m_filterMap[<span class="stringliteral">"homog"</span>]=filter2d::homog;</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     m_filterMap[<span class="stringliteral">"sobelx"</span>]=filter2d::sobelx;</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     m_filterMap[<span class="stringliteral">"sobely"</span>]=filter2d::sobely;</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     m_filterMap[<span class="stringliteral">"sobelxy"</span>]=filter2d::sobelxy;</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     m_filterMap[<span class="stringliteral">"sobelyx"</span>]=filter2d::sobelyx;</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     m_filterMap[<span class="stringliteral">"smooth"</span>]=filter2d::smooth;</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     m_filterMap[<span class="stringliteral">"density"</span>]=filter2d::density;</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     m_filterMap[<span class="stringliteral">"mode"</span>]=filter2d::mode;</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     m_filterMap[<span class="stringliteral">"mixed"</span>]=filter2d::mixed;</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     m_filterMap[<span class="stringliteral">"smoothnodata"</span>]=filter2d::smoothnodata;</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     m_filterMap[<span class="stringliteral">"threshold"</span>]=filter2d::threshold;</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     m_filterMap[<span class="stringliteral">"ismin"</span>]=filter2d::ismin;</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     m_filterMap[<span class="stringliteral">"ismax"</span>]=filter2d::ismax;</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     m_filterMap[<span class="stringliteral">"heterog"</span>]=filter2d::heterog;</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     m_filterMap[<span class="stringliteral">"order"</span>]=filter2d::order;</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     m_filterMap[<span class="stringliteral">"stdev"</span>]=filter2d::stdev;</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     m_filterMap[<span class="stringliteral">"mrf"</span>]=filter2d::mrf;</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     m_filterMap[<span class="stringliteral">"dwt"</span>]=filter2d::dwt;</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     m_filterMap[<span class="stringliteral">"dwti"</span>]=filter2d::dwti;</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     m_filterMap[<span class="stringliteral">"dwt_cut"</span>]=filter2d::dwt_cut;</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     m_filterMap[<span class="stringliteral">"dwt_cut_from"</span>]=filter2d::dwt_cut_from;</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     m_filterMap[<span class="stringliteral">"scramble"</span>]=filter2d::scramble;</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     m_filterMap[<span class="stringliteral">"shift"</span>]=filter2d::shift;</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     m_filterMap[<span class="stringliteral">"linearfeature"</span>]=filter2d::linearfeature;</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     m_filterMap[<span class="stringliteral">"countid"</span>]=filter2d::countid;</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     m_filterMap[<span class="stringliteral">"savgolay"</span>]=filter2d::savgolay;</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     m_filterMap[<span class="stringliteral">"percentile"</span>]=filter2d::percentile;</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     m_filterMap[<span class="stringliteral">"proportion"</span>]=filter2d::proportion;</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   }</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span> </div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> m_taps;</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <span class="comment">/* double m_noValue; */</span></div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   std::vector<short> m_class;</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="comment">/* std::vector<short> m_mask; */</span></div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   std::vector<double> m_noDataValues;</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   std::vector<double> m_threshold;</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span> };</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span> </div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     m_filterMap[<span class="stringliteral">"nvalid"</span>]=filter2d::nvalid;</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     m_filterMap[<span class="stringliteral">"var"</span>]=filter2d::var;</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     m_filterMap[<span class="stringliteral">"min"</span>]=filter2d::min;</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     m_filterMap[<span class="stringliteral">"max"</span>]=filter2d::max;</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     m_filterMap[<span class="stringliteral">"sum"</span>]=filter2d::sum;</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     m_filterMap[<span class="stringliteral">"mean"</span>]=filter2d::mean;</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     m_filterMap[<span class="stringliteral">"minmax"</span>]=filter2d::minmax;</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     m_filterMap[<span class="stringliteral">"dilate"</span>]=filter2d::dilate;</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     m_filterMap[<span class="stringliteral">"erode"</span>]=filter2d::erode;</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     m_filterMap[<span class="stringliteral">"close"</span>]=filter2d::close;</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     m_filterMap[<span class="stringliteral">"open"</span>]=filter2d::open;</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     m_filterMap[<span class="stringliteral">"homog"</span>]=filter2d::homog;</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     m_filterMap[<span class="stringliteral">"sobelx"</span>]=filter2d::sobelx;</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     m_filterMap[<span class="stringliteral">"sobely"</span>]=filter2d::sobely;</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     m_filterMap[<span class="stringliteral">"sobelxy"</span>]=filter2d::sobelxy;</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     m_filterMap[<span class="stringliteral">"sobelyx"</span>]=filter2d::sobelyx;</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     m_filterMap[<span class="stringliteral">"smooth"</span>]=filter2d::smooth;</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     m_filterMap[<span class="stringliteral">"density"</span>]=filter2d::density;</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     m_filterMap[<span class="stringliteral">"mode"</span>]=filter2d::mode;</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     m_filterMap[<span class="stringliteral">"mixed"</span>]=filter2d::mixed;</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     m_filterMap[<span class="stringliteral">"smoothnodata"</span>]=filter2d::smoothnodata;</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     m_filterMap[<span class="stringliteral">"threshold"</span>]=filter2d::threshold;</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     m_filterMap[<span class="stringliteral">"ismin"</span>]=filter2d::ismin;</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     m_filterMap[<span class="stringliteral">"ismax"</span>]=filter2d::ismax;</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     m_filterMap[<span class="stringliteral">"heterog"</span>]=filter2d::heterog;</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     m_filterMap[<span class="stringliteral">"order"</span>]=filter2d::order;</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     m_filterMap[<span class="stringliteral">"stdev"</span>]=filter2d::stdev;</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     m_filterMap[<span class="stringliteral">"mrf"</span>]=filter2d::mrf;</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     m_filterMap[<span class="stringliteral">"dwt"</span>]=filter2d::dwt;</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     m_filterMap[<span class="stringliteral">"dwti"</span>]=filter2d::dwti;</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     m_filterMap[<span class="stringliteral">"dwt_cut"</span>]=filter2d::dwt_cut;</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     m_filterMap[<span class="stringliteral">"dwt_cut_from"</span>]=filter2d::dwt_cut_from;</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     m_filterMap[<span class="stringliteral">"scramble"</span>]=filter2d::scramble;</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     m_filterMap[<span class="stringliteral">"shift"</span>]=filter2d::shift;</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     m_filterMap[<span class="stringliteral">"linearfeature"</span>]=filter2d::linearfeature;</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     m_filterMap[<span class="stringliteral">"countid"</span>]=filter2d::countid;</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     m_filterMap[<span class="stringliteral">"savgolay"</span>]=filter2d::savgolay;</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     m_filterMap[<span class="stringliteral">"percentile"</span>]=filter2d::percentile;</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     m_filterMap[<span class="stringliteral">"proportion"</span>]=filter2d::proportion;</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   }</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span> </div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> m_taps;</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="comment">/* double m_noValue; */</span></div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   std::vector<short> m_class;</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <span class="comment">/* std::vector<short> m_mask; */</span></div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   std::vector<double> m_noDataValues;</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   std::vector<double> m_threshold;</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span> };</div>
 <div class="line"><a name="l00183"></a><span class="lineno">  183</span> </div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>  <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::smooth(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector,<span class="keywordtype">int</span [...]
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   {</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     smooth(inputVector,outputVector,dim,dim);</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   }</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span> </div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>  <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::smooth(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector,<span class="keywordtype">int</span [...]
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   {</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     m_taps.resize(dimY);</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY;++j){</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>       m_taps[j].resize(dimX);</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX;++i)</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     m_taps[j][i]=1.0/dimX/dimY;</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     }</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     filter(inputVector,outputVector);</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   }</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   </div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::filter(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector)</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   {</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     outputVector.resize(inputVector.size());</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     <span class="keywordtype">int</span> dimX=m_taps[0].size();<span class="comment">//horizontal!!!</span></div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     <span class="keywordtype">int</span> dimY=m_taps.size();<span class="comment">//vertical!!!</span></div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     <a class="code" href="classVector2d.html">Vector2d<T1></a> inBuffer(dimY);</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     std::vector<T2> outBuffer(inputVector[0].size());</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>       inBuffer[indexJ]=inputVector[abs(j)];</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>       ++indexJ;</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     }</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span> </div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<inputVector.size();++y){</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>       <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>         <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>         inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>         <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>         <span class="keywordflow">if</span>(y+dimY/2<inputVector.size()){</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>           inBuffer.push_back(inputVector[y+dimY/2]);</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>         }</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>           <span class="keywordtype">int</span> over=y+dimY/2-inputVector.nRows();</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>           <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>           assert(index>=0);</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>           assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>           inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>         }</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       }</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<inputVector.nCols();++x){</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>         outBuffer[x]=0;</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>         indexI=x+i;</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>         indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>         <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>         <span class="keywordflow">if</span>(x<(dimX-1)/2)</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>           indexI=x+abs(i);</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(x>=inputVector.nCols()-(dimX-1)/2)</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>           indexI=x-abs(i);</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>         <span class="keywordflow">if</span>(y<(dimY-1)/2)</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>           indexJ=(dimY-1)/2+abs(j);</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y>=inputVector.nRows()-(dimY-1)/2)</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>           indexJ=(dimY-1)/2-abs(j);</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>             outBuffer[x]+=(m_taps[(dimY-1)/2+j][(dimX-1)/2+i]*inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>           }</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>         }</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       }</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       <span class="comment">//copy outBuffer to outputVector</span></div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       outputVector[y]=outBuffer;</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     }</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   }</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span> </div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span> <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::doit(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector, <span class="keyword">const</span> st [...]
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span> {</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span> </div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     noDataValue=m_noDataValues[0];</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span> </div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   assert(dimX);</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   assert(dimY);</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span> </div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   outputVector.resize((inputVector.size()+down-1)/down);</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <a class="code" href="classVector2d.html">Vector2d<T1></a> inBuffer(dimY);</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   std::vector<T2> outBuffer((inputVector[0].size()+down-1)/down);</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     inBuffer[indexJ]=inputVector[abs(j)];</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     ++indexJ;</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   }</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<inputVector.size();++y){</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       <span class="keywordflow">if</span>(y+dimY/2<inputVector.size())</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     inBuffer.push_back(inputVector[y+dimY/2]);</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>         <span class="keywordtype">int</span> over=y+dimY/2-inputVector.size();</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>         assert(index>=0);</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>         assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>         inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>       }</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     }</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     <span class="keywordflow">if</span>((y+1+down/2)%down)</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<inputVector[0].size();++x){</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       <span class="keywordflow">if</span>((x+1+down/2)%down)</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       outBuffer[x/down]=0;</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       std::vector<double> windowBuffer;</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       std::map<int,int> occurrence;</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>       indexI=x+i;</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>           <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>             indexI=-indexI;</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=inputVector[0].size())</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>             indexI=inputVector[0].size()-i;</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>           <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>             indexJ=-j;</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=inputVector.size())</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>             indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>             indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>           <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>               masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>             }</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>           }</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>           <span class="keywordflow">if</span>(!masked){</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>             std::vector<short>::const_iterator vit=m_class.begin();</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>             <span class="comment">//todo: test if this works (only add occurrence if within defined classes)!</span></div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>             <span class="keywordflow">if</span>(!m_class.size())</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>               ++occurrence[inBuffer[indexJ][indexI]];</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>               <span class="keywordflow">while</span>(vit!=m_class.end()){</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>                 <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==*(vit++))</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>                   ++occurrence[inBuffer[indexJ][indexI]];</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>               }</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>             }</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>             windowBuffer.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>           }</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>         }</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       }</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       <span class="keywordflow">switch</span>(getFilterType(method)){</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       <span class="keywordflow">case</span>(filter2d::median):</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>           outBuffer[x/down]=stat.median(windowBuffer);</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       <span class="keywordflow">case</span>(filter2d::var):{</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>           outBuffer[x/down]=stat.var(windowBuffer);</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>       }</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>       <span class="keywordflow">case</span>(filter2d::stdev):{</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>           outBuffer[x/down]=sqrt(stat.var(windowBuffer));</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       }</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       <span class="keywordflow">case</span>(filter2d::mean):{</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>           outBuffer[x/down]=stat.mean(windowBuffer);</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       }</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       <span class="keywordflow">case</span>(filter2d::min):{</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>           outBuffer[x/down]=stat.mymin(windowBuffer);</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       }</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="keywordflow">case</span>(filter2d::ismin):{</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>           outBuffer[x/down]=(stat.mymin(windowBuffer)==windowBuffer[centre])? 1:0;</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       }</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">case</span>(filter2d::minmax):{</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>         <span class="keywordtype">double</span> min=0;</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>         <span class="keywordtype">double</span> max=0;</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>           stat.minmax(windowBuffer,windowBuffer.begin(),windowBuffer.end(),min,max);</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>           <span class="keywordflow">if</span>(min!=max)</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>             outBuffer[x/down]=0;</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>             outBuffer[x/down]=windowBuffer[centre];<span class="comment">//centre pixels</span></div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>         }</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       }</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       <span class="keywordflow">case</span>(filter2d::max):{</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>           outBuffer[x/down]=stat.mymax(windowBuffer);</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       }</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">case</span>(filter2d::ismax):{</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>           outBuffer[x/down]=(stat.mymax(windowBuffer)==windowBuffer[centre])? 1:0;</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       }</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       <span class="keywordflow">case</span>(filter2d::order):{</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>           <span class="keywordtype">double</span> lbound=0;</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>           <span class="keywordtype">double</span> ubound=dimX*dimY;</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>           <span class="keywordtype">double</span> theMin=stat.mymin(windowBuffer);</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>           <span class="keywordtype">double</span> theMax=stat.mymax(windowBuffer);</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>           <span class="keywordtype">double</span> scale=(ubound-lbound)/(theMax-theMin);</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           outBuffer[x/down]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(scale*(windowBuffer[centre]-theMin)+lbound);</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>         }</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       }</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       <span class="keywordflow">case</span>(filter2d::sum):{</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         outBuffer[x/down]=stat.sum(windowBuffer);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span> </div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>  <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::smooth(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector,<span class="keywordtype">int</span [...]
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   {</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     smooth(inputVector,outputVector,dim,dim);</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   }</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span> </div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>  <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::smooth(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector,<span class="keywordtype">int</span [...]
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   {</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     m_taps.resize(dimY);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY;++j){</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>       m_taps[j].resize(dimX);</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX;++i)</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     m_taps[j][i]=1.0/dimX/dimY;</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     }</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     filter(inputVector,outputVector);</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   }</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   </div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::filter(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector)</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   {</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     outputVector.resize(inputVector.size());</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     <span class="keywordtype">int</span> dimX=m_taps[0].size();<span class="comment">//horizontal!!!</span></div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     <span class="keywordtype">int</span> dimY=m_taps.size();<span class="comment">//vertical!!!</span></div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     <a class="code" href="classVector2d.html">Vector2d<T1></a> inBuffer(dimY);</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     std::vector<T2> outBuffer(inputVector[0].size());</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>       inBuffer[indexJ]=inputVector[abs(j)];</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>       ++indexJ;</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     }</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span> </div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<inputVector.size();++y){</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>       <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>         <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>         inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>         <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>         <span class="keywordflow">if</span>(y+dimY/2<inputVector.size()){</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>           inBuffer.push_back(inputVector[y+dimY/2]);</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>         }</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>           <span class="keywordtype">int</span> over=y+dimY/2-inputVector.nRows();</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>           <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>           assert(index>=0);</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>           assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>           inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>         }</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>       }</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<inputVector.nCols();++x){</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>         outBuffer[x]=0;</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>         indexI=x+i;</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>         indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>         <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>         <span class="keywordflow">if</span>(x<(dimX-1)/2)</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>           indexI=x+abs(i);</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(x>=inputVector.nCols()-(dimX-1)/2)</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>           indexI=x-abs(i);</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>         <span class="keywordflow">if</span>(y<(dimY-1)/2)</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>           indexJ=(dimY-1)/2+abs(j);</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y>=inputVector.nRows()-(dimY-1)/2)</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>           indexJ=(dimY-1)/2-abs(j);</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>             outBuffer[x]+=(m_taps[(dimY-1)/2+j][(dimX-1)/2+i]*inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>           }</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>         }</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       }</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       <span class="comment">//copy outBuffer to outputVector</span></div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>       outputVector[y]=outBuffer;</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     }</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   }</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span> </div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span> <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::doit(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector, <span class="keyword">const</span> st [...]
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span> {</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span> </div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span> </div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   assert(dimX);</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   assert(dimY);</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span> </div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   outputVector.resize((inputVector.size()+down-1)/down);</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <a class="code" href="classVector2d.html">Vector2d<T1></a> inBuffer(dimY);</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   std::vector<T2> outBuffer((inputVector[0].size()+down-1)/down);</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     inBuffer[indexJ]=inputVector[abs(j)];</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     ++indexJ;</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   }</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<inputVector.size();++y){</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>       inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       <span class="keywordflow">if</span>(y+dimY/2<inputVector.size())</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     inBuffer.push_back(inputVector[y+dimY/2]);</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>         <span class="keywordtype">int</span> over=y+dimY/2-inputVector.size();</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>         assert(index>=0);</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>         assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>         inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>       }</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     }</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     <span class="keywordflow">if</span>((y+1+down/2)%down)</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<inputVector[0].size();++x){</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       <span class="keywordflow">if</span>((x+1+down/2)%down)</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       outBuffer[x/down]=0;</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       std::vector<double> windowBuffer;</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       std::map<int,int> occurrence;</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       indexI=x+i;</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>       <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>           <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>             indexI=-indexI;</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=inputVector[0].size())</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>             indexI=inputVector[0].size()-i;</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>           <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>             indexJ=-j;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=inputVector.size())</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>             indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>             indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>           <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>               masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>             }</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>           }</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>           <span class="keywordflow">if</span>(!masked){</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>             std::vector<short>::const_iterator vit=m_class.begin();</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>             <span class="comment">//todo: test if this works (only add occurrence if within defined classes)!</span></div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>             <span class="keywordflow">if</span>(!m_class.size())</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>               ++occurrence[inBuffer[indexJ][indexI]];</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>               <span class="keywordflow">while</span>(vit!=m_class.end()){</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>                 <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==*(vit++))</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>                   ++occurrence[inBuffer[indexJ][indexI]];</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>               }</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>             }</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>             windowBuffer.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>           }</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>         }</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       }</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       <span class="keywordflow">switch</span>(getFilterType(method)){</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       <span class="keywordflow">case</span>(filter2d::nvalid):</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     outBuffer[x/down]=stat.nvalid(windowBuffer);</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       <span class="keywordflow">case</span>(filter2d::median):</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>           outBuffer[x/down]=stat.median(windowBuffer);</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       <span class="keywordflow">case</span>(filter2d::var):{</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>           outBuffer[x/down]=stat.var(windowBuffer);</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       }</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       <span class="keywordflow">case</span>(filter2d::stdev):{</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>           outBuffer[x/down]=sqrt(stat.var(windowBuffer));</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       }</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>       <span class="keywordflow">case</span>(filter2d::mean):{</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           outBuffer[x/down]=stat.mean(windowBuffer);</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       }</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       <span class="keywordflow">case</span>(filter2d::min):{</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>           outBuffer[x/down]=stat.mymin(windowBuffer);</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       }</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       <span class="keywordflow">case</span>(filter2d::ismin):{</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>           outBuffer[x/down]=(stat.mymin(windowBuffer)==windowBuffer[centre])? 1:0;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       }</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="keywordflow">case</span>(filter2d::minmax):{</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>         <span class="keywordtype">double</span> min=0;</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>         <span class="keywordtype">double</span> max=0;</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>           stat.minmax(windowBuffer,windowBuffer.begin(),windowBuffer.end(),min,max);</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>           <span class="keywordflow">if</span>(min!=max)</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>             outBuffer[x/down]=0;</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>             outBuffer[x/down]=windowBuffer[centre];<span class="comment">//centre pixels</span></div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>         }</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       }</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       <span class="keywordflow">case</span>(filter2d::max):{</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>           outBuffer[x/down]=stat.mymax(windowBuffer);</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       }</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">case</span>(filter2d::ismax):{</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>           outBuffer[x/down]=(stat.mymax(windowBuffer)==windowBuffer[centre])? 1:0;</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       }</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       <span class="keywordflow">case</span>(filter2d::order):{</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>           <span class="keywordtype">double</span> lbound=0;</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           <span class="keywordtype">double</span> ubound=dimX*dimY;</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>           <span class="keywordtype">double</span> theMin=stat.mymin(windowBuffer);</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>           <span class="keywordtype">double</span> theMax=stat.mymax(windowBuffer);</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>           <span class="keywordtype">double</span> scale=(ubound-lbound)/(theMax-theMin);</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>           outBuffer[x/down]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(scale*(windowBuffer[centre]-theMin)+lbound);</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         }</div>
 <div class="line"><a name="l00428"></a><span class="lineno">  428</span>         <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l00429"></a><span class="lineno">  429</span>       }</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       <span class="keywordflow">case</span>(filter2d::percentile):{</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>     assert(m_threshold.size());</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>         outBuffer[x/down]=stat.percentile(windowBuffer,windowBuffer.begin(),windowBuffer.end(),m_threshold[0]);</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       }</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       <span class="keywordflow">case</span>(filter2d::proportion):{</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     assert(m_threshold.size());</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordtype">double</span> sum=stat.sum(windowBuffer);</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>     <span class="keywordflow">if</span>(sum)</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       outBuffer[x/down]=windowBuffer[centre]/sum;</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       }</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       <span class="keywordflow">case</span>(filter2d::homog):</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>         <span class="keywordflow">if</span>(occurrence.size()==1)<span class="comment">//all values in window must be the same</span></div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>           outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       <span class="keywordflow">case</span>(filter2d::heterog):{</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         <span class="keywordflow">for</span>(std::vector<double>::const_iterator wit=windowBuffer.begin();wit!=windowBuffer.end();++wit){</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>           <span class="keywordflow">if</span>(wit==windowBuffer.begin()+windowBuffer.size()/2)</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*wit!=inBuffer[(dimY-1)/2][x])</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>             outBuffer[x/down]=1;</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*wit==inBuffer[(dimY-1)/2][x]){<span class="comment">//todo:wit mag niet central pixel zijn</span></div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>             outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>           }</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>         }</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>       }</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="keywordflow">case</span>(filter2d::density):{</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>           std::vector<short>::const_iterator vit=m_class.begin();</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>           <span class="keywordflow">while</span>(vit!=m_class.end())</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>             outBuffer[x/down]+=100.0*occurrence[*(vit++)]/windowBuffer.size();</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         }</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       }</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">case</span>(filter2d::countid):{</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     <span class="keywordflow">if</span>(windowBuffer.size())</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       outBuffer[x/down]=occurrence.size();</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       }</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">case</span>(filter2d::mode):{</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         <span class="keywordflow">if</span>(occurrence.size()){</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>           std::map<int,int>::const_iterator maxit=occurrence.begin();</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>           <span class="keywordflow">for</span>(std::map<int,int>::const_iterator mit=occurrence.begin();mit!=occurrence.end();++mit){</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>             <span class="keywordflow">if</span>(mit->second>maxit->second)</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>               maxit=mit;</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>           }</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>           <span class="keywordflow">if</span>(occurrence[inBuffer[(dimY-1)/2][x]]<maxit->second)<span class="comment">//</span></div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>             outBuffer[x/down]=maxit->first;</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>             outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>         }</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       }</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="keywordflow">case</span>(filter2d::threshold):{</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         assert(m_class.size()==m_threshold.size());</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>           outBuffer[x/down]=inBuffer[(dimY-1)/2][x];<span class="comment">//initialize with original value (in case thresholds not met)</span></div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>             <span class="keywordflow">if</span>(100.0*(occurrence[m_class[iclass]])/windowBuffer.size()>m_threshold[iclass])</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>               outBuffer[x/down]=m_class[iclass];</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           }</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>         }</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       }</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       <span class="keywordflow">case</span>(filter2d::scramble):{<span class="comment">//could be done more efficiently window by window with random shuffling entire buffer and assigning entire buffer at once to output image...</span></div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>     <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       <span class="keywordtype">int</span> randomIndex=std::rand()%windowBuffer.size();</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       <span class="keywordflow">if</span>(randomIndex>=windowBuffer.size())</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         outBuffer[x/down]=windowBuffer.back();</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(randomIndex<0)</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>         outBuffer[x/down]=windowBuffer[0];</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>         outBuffer[x/down]=windowBuffer[randomIndex];</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>     }</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       }</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       <span class="keywordflow">case</span>(filter2d::mixed):{</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>         <span class="keyword">enum</span> MixType { BF=11, CF=12, MF=13, NF=20, W=30 };</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>         <span class="keywordtype">double</span> nBF=occurrence[BF];</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>         <span class="keywordtype">double</span> nCF=occurrence[CF];</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>         <span class="keywordtype">double</span> nMF=occurrence[MF];</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>         <span class="keywordtype">double</span> nNF=occurrence[NF];</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>         <span class="keywordtype">double</span> nW=occurrence[W];</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>           <span class="keywordflow">if</span>((nBF+nCF+nMF)&&(nBF+nCF+nMF>=nNF+nW)){<span class="comment">//forest</span></div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>             <span class="keywordflow">if</span>(nBF/(nBF+nCF)>=0.75)</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>               outBuffer[x/down]=BF;</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nCF/(nBF+nCF)>=0.75)</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>               outBuffer[x/down]=CF;</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>               outBuffer[x/down]=MF;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>           }</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>           <span class="keywordflow">else</span>{<span class="comment">//non-forest</span></div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>             <span class="keywordflow">if</span>(nW&&(nW>=nNF))</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>               outBuffer[x/down]=W;</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>               outBuffer[x/down]=NF;</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>           }</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>         }</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>           outBuffer[x/down]=inBuffer[indexJ][indexI];</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       }</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       }</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     }</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     progress=(1.0+y/down);</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     progress+=(outputVector.size());</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     progress/=outputVector.size();</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     <span class="comment">//copy outBuffer to outputVector</span></div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     outputVector[y/down]=outBuffer;</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   }</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span> }</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span> </div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span> <span class="comment">// class Compare_mapValue{</span></div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span> <span class="comment">// public:</span></div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span> <span class="comment">//   int operator() (const map<int,int>::value_type& v1, const map<int, int>::value_type& v2) const{</span></div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span> <span class="comment">//     return (v1.second)>(v2.second);</span></div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span> <span class="comment">// };</span></div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span> </div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::shift(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span class="keywordtype">double</span> offsetX, <span class="keywordtype">double</span> o [...]
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   output.resize(input.nRows(),input.nCols());</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   <span class="keyword">const</span> gsl_rng_type *rangenType;</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   gsl_rng *rangen;</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>   gsl_rng_env_setup();</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   rangenType=gsl_rng_default;</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   rangen=gsl_rng_alloc(rangenType);</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>   <span class="keywordtype">long</span> seed=time(NULL)*getpid();</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   gsl_rng_set(rangen,seed);</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<input.nRows();++j){</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i){</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       T theValue=0;</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       <span class="keywordtype">double</span> randomX=0;</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       <span class="keywordtype">double</span> randomY=0;</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       <span class="keywordflow">if</span>(randomSigma>0){</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>         randomX=gsl_ran_gaussian(rangen,randomSigma);</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>         randomY=gsl_ran_gaussian(rangen,randomSigma);</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       }</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordtype">double</span> readCol=i+offsetX+randomX;</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       <span class="keywordtype">double</span> readRow=j+offsetY+randomY;</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       <span class="keywordflow">if</span>(readRow<0)</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>         readRow=0;</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       <span class="keywordflow">if</span>(readRow>input.nRows()-1)</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>         readRow=input.nRows()-1;</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       <span class="keywordflow">if</span>(readCol<0)</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>         readCol=0;</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordflow">if</span>(readCol>input.nCols()-1)</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         readCol=input.nCols()-1;</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       <span class="keywordflow">switch</span>(resample){</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       <span class="keywordflow">case</span>(BILINEAR):{</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>         <span class="keywordtype">double</span> lowerRow=readRow-0.5;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>         <span class="keywordtype">double</span> upperRow=readRow+0.5;</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>         lowerRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerRow);</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>         upperRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperRow);</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>         <span class="keywordtype">double</span> lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>         <span class="keywordtype">double</span> upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>         assert(lowerRow>=0);</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>         assert(lowerRow<input.nRows());</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>         assert(lowerCol>=0);</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>         assert(lowerCol<input.nCols());</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>         assert(upperRow>=0);</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         assert(upperRow<input.nRows());</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>         assert(upperCol>=0);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         <span class="keywordflow">if</span>(upperCol>=input.nCols()){</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>           std::cout << <span class="stringliteral">"upperCol: "</span> << upperCol << std::endl;</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>           std::cout << <span class="stringliteral">"readCol: "</span> << readCol << std::endl;</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>           std::cout << <span class="stringliteral">"readCol+0.5: "</span> << readCol+0.5 << std::endl;</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>           std::cout << <span class="stringliteral">"static_cast<int>(readCol+0.5): "</span> << <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol+0.5) << std::endl;</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>         }</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>         assert(upperCol<input.nCols());</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>         <span class="keywordtype">double</span> c00=input[lowerRow][lowerCol];</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>         <span class="keywordtype">double</span> c11=input[upperRow][upperCol];</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>         <span class="keywordtype">double</span> c01=input[lowerRow][upperCol];</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>         <span class="keywordtype">double</span> c10=input[upperRow][lowerCol];</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>         <span class="keywordtype">double</span> a=(upperCol-readCol)*c00+(readCol-lowerCol)*c01;</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>         <span class="keywordtype">double</span> b=(upperCol-readCol)*c10+(readCol-lowerCol)*c11;</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         theValue=(upperRow-readRow)*a+(readRow-lowerRow)*b;</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       }</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         theValue=input[<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readRow)][static_cast<int>(readCol)];</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       <span class="keywordflow">case</span>(filter2d::sum):{</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>         outBuffer[x/down]=stat.sum(windowBuffer);</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>       }</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       <span class="keywordflow">case</span>(filter2d::percentile):{</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>     assert(m_threshold.size());</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>         outBuffer[x/down]=stat.percentile(windowBuffer,windowBuffer.begin(),windowBuffer.end(),m_threshold[0]);</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       }</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       <span class="keywordflow">case</span>(filter2d::proportion):{</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     assert(m_threshold.size());</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     <span class="keywordtype">double</span> sum=stat.sum(windowBuffer);</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     <span class="keywordflow">if</span>(sum)</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       outBuffer[x/down]=windowBuffer[centre]/sum;</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       }</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="keywordflow">case</span>(filter2d::homog):</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         <span class="keywordflow">if</span>(occurrence.size()==1)<span class="comment">//all values in window must be the same</span></div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>           outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       <span class="keywordflow">case</span>(filter2d::heterog):{</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>         <span class="keywordflow">for</span>(std::vector<double>::const_iterator wit=windowBuffer.begin();wit!=windowBuffer.end();++wit){</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>           <span class="keywordflow">if</span>(wit==windowBuffer.begin()+windowBuffer.size()/2)</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*wit!=inBuffer[(dimY-1)/2][x])</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>             outBuffer[x/down]=1;</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*wit==inBuffer[(dimY-1)/2][x]){<span class="comment">//todo:wit mag niet central pixel zijn</span></div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>             outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>           }</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         }</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       }</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="keywordflow">case</span>(filter2d::density):{</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           std::vector<short>::const_iterator vit=m_class.begin();</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           <span class="keywordflow">while</span>(vit!=m_class.end())</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>             outBuffer[x/down]+=100.0*occurrence[*(vit++)]/windowBuffer.size();</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>         }</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       }</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       <span class="keywordflow">case</span>(filter2d::countid):{</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     <span class="keywordflow">if</span>(windowBuffer.size())</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       outBuffer[x/down]=occurrence.size();</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>       }</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       <span class="keywordflow">case</span>(filter2d::mode):{</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>         <span class="keywordflow">if</span>(occurrence.size()){</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>           std::map<int,int>::const_iterator maxit=occurrence.begin();</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>           <span class="keywordflow">for</span>(std::map<int,int>::const_iterator mit=occurrence.begin();mit!=occurrence.end();++mit){</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>             <span class="keywordflow">if</span>(mit->second>maxit->second)</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>               maxit=mit;</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>           }</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>           <span class="keywordflow">if</span>(occurrence[inBuffer[(dimY-1)/2][x]]<maxit->second)<span class="comment">//</span></div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>             outBuffer[x/down]=maxit->first;</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>           <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>             outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>         }</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       }</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       <span class="keywordflow">case</span>(filter2d::threshold):{</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>         assert(m_class.size()==m_threshold.size());</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           outBuffer[x/down]=inBuffer[(dimY-1)/2][x];<span class="comment">//initialize with original value (in case thresholds not met)</span></div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>             <span class="keywordflow">if</span>(100.0*(occurrence[m_class[iclass]])/windowBuffer.size()>m_threshold[iclass])</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>               outBuffer[x/down]=m_class[iclass];</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>           }</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>         }</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       }</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       <span class="keywordflow">case</span>(filter2d::scramble):{<span class="comment">//could be done more efficiently window by window with random shuffling entire buffer and assigning entire buffer at once to output image...</span></div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       <span class="keywordtype">int</span> randomIndex=std::rand()%windowBuffer.size();</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       <span class="keywordflow">if</span>(randomIndex>=windowBuffer.size())</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>         outBuffer[x/down]=windowBuffer.back();</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(randomIndex<0)</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>         outBuffer[x/down]=windowBuffer[0];</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>         outBuffer[x/down]=windowBuffer[randomIndex];</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     }</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       }</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>       <span class="keywordflow">case</span>(filter2d::mixed):{</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>         <span class="keyword">enum</span> MixType { BF=11, CF=12, MF=13, NF=20, W=30 };</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>         <span class="keywordtype">double</span> nBF=occurrence[BF];</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         <span class="keywordtype">double</span> nCF=occurrence[CF];</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>         <span class="keywordtype">double</span> nMF=occurrence[MF];</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>         <span class="keywordtype">double</span> nNF=occurrence[NF];</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>         <span class="keywordtype">double</span> nW=occurrence[W];</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>           <span class="keywordflow">if</span>((nBF+nCF+nMF)&&(nBF+nCF+nMF>=nNF+nW)){<span class="comment">//forest</span></div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>             <span class="keywordflow">if</span>(nBF/(nBF+nCF)>=0.75)</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>               outBuffer[x/down]=BF;</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nCF/(nBF+nCF)>=0.75)</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>               outBuffer[x/down]=CF;</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>               outBuffer[x/down]=MF;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>           }</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>           <span class="keywordflow">else</span>{<span class="comment">//non-forest</span></div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>             <span class="keywordflow">if</span>(nW&&(nW>=nNF))</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>               outBuffer[x/down]=W;</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>               outBuffer[x/down]=NF;</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>           }</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>         }</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>           outBuffer[x/down]=inBuffer[indexJ][indexI];</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       }</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       }</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     }</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     progress=(1.0+y/down);</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     progress+=(outputVector.size());</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     progress/=outputVector.size();</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     <span class="comment">//copy outBuffer to outputVector</span></div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     outputVector[y/down]=outBuffer;</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>   }</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span> }</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span> </div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span> <span class="comment">// class Compare_mapValue{</span></div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span> <span class="comment">// public:</span></div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span> <span class="comment">//   int operator() (const map<int,int>::value_type& v1, const map<int, int>::value_type& v2) const{</span></div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span> <span class="comment">//     return (v1.second)>(v2.second);</span></div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span> <span class="comment">// };</span></div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span> </div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::shift(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span class="keywordtype">double</span> offsetX, <span class="keywordtype">double</span> o [...]
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   output.resize(input.nRows(),input.nCols());</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   <span class="keyword">const</span> gsl_rng_type *rangenType;</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>   gsl_rng *rangen;</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   gsl_rng_env_setup();</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   rangenType=gsl_rng_default;</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   rangen=gsl_rng_alloc(rangenType);</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   <span class="keywordtype">long</span> seed=time(NULL)*getpid();</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   gsl_rng_set(rangen,seed);</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<input.nRows();++j){</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i){</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       T theValue=0;</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordtype">double</span> randomX=0;</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <span class="keywordtype">double</span> randomY=0;</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordflow">if</span>(randomSigma>0){</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>         randomX=gsl_ran_gaussian(rangen,randomSigma);</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>         randomY=gsl_ran_gaussian(rangen,randomSigma);</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       }</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       <span class="keywordtype">double</span> readCol=i+offsetX+randomX;</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       <span class="keywordtype">double</span> readRow=j+offsetY+randomY;</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       <span class="keywordflow">if</span>(readRow<0)</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>         readRow=0;</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordflow">if</span>(readRow>input.nRows()-1)</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         readRow=input.nRows()-1;</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       <span class="keywordflow">if</span>(readCol<0)</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>         readCol=0;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       <span class="keywordflow">if</span>(readCol>input.nCols()-1)</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>         readCol=input.nCols()-1;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="keywordflow">switch</span>(resample){</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="keywordflow">case</span>(BILINEAR):{</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>         <span class="keywordtype">double</span> lowerRow=readRow-0.5;</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>         <span class="keywordtype">double</span> upperRow=readRow+0.5;</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>         lowerRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerRow);</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         upperRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperRow);</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>         <span class="keywordtype">double</span> lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>         <span class="keywordtype">double</span> upperCol=readCol+0.5;</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>         assert(lowerRow>=0);</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         assert(lowerRow<input.nRows());</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>         assert(lowerCol>=0);</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         assert(lowerCol<input.nCols());</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>         assert(upperRow>=0);</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>         assert(upperRow<input.nRows());</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>         assert(upperCol>=0);</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>         <span class="keywordflow">if</span>(upperCol>=input.nCols()){</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>           std::cout << <span class="stringliteral">"upperCol: "</span> << upperCol << std::endl;</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>           std::cout << <span class="stringliteral">"readCol: "</span> << readCol << std::endl;</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>           std::cout << <span class="stringliteral">"readCol+0.5: "</span> << readCol+0.5 << std::endl;</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>           std::cout << <span class="stringliteral">"static_cast<int>(readCol+0.5): "</span> << <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol+0.5) << std::endl;</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>         }</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>         assert(upperCol<input.nCols());</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>         <span class="keywordtype">double</span> c00=input[lowerRow][lowerCol];</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>         <span class="keywordtype">double</span> c11=input[upperRow][upperCol];</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         <span class="keywordtype">double</span> c01=input[lowerRow][upperCol];</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>         <span class="keywordtype">double</span> c10=input[upperRow][lowerCol];</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         <span class="keywordtype">double</span> a=(upperCol-readCol)*c00+(readCol-lowerCol)*c01;</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         <span class="keywordtype">double</span> b=(upperCol-readCol)*c10+(readCol-lowerCol)*c11;</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         theValue=(upperRow-readRow)*a+(readRow-lowerRow)*b;</div>
 <div class="line"><a name="l00638"></a><span class="lineno">  638</span>         <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l00639"></a><span class="lineno">  639</span>       }</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       assert(j>=0);</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       assert(j<output.nRows());</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>       assert(i>=0);</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       assert(i<output.nCols());</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>       output[j][i]=theValue;</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     }</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     progress=(1.0+j);</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     progress/=output.nRows();</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   }</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>   gsl_rng_free(rangen);</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span> }</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span> </div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::morphology(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span  [...]
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span> {</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span> </div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>         theValue=input[<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readRow)][static_cast<int>(readCol)];</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       }</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>       assert(j>=0);</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       assert(j<output.nRows());</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       assert(i>=0);</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>       assert(i<output.nCols());</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       output[j][i]=theValue;</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     }</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     progress=(1.0+j);</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     progress/=output.nRows();</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>   }</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>   gsl_rng_free(rangen);</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span> }</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span> </div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::morphology(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span  [...]
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span> {</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
 <div class="line"><a name="l00664"></a><span class="lineno">  664</span> </div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   assert(dimX);</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   assert(dimY);</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,input.nCols());</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   output.clear();</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   output.resize(input.nRows(),input.nCols());</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i)</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>       inBuffer[indexJ][i]=input[abs(j)][i];</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     ++indexJ;</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   }</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>       <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       <span class="keywordflow">if</span>(y+dimY/2<input.nRows()){</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>         inBuffer.push_back(inBuffer.back());</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i)</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>           inBuffer[inBuffer.size()-1][i]=input[y+dimY/2][i];</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       }</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>         <span class="keywordtype">int</span> over=y+dimY/2-input.nRows();</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>         assert(index>=0);</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>         assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>         inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       }</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     }</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       output[y][x]=0;</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       <span class="keywordtype">double</span> currentValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>       std::vector<double> statBuffer;</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       <span class="keywordtype">bool</span> currentMasked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>         <span class="keywordflow">if</span>(currentValue==m_noDataValues[imask]){</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>           currentMasked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>         }</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       }</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       output[y][x]=currentValue;<span class="comment">//introduced due to hThreshold</span></div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       <span class="keywordflow">if</span>(currentMasked){</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>         output[y][x]=currentValue;</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span> </div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   assert(dimX);</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   assert(dimY);</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,input.nCols());</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   output.clear();</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   output.resize(input.nRows(),input.nCols());</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>   <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i)</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       inBuffer[indexJ][i]=input[abs(j)][i];</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     ++indexJ;</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   }</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       <span class="keywordflow">if</span>(y+dimY/2<input.nRows()){</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>         inBuffer.push_back(inBuffer.back());</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i)</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>           inBuffer[inBuffer.size()-1][i]=input[y+dimY/2][i];</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>       }</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>         <span class="keywordtype">int</span> over=y+dimY/2-input.nRows();</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>         assert(index>=0);</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>         assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>         inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       }</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     }</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       output[y][x]=0;</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>       <span class="keywordtype">double</span> currentValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       std::vector<double> statBuffer;</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       <span class="keywordtype">bool</span> currentMasked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>         <span class="keywordflow">if</span>(currentValue==m_noDataValues[imask]){</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>           currentMasked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>         }</div>
 <div class="line"><a name="l00713"></a><span class="lineno">  713</span>       }</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>             <span class="keywordtype">double</span> d2=i*i+j*j;<span class="comment">//square distance</span></div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>             <span class="keywordflow">if</span>(disc&&(d2>(dimX/2)*(dimY/2)))</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>               <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>             indexI=x+i;</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>             <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>             <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>               indexI=-indexI;</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nCols())</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>               indexI=input.nCols()-i;</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>             <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>               indexJ=-j;</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nRows())</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>                 indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>                 indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==noDataValue)</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>               <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>             <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>               <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>                 masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>               }</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>             }</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>             <span class="keywordflow">if</span>(!masked){</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>               <span class="keywordtype">short</span> binValue=0;</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>                 <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass]){</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>                   binValue=1;</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>                   <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>                 }</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>               }</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>               <span class="keywordflow">if</span>(m_class.size())</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>                 statBuffer.push_back(binValue);</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>                 statBuffer.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>             }</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>           }</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>         }</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>         <span class="keywordflow">if</span>(statBuffer.size()){</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>           <span class="keywordflow">switch</span>(getFilterType(method)){</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>           <span class="keywordflow">case</span>(filter2d::dilate):</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>             <span class="keywordflow">if</span>(output[y][x]<stat.mymax(statBuffer)-hThreshold){</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>               output[y][x]=stat.mymax(statBuffer);</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>               ++nchange;</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>             }</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>           <span class="keywordflow">case</span>(filter2d::erode):</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>             <span class="keywordflow">if</span>(output[y][x]>stat.mymin(statBuffer)+hThreshold){</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>               output[y][x]=stat.mymin(statBuffer);</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>               ++nchange;</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>             }</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>             std::ostringstream ess;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>             ess << <span class="stringliteral">"Error:  morphology method "</span> << method << <span class="stringliteral">" not supported, choose "</span> << filter2d::dilate << <span class="stringliteral">" (dilate) or "</span> << filter2d::erode << <span class="stringliteral">" (erode)"</span> << std::endl;</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>             <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>           }</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>           <span class="keywordflow">if</span>(output[y][x]&&m_class.size())</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>             output[y][x]=m_class[0];</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>           <span class="comment">// else{</span></div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>           <span class="comment">//   assert(m_noDataValues.size());</span></div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>           <span class="comment">//   output[x]=m_noDataValues[0];</span></div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>           <span class="comment">// }</span></div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>         }</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>           output[y][x]=noDataValue;</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       }</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     }</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     progress/=output.nRows();</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>   }</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>   <span class="keywordflow">return</span> nchange;</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span> }</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span> </div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_nwse(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span> {</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span> </div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     noDataValue=m_noDataValues[0];</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span> </div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>   <span class="keywordtype">int</span> dimX=dim;</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>   <span class="keywordtype">int</span> dimY=dim;</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>   assert(dimX);</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>   assert(dimY);</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     outputMask.resize(inputDSM.nRows());</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>   <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>     ++indexJ;</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>   }</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<tmpDSM.nRows();++y){</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>       <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       <span class="keywordflow">if</span>(y+dimY/2<tmpDSM.nRows()){</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>         inBuffer.push_back(inBuffer.back());</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>           inBuffer[inBuffer.size()-1][i]=tmpDSM[y+dimY/2][i];</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       }</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>         <span class="keywordtype">int</span> over=y+dimY/2-tmpDSM.nRows();</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>         assert(index>=0);</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>         assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>         inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       }</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     }</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<tmpDSM.nCols();++x){</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       <span class="keywordtype">short</span> nmasked=0;</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       std::vector<T> neighbors;</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>       indexI=x+i;</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>       <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>         indexI=-indexI;</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>         indexI=tmpDSM.nCols()-i;</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>       <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>         indexJ=-j;</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>         ++nmasked;</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>     }</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       }</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>     ++nchange;</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>     <span class="comment">//reset pixel in outputMask</span></div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>     outputMask[y][x]=0;</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       }</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>     sort(neighbors.begin(),neighbors.end());</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>     assert(neighbors.size()>1);</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       }</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>     }</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     progress/=outputMask.nRows();</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>   }</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>   <span class="keywordflow">return</span> nchange;</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span> }</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span> </div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_nesw(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span> {</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span> </div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>     noDataValue=m_noDataValues[0];</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span> </div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>   <span class="keywordtype">int</span> dimX=dim;</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>   <span class="keywordtype">int</span> dimY=dim;</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>   assert(dimX);</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>   assert(dimY);</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>     outputMask.resize(inputDSM.nRows());</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>   <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>     ++indexJ;</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>   }</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<tmpDSM.nRows();++y){</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       <span class="keywordflow">if</span>(y+dimY/2<tmpDSM.nRows()){</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>         inBuffer.push_back(inBuffer.back());</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>           inBuffer[inBuffer.size()-1][i]=tmpDSM[y+dimY/2][i];</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       }</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>         <span class="keywordtype">int</span> over=y+dimY/2-tmpDSM.nRows();</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>         assert(index>=0);</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>         assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>         inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       }</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     }</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=tmpDSM.nCols()-1;x>=0;--x){</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       <span class="keywordtype">short</span> nmasked=0;</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       std::vector<T> neighbors;</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       indexI=x+i;</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>       <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>         indexI=-indexI;</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>         indexI=tmpDSM.nCols()-i;</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>         indexJ=-j;</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>         indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>         ++nmasked;</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>     }</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       }</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>     ++nchange;</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>     <span class="comment">//reset pixel in outputMask</span></div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>     outputMask[y][x]=0;</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       }</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>     sort(neighbors.begin(),neighbors.end());</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>     assert(neighbors.size()>1);</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       }</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>     }</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>     progress/=outputMask.nRows();</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>   }</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>   <span class="keywordflow">return</span> nchange;</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span> }</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span> </div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_senw(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span> {</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span> </div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     noDataValue=m_noDataValues[0];</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span> </div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>   <span class="keywordtype">int</span> dimX=dim;</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>   <span class="keywordtype">int</span> dimY=dim;</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>   assert(dimX);</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>   assert(dimY);</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     outputMask.resize(inputDSM.nRows());</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>   <span class="keywordtype">int</span> indexJ=inputDSM.nRows()-1;</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>   <span class="comment">//initialize first half of inBuffer</span></div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=inputDSM.nRows()-dimY/2;j<inputDSM.nRows();--j){</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>     ++indexJ;</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>   }</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=tmpDSM.nRows()-1;y>=0;--y){</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>     <span class="keywordflow">if</span>(y<tmpDSM.nRows()-1){<span class="comment">//inBuffer already initialized for y=tmpDSM.nRows()-1</span></div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>       <span class="comment">//erase last line from inBuffer</span></div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       inBuffer.erase(inBuffer.end()-1);</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>       <span class="comment">//read extra line and insert to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       <span class="keywordflow">if</span>(y-dimY/2>0){</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         inBuffer.insert(inBuffer.begin(),inBuffer.back());</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>           inBuffer[0][i]=tmpDSM[y-dimY/2][i];</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>       }</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>         inBuffer.insert(inBuffer.begin(),inBuffer[abs(y-dimY/2)]);</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>       }</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>     }</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=tmpDSM.nCols()-1;x>=0;--x){</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>       <span class="keywordtype">short</span> nmasked=0;</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>       std::vector<T> neighbors;</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       indexI=x+i;</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>       <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>       <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>         indexI=-indexI;</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>         indexI=tmpDSM.nCols()-i;</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>       <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>         indexJ=-j;</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>         indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>         ++nmasked;</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>     }</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>       }</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>     ++nchange;</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>     <span class="comment">//reset pixel in outputMask</span></div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>     outputMask[y][x]=0;</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>       }</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>     sort(neighbors.begin(),neighbors.end());</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>     assert(neighbors.size()>1);</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>       }</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>     }</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>     progress/=outputMask.nRows();</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>   }</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>   <span class="keywordflow">return</span> nchange;</div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span> }</div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> </div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_swne(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> {</div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span> </div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>     noDataValue=m_noDataValues[0];</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span> </div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>   <span class="keywordtype">int</span> dimX=dim;</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>   <span class="keywordtype">int</span> dimY=dim;</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>   assert(dimX);</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>   assert(dimY);</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>     outputMask.resize(inputDSM.nRows());</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>   <span class="comment">//initialize first half of inBuffer</span></div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=inputDSM.nRows()-dimY/2;j<inputDSM.nRows();--j){</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>     ++indexJ;</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>   }</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=tmpDSM.nRows()-1;y>=0;--y){</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>     <span class="keywordflow">if</span>(y<tmpDSM.nRows()-1){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>       <span class="comment">//erase last line from inBuffer</span></div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>       inBuffer.erase(inBuffer.end()-1);</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>       <span class="comment">//read extra line and insert to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>       <span class="keywordflow">if</span>(y-dimY/2>0){</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         inBuffer.insert(inBuffer.begin(),inBuffer.back());</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>           inBuffer[0][i]=tmpDSM[y-dimY/2][i];</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>       }</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>         inBuffer.insert(inBuffer.begin(),inBuffer[abs(y-dimY/2)]);</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       }</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>     }</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<tmpDSM.nCols();++x){</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>       <span class="keywordtype">short</span> nmasked=0;</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>       std::vector<T> neighbors;</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>       indexI=x+i;</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>       <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>         indexI=-indexI;</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>         indexI=tmpDSM.nCols()-i;</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>       <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>         indexJ=-j;</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>         indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>         ++nmasked;</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>     }</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       }</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>     ++nchange;</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>     <span class="comment">//reset pixel in outputMask</span></div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>     outputMask[y][x]=0;</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       }</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>     sort(neighbors.begin(),neighbors.end());</div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>     assert(neighbors.size()>1);</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>       }</div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>     }</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>     progress/=outputMask.nRows();</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>   }</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>   <span class="keywordflow">return</span> nchange;</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span> }</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span> </div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::shadowDsm(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span class="keywordtype">double</span> sza, <span class="keywordtype">double</span> [...]
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span> {</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ncols=input.nCols();</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>   output.clear();</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>   output.resize(input.nRows(),ncols);</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>   <span class="comment">//do we need to initialize output?</span></div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>   <span class="comment">// for(int y=0;y<output.nRows();++y)</span></div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>   <span class="comment">//   for(int x=0;x<output.nCols();++x)</span></div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>   <span class="comment">//     output[y][x]=0;</span></div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>       <span class="keywordtype">double</span> currentValue=input[y][x];</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       <span class="keywordtype">int</span> theDist=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(sqrt((currentValue*tan(DEG2RAD(sza))/pixelSize)*(currentValue*tan(DEG2RAD(sza))/pixelSize)));<span class="comment">//in pixels</span></div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>       <span class="keywordtype">double</span> theDir=DEG2RAD(saa)+PI/2.0;</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>       <span class="keywordflow">if</span>(theDir<0)</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>         theDir+=2*PI;</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> d=0;d<theDist;++d){<span class="comment">//d in pixels</span></div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>         indexI=x+d*cos(theDir);<span class="comment">//in pixels</span></div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>         indexJ=y+d*sin(theDir);<span class="comment">//in pixels</span></div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>         <span class="keywordflow">if</span>(indexJ<0||indexJ>=input.size())</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>         <span class="keywordflow">if</span>(indexI<0||indexI>=input[indexJ].size())</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>         <span class="keywordflow">if</span>(input[indexJ][indexI]<currentValue-d*pixelSize/tan(DEG2RAD(sza))){<span class="comment">//in m</span></div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>           output[indexJ][indexI]=shadowFlag;</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>         }</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>       }</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>     }</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>     progress/=output.nRows();</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>   }</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span> }</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span> </div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtForward(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span> </div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>   assert(nRow);</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>   assert(nCol);</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>   <span class="comment">//make sure data size if power of 2</span></div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>     theBuffer.push_back(theBuffer.back());</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>   std::vector<double> vdata(theBuffer.size()*theBuffer[0].size());</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>   <span class="keywordtype">double</span>* data=&(vdata[0]);</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>       data[index]=theBuffer[irow][icol];</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     }</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>   }</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>   gsl_wavelet *w;</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>   gsl_wavelet_workspace *work;</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>   assert(nsize);</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>   gsl_wavelet2d_nstransform_forward (w, data, theBuffer.size(), theBuffer.size(),theBuffer[0].size(), work);</div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>       theBuffer[irow][icol]=data[index];</div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>     }</div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>     progress=(1.0+irow);</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>     progress/=theBuffer.nRows();</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>   }</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>   gsl_wavelet_free (w);</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>   gsl_wavelet_workspace_free (work);</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span> }</div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> </div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtInverse(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span> </div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>   assert(nRow);</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>   assert(nCol);</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>   <span class="comment">//make sure data size if power of 2</span></div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>     theBuffer.push_back(theBuffer.back());</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>   std::vector<double> vdata(theBuffer.size()*theBuffer[0].size());</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>   <span class="keywordtype">double</span>* data=&(vdata[0]);</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>   <span class="comment">//double data[theBuffer.size()*theBuffer[0].size()];</span></div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>       data[index]=theBuffer[irow][icol];</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>     }</div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>   }</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>   gsl_wavelet *w;</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>   gsl_wavelet_workspace *work;</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>   assert(nsize);</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>   gsl_wavelet2d_nstransform_inverse (w, data, theBuffer.size(), theBuffer.size(),theBuffer[0].size(), work);</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>       theBuffer[irow][icol]=data[index];</div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>     }</div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>     progress=(1.0+irow);</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>     progress/=theBuffer.nRows();</div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>   }</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>   gsl_wavelet_free (w);</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>   gsl_wavelet_workspace_free (work);</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span> }</div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span> </div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtCut(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut){</div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span> </div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>   assert(nRow);</div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>   assert(nCol);</div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>   <span class="comment">//make sure data size if power of 2</span></div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>     theBuffer.push_back(theBuffer.back());</div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>   <span class="keywordtype">double</span>* data=<span class="keyword">new</span> <span class="keywordtype">double</span>[theBuffer.size()*theBuffer[0].size()];</div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>   <span class="keywordtype">double</span>* abscoeff=<span class="keyword">new</span> <span class="keywordtype">double</span>[theBuffer.size()*theBuffer[0].size()];</div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>   <span class="keywordtype">size_t</span>* p=<span class="keyword">new</span> <span class="keywordtype">size_t</span>[theBuffer.size()*theBuffer[0].size()];</div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>       assert(index<theBuffer.size()*theBuffer[0].size());</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>       data[index]=theBuffer[irow][icol];</div>
-<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>     }</div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>   }</div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>   gsl_wavelet *w;</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>   gsl_wavelet_workspace *work;</div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>   assert(nsize);</div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>   gsl_wavelet2d_nstransform_forward (w, data, theBuffer.size(), theBuffer[0].size(),theBuffer[0].size(), work);</div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>       abscoeff[index]=fabs(data[index]);</div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>     }</div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>   }</div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>   <span class="keywordtype">int</span> nc=(100-cut)/100.0*nsize;</div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>   gsl_sort_index(p,abscoeff,1,nsize);</div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;(i+nc)<nsize;i++)</div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>    data[p[i]]=0;</div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>   gsl_wavelet2d_nstransform_inverse (w, data, theBuffer.size(), theBuffer[0].size(),theBuffer[0].size(), work);</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>       theBuffer[irow][icol]=data[index];</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>     }</div>
-<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>     progress=(1.0+irow);</div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>     progress/=theBuffer.nRows();</div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>   }</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
-<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
-<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
-<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>   <span class="keyword">delete</span>[] data;</div>
-<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>   <span class="keyword">delete</span>[] abscoeff;</div>
-<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>   <span class="keyword">delete</span>[] p;</div>
-<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>   gsl_wavelet_free (w);</div>
-<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>   gsl_wavelet_workspace_free (work);</div>
-<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span> </div>
-<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span> }</div>
-<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span> </div>
-<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> }</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       output[y][x]=currentValue;<span class="comment">//introduced due to hThreshold</span></div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>       <span class="keywordflow">if</span>(currentMasked){</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>         output[y][x]=currentValue;</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       }</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>             <span class="keywordtype">double</span> d2=i*i+j*j;<span class="comment">//square distance</span></div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>             <span class="keywordflow">if</span>(disc&&(d2>(dimX/2)*(dimY/2)))</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>               <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>             indexI=x+i;</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>             <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>             <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>               indexI=-indexI;</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nCols())</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>               indexI=input.nCols()-i;</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>             <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>               indexJ=-j;</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nRows())</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>                 indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>                 indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==noDataValue)</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>               <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>             <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>               <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>                 masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>               }</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>             }</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>             <span class="keywordflow">if</span>(!masked){</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>               <span class="keywordtype">short</span> binValue=0;</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>                 <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass]){</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>                   binValue=1;</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>                   <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>                 }</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>               }</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>               <span class="keywordflow">if</span>(m_class.size())</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>                 statBuffer.push_back(binValue);</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>                 statBuffer.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>             }</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>           }</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>         }</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>         <span class="keywordflow">if</span>(statBuffer.size()){</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>           <span class="keywordflow">switch</span>(getFilterType(method)){</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>           <span class="keywordflow">case</span>(filter2d::dilate):</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>             <span class="keywordflow">if</span>(output[y][x]<stat.mymax(statBuffer)-hThreshold){</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>               output[y][x]=stat.mymax(statBuffer);</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>               ++nchange;</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>             }</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>           <span class="keywordflow">case</span>(filter2d::erode):</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>             <span class="keywordflow">if</span>(output[y][x]>stat.mymin(statBuffer)+hThreshold){</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>               output[y][x]=stat.mymin(statBuffer);</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>               ++nchange;</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>             }</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>             std::ostringstream ess;</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>             ess << <span class="stringliteral">"Error:  morphology method "</span> << method << <span class="stringliteral">" not supported, choose "</span> << filter2d::dilate << <span class="stringliteral">" (dilate) or "</span> << filter2d::erode << <span class="stringliteral">" (erode)"</span> << std::endl;</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>             <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>           }</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>           <span class="keywordflow">if</span>(output[y][x]&&m_class.size())</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>             output[y][x]=m_class[0];</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>           <span class="comment">// else{</span></div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>           <span class="comment">//   assert(m_noDataValues.size());</span></div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>           <span class="comment">//   output[x]=m_noDataValues[0];</span></div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>           <span class="comment">// }</span></div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>         }</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>           output[y][x]=noDataValue;</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       }</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     }</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     progress/=output.nRows();</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>   }</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>   <span class="keywordflow">return</span> nchange;</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span> }</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span> </div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_nwse(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span> {</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span> </div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span> </div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>   <span class="keywordtype">int</span> dimX=dim;</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>   <span class="keywordtype">int</span> dimY=dim;</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>   assert(dimX);</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>   assert(dimY);</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     outputMask.resize(inputDSM.nRows());</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>   <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     ++indexJ;</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>   }</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<tmpDSM.nRows();++y){</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>       <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       <span class="keywordflow">if</span>(y+dimY/2<tmpDSM.nRows()){</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>         inBuffer.push_back(inBuffer.back());</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>           inBuffer[inBuffer.size()-1][i]=tmpDSM[y+dimY/2][i];</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>       }</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>         <span class="keywordtype">int</span> over=y+dimY/2-tmpDSM.nRows();</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         assert(index>=0);</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>         assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>         inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       }</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     }</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<tmpDSM.nCols();++x){</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>       <span class="keywordtype">short</span> nmasked=0;</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       std::vector<T> neighbors;</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>       indexI=x+i;</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>       <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>         indexI=-indexI;</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>         indexI=tmpDSM.nCols()-i;</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         indexJ=-j;</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>         indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>         ++nmasked;</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>     }</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       }</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>     ++nchange;</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     <span class="comment">//reset pixel in outputMask</span></div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>     outputMask[y][x]=0;</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       }</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>     sort(neighbors.begin(),neighbors.end());</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>     assert(neighbors.size()>1);</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       }</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>     }</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     progress/=outputMask.nRows();</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>   }</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>   <span class="keywordflow">return</span> nchange;</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span> }</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span> </div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_nesw(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span> {</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span> </div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span> </div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>   <span class="keywordtype">int</span> dimX=dim;</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>   <span class="keywordtype">int</span> dimY=dim;</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>   assert(dimX);</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>   assert(dimY);</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>     outputMask.resize(inputDSM.nRows());</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>   <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     ++indexJ;</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>   }</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<tmpDSM.nRows();++y){</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>       <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       <span class="keywordflow">if</span>(y+dimY/2<tmpDSM.nRows()){</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>         inBuffer.push_back(inBuffer.back());</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>           inBuffer[inBuffer.size()-1][i]=tmpDSM[y+dimY/2][i];</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       }</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>         <span class="keywordtype">int</span> over=y+dimY/2-tmpDSM.nRows();</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>         assert(index>=0);</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>         assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>         inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       }</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     }</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=tmpDSM.nCols()-1;x>=0;--x){</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       <span class="keywordtype">short</span> nmasked=0;</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>       std::vector<T> neighbors;</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       indexI=x+i;</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>         indexI=-indexI;</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>         indexI=tmpDSM.nCols()-i;</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>       <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>         indexJ=-j;</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>         indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>         ++nmasked;</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>     }</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>       }</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>     ++nchange;</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     <span class="comment">//reset pixel in outputMask</span></div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>     outputMask[y][x]=0;</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>       }</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>     sort(neighbors.begin(),neighbors.end());</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>     assert(neighbors.size()>1);</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>       }</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>     }</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>     progress/=outputMask.nRows();</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>   }</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>   <span class="keywordflow">return</span> nchange;</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span> }</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span> </div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_senw(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span> {</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span> </div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span> </div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>   <span class="keywordtype">int</span> dimX=dim;</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>   <span class="keywordtype">int</span> dimY=dim;</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>   assert(dimX);</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>   assert(dimY);</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>     outputMask.resize(inputDSM.nRows());</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>   <span class="keywordtype">int</span> indexJ=inputDSM.nRows()-1;</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>   <span class="comment">//initialize first half of inBuffer</span></div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=inputDSM.nRows()-dimY/2;j<inputDSM.nRows();--j){</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>     ++indexJ;</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>   }</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=tmpDSM.nRows()-1;y>=0;--y){</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>     <span class="keywordflow">if</span>(y<tmpDSM.nRows()-1){<span class="comment">//inBuffer already initialized for y=tmpDSM.nRows()-1</span></div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>       <span class="comment">//erase last line from inBuffer</span></div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>       inBuffer.erase(inBuffer.end()-1);</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>       <span class="comment">//read extra line and insert to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>       <span class="keywordflow">if</span>(y-dimY/2>0){</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         inBuffer.insert(inBuffer.begin(),inBuffer.back());</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>           inBuffer[0][i]=tmpDSM[y-dimY/2][i];</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>       }</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         inBuffer.insert(inBuffer.begin(),inBuffer[abs(y-dimY/2)]);</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>       }</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>     }</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=tmpDSM.nCols()-1;x>=0;--x){</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       <span class="keywordtype">short</span> nmasked=0;</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>       std::vector<T> neighbors;</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       indexI=x+i;</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>       <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>       <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>         indexI=-indexI;</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>         indexI=tmpDSM.nCols()-i;</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>       <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>         indexJ=-j;</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>         indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>         ++nmasked;</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>     }</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>       }</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>     ++nchange;</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>     <span class="comment">//reset pixel in outputMask</span></div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>     outputMask[y][x]=0;</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>       }</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>     sort(neighbors.begin(),neighbors.end());</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>     assert(neighbors.size()>1);</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>       }</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>     }</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>     progress/=outputMask.nRows();</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>   }</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>   <span class="keywordflow">return</span> nchange;</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span> }</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span> </div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_swne(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span> {</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span> </div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span> </div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>   <span class="keywordtype">int</span> dimX=dim;</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>   <span class="keywordtype">int</span> dimY=dim;</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>   assert(dimX);</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>   assert(dimY);</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>     outputMask.resize(inputDSM.nRows());</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>   <span class="comment">//initialize first half of inBuffer</span></div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=inputDSM.nRows()-dimY/2;j<inputDSM.nRows();--j){</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>     ++indexJ;</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>   }</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=tmpDSM.nRows()-1;y>=0;--y){</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>     <span class="keywordflow">if</span>(y<tmpDSM.nRows()-1){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>       <span class="comment">//erase last line from inBuffer</span></div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>       inBuffer.erase(inBuffer.end()-1);</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>       <span class="comment">//read extra line and insert to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>       <span class="keywordflow">if</span>(y-dimY/2>0){</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         inBuffer.insert(inBuffer.begin(),inBuffer.back());</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>           inBuffer[0][i]=tmpDSM[y-dimY/2][i];</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>       }</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         inBuffer.insert(inBuffer.begin(),inBuffer[abs(y-dimY/2)]);</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>       }</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>     }</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<tmpDSM.nCols();++x){</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>       <span class="keywordtype">short</span> nmasked=0;</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       std::vector<T> neighbors;</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>       indexI=x+i;</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>       <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>       <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>         indexI=-indexI;</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         indexI=tmpDSM.nCols()-i;</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>         indexJ=-j;</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>         indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>         ++nmasked;</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>     }</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       }</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>     ++nchange;</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>     <span class="comment">//reset pixel in outputMask</span></div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>     outputMask[y][x]=0;</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>       }</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>     sort(neighbors.begin(),neighbors.end());</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>     assert(neighbors.size()>1);</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>       }</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>     }</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>     progress/=outputMask.nRows();</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>   }</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>   <span class="keywordflow">return</span> nchange;</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span> }</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span> </div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::shadowDsm(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span class="keywordtype">double</span> sza, <span class="keywordtype">double</span> [...]
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span> {</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ncols=input.nCols();</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>   output.clear();</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>   output.resize(input.nRows(),ncols);</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>   <span class="comment">//do we need to initialize output?</span></div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>   <span class="comment">// for(int y=0;y<output.nRows();++y)</span></div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>   <span class="comment">//   for(int x=0;x<output.nCols();++x)</span></div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>   <span class="comment">//     output[y][x]=0;</span></div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>       <span class="keywordtype">double</span> currentValue=input[y][x];</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       <span class="keywordtype">int</span> theDist=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(sqrt((currentValue*tan(DEG2RAD(sza))/pixelSize)*(currentValue*tan(DEG2RAD(sza))/pixelSize)));<span class="comment">//in pixels</span></div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>       <span class="keywordtype">double</span> theDir=DEG2RAD(saa)+PI/2.0;</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>       <span class="keywordflow">if</span>(theDir<0)</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>         theDir+=2*PI;</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> d=0;d<theDist;++d){<span class="comment">//d in pixels</span></div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>         indexI=x+d*cos(theDir);<span class="comment">//in pixels</span></div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>         indexJ=y+d*sin(theDir);<span class="comment">//in pixels</span></div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>         <span class="keywordflow">if</span>(indexJ<0||indexJ>=input.size())</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>         <span class="keywordflow">if</span>(indexI<0||indexI>=input[indexJ].size())</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>         <span class="keywordflow">if</span>(input[indexJ][indexI]<currentValue-d*pixelSize/tan(DEG2RAD(sza))){<span class="comment">//in m</span></div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>           output[indexJ][indexI]=shadowFlag;</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>         }</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>       }</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>     }</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>     progress/=output.nRows();</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>   }</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span> }</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span> </div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtForward(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span> </div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>   assert(nRow);</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>   assert(nCol);</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>   <span class="comment">//make sure data size if power of 2</span></div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>     theBuffer.push_back(theBuffer.back());</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>   std::vector<double> vdata(theBuffer.size()*theBuffer[0].size());</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>   <span class="keywordtype">double</span>* data=&(vdata[0]);</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       data[index]=theBuffer[irow][icol];</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>     }</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>   }</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>   gsl_wavelet *w;</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>   gsl_wavelet_workspace *work;</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>   assert(nsize);</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>   gsl_wavelet2d_nstransform_forward (w, data, theBuffer.size(), theBuffer.size(),theBuffer[0].size(), work);</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>       theBuffer[irow][icol]=data[index];</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>     }</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>     progress=(1.0+irow);</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>     progress/=theBuffer.nRows();</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>   }</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>   gsl_wavelet_free (w);</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>   gsl_wavelet_workspace_free (work);</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span> }</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span> </div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtInverse(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span> </div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>   assert(nRow);</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>   assert(nCol);</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>   <span class="comment">//make sure data size if power of 2</span></div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>     theBuffer.push_back(theBuffer.back());</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>   std::vector<double> vdata(theBuffer.size()*theBuffer[0].size());</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>   <span class="keywordtype">double</span>* data=&(vdata[0]);</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>   <span class="comment">//double data[theBuffer.size()*theBuffer[0].size()];</span></div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>       data[index]=theBuffer[irow][icol];</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>     }</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>   }</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>   gsl_wavelet *w;</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>   gsl_wavelet_workspace *work;</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>   assert(nsize);</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>   gsl_wavelet2d_nstransform_inverse (w, data, theBuffer.size(), theBuffer.size(),theBuffer[0].size(), work);</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>       theBuffer[irow][icol]=data[index];</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>     }</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>     progress=(1.0+irow);</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>     progress/=theBuffer.nRows();</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>   }</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>   gsl_wavelet_free (w);</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>   gsl_wavelet_workspace_free (work);</div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span> }</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span> </div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtCut(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut){</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> </div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>   assert(nRow);</div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>   assert(nCol);</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>   <span class="comment">//make sure data size if power of 2</span></div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>     theBuffer.push_back(theBuffer.back());</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>   <span class="keywordtype">double</span>* data=<span class="keyword">new</span> <span class="keywordtype">double</span>[theBuffer.size()*theBuffer[0].size()];</div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>   <span class="keywordtype">double</span>* abscoeff=<span class="keyword">new</span> <span class="keywordtype">double</span>[theBuffer.size()*theBuffer[0].size()];</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>   <span class="keywordtype">size_t</span>* p=<span class="keyword">new</span> <span class="keywordtype">size_t</span>[theBuffer.size()*theBuffer[0].size()];</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>       assert(index<theBuffer.size()*theBuffer[0].size());</div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>       data[index]=theBuffer[irow][icol];</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>     }</div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>   }</div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>   gsl_wavelet *w;</div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>   gsl_wavelet_workspace *work;</div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>   assert(nsize);</div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>   gsl_wavelet2d_nstransform_forward (w, data, theBuffer.size(), theBuffer[0].size(),theBuffer[0].size(), work);</div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>       abscoeff[index]=fabs(data[index]);</div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>     }</div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>   }</div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>   <span class="keywordtype">int</span> nc=(100-cut)/100.0*nsize;</div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>   gsl_sort_index(p,abscoeff,1,nsize);</div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;(i+nc)<nsize;i++)</div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>    data[p[i]]=0;</div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>   gsl_wavelet2d_nstransform_inverse (w, data, theBuffer.size(), theBuffer[0].size(),theBuffer[0].size(), work);</div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>       theBuffer[irow][icol]=data[index];</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>     }</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>     progress=(1.0+irow);</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>     progress/=theBuffer.nRows();</div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>   }</div>
+<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
+<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
+<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
+<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>   <span class="keyword">delete</span>[] data;</div>
+<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>   <span class="keyword">delete</span>[] abscoeff;</div>
+<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>   <span class="keyword">delete</span>[] p;</div>
+<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>   gsl_wavelet_free (w);</div>
+<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>   gsl_wavelet_workspace_free (work);</div>
 <div class="line"><a name="l01364"></a><span class="lineno"> 1364</span> </div>
-<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span> <span class="preprocessor">#endif </span><span class="comment">/* _MYFILTER_H_ */</span><span class="preprocessor"></span></div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span> }</div>
+<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span> </div>
+<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span> }</div>
+<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span> </div>
+<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span> <span class="preprocessor">#endif </span><span class="comment">/* _MYFILTER_H_ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classfilter2d_1_1Filter2d_html"><div class="ttname"><a href="classfilter2d_1_1Filter2d.html">filter2d::Filter2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Filter2d_8h_source.html#l00065">Filter2d.h:65</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
@@ -1426,7 +1430,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Filter_8cc_source.html b/doc/html/Filter_8cc_source.html
index 574b21e..9c53e6a 100644
--- a/doc/html/Filter_8cc_source.html
+++ b/doc/html/Filter_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -105,671 +105,748 @@
 <div class="line"><a name="l00051"></a><span class="lineno">   51</span>   assert(m_taps.size()%2);</div>
 <div class="line"><a name="l00052"></a><span class="lineno">   52</span> }</div>
 <div class="line"><a name="l00053"></a><span class="lineno">   53</span> </div>
-<div class="line"><a name="l00054"></a><span class="lineno">   54</span> <span class="keywordtype">int</span> filter::Filter::pushNoDataValue(<span class="keywordtype">double</span> noDataValue)</div>
-<div class="line"><a name="l00055"></a><span class="lineno">   55</span> {</div>
-<div class="line"><a name="l00056"></a><span class="lineno">   56</span>   <span class="keywordflow">if</span>(find(m_noDataValues.begin(),m_noDataValues.end(),noDataValue)==m_noDataValues.end())</div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>     m_noDataValues.push_back(noDataValue);</div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>   <span class="keywordflow">return</span>(m_noDataValues.size());</div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span> }</div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span> </div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span> <span class="keywordtype">void</span> filter::Filter::dwtForward(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>     vector<double> pixelInput(input.nrOfBand());</div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>       pixelInput=lineInput.selectCol(x);</div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>       dwtForward(pixelInput,wavelet_type,family);</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>         lineOutput[iband][x]=pixelInput[iband];</div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>     }</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>       }</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>       }</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>     }</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>     progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   }</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span> }</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span> </div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span> <span class="keywordtype">void</span> filter::Filter::dwtInverse(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     vector<double> pixelInput(input.nrOfBand());</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>       pixelInput=lineInput.selectCol(x);</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>       dwtInverse(pixelInput,wavelet_type,family);</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         lineOutput[iband][x]=pixelInput[iband];</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>     }</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>       }</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>       }</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     }</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   }</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span> }</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span> </div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span> <span class="keywordtype">void</span> filter::Filter::dwtCut(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut){</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     vector<double> pixelInput(input.nrOfBand());</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>       pixelInput=lineInput.selectCol(x);</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>       dwtCut(pixelInput,wavelet_type,family,cut);</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>         lineOutput[iband][x]=pixelInput[iband];</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     }</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>       }</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>       }</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     }</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   }</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span> }</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span> </div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span> <span class="keywordtype">void</span> filter::Filter::dwtCutFrom(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">int</span> band){</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     vector<double> pixelInput(input.nrOfBand());</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>       pixelInput=lineInput.selectCol(x);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>       dwtForward(pixelInput,wavelet_type,family);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     <span class="keywordflow">if</span>(iband>=band)</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>       pixelInput[iband]=0;</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>       }</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>       dwtInverse(pixelInput,wavelet_type,family);</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     lineOutput[iband][x]=pixelInput[iband];</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     }</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>       }</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>       }</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     }</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   }</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span> }</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span> </div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span> <span class="comment">//todo: support different padding strategies</span></div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span> <span class="keywordtype">void</span> filter::Filter::dwtForward(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="keywordtype">int</span> origsize=data.size();</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <span class="comment">//make sure data size if power of 2</span></div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   <span class="keywordflow">while</span>(data.size()&(data.size()-1))</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     data.push_back(data.back());</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>       </div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <span class="keywordtype">int</span> nsize=data.size();</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   gsl_wavelet *w;</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   gsl_wavelet_workspace *work;</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   assert(nsize);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   w=gsl_wavelet_alloc(getWaveletType(wavelet_type),family);</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   gsl_wavelet_transform_forward(w,&(data[0]),1,nsize,work);</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   data.erase(data.begin()+origsize,data.end());</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   gsl_wavelet_free (w);</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   gsl_wavelet_workspace_free (work);</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span> }</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span> </div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span> <span class="comment">//todo: support different padding strategies</span></div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span> <span class="keywordtype">void</span> filter::Filter::dwtInverse(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   <span class="keywordtype">int</span> origsize=data.size();</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   <span class="comment">//make sure data size if power of 2</span></div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordflow">while</span>(data.size()&(data.size()-1))</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     data.push_back(data.back());</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   <span class="keywordtype">int</span> nsize=data.size();</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   gsl_wavelet *w;</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   gsl_wavelet_workspace *work;</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   assert(nsize);</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   w=gsl_wavelet_alloc(getWaveletType(wavelet_type),family);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   gsl_wavelet_transform_inverse(w,&(data[0]),1,nsize,work);</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   data.erase(data.begin()+origsize,data.end());</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   gsl_wavelet_free (w);</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   gsl_wavelet_workspace_free (work);</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span> }</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span> </div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span> <span class="comment">//todo: support different padding strategies</span></div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span> <span class="keywordtype">void</span> filter::Filter::dwtCut(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut){</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <span class="keywordtype">int</span> origsize=data.size();</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <span class="comment">//make sure data size if power of 2</span></div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   <span class="keywordflow">while</span>(data.size()&(data.size()-1))</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     data.push_back(data.back());</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   <span class="keywordtype">int</span> nsize=data.size();</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   gsl_wavelet *w;</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   gsl_wavelet_workspace *work;</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   assert(nsize);</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   w=gsl_wavelet_alloc(getWaveletType(wavelet_type),family);</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   gsl_wavelet_transform_forward(w,&(data[0]),1,nsize,work);</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   std::vector<double> abscoeff(data.size());</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="keywordtype">size_t</span>* p=<span class="keyword">new</span> <span class="keywordtype">size_t</span>[data.size()];</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<data.size();++index){</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     abscoeff[index]=fabs(data[index]);</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   }</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordtype">int</span> nc=(100-cut)/100.0*nsize;</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   gsl_sort_index(p,&(abscoeff[0]),1,nsize);</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;(i+nc)<nsize;i++)</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     data[p[i]]=0;</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   gsl_wavelet_transform_inverse(w,&(data[0]),1,nsize,work);</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   data.erase(data.begin()+origsize,data.end());</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <span class="keyword">delete</span>[] p;</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   gsl_wavelet_free (w);</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   gsl_wavelet_workspace_free (work);</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span> }</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span> </div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span> <span class="keywordtype">void</span> filter::Filter::morphology(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim, <span class="keywordtype">short</span> verbose)</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span> {</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="comment">// bool bverbose=(verbose>1)? true:false;</span></div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     vector<double> pixelInput(input.nrOfBand());</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     vector<double> pixelOutput(input.nrOfBand());</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>       pixelInput=lineInput.selectCol(x);</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       filter(pixelInput,pixelOutput,method,dim);</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>       <span class="comment">// morphology(pixelInput,pixelOutput,method,dim,bverbose);</span></div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>         lineOutput[iband][x]=pixelOutput[iband];</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     }</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>       }</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>       }</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     }</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   }</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span> }</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span> </div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span> <span class="keywordtype">void</span> filter::Filter::smoothNoData(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <span class="keyword">const</span> std::string& interpolationType, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output)</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span> {</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     vector<double> pixelInput(input.nrOfBand());</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     vector<double> pixelOutput(input.nrOfBand());</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       pixelInput=lineInput.selectCol(x);</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       smoothNoData(pixelInput,interpolationType,pixelOutput);</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         lineOutput[iband][x]=pixelOutput[iband];</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     }</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>       }</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       }</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     }</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   }</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span> }</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span> </div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span> <span class="keywordtype">void</span> filter::Filter::smooth(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">short</span> dim)</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span> {</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>   assert(dim>0);</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>   m_taps.resize(dim);</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<dim;++itap)</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     m_taps[itap]=1.0/dim;</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   filter(input,output);</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span> }</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span> </div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span> <span class="keywordtype">void</span> filter::Filter::filter(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output)</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span> {</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     vector<double> pixelInput(input.nrOfBand());</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     vector<double> pixelOutput(input.nrOfBand());</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       pixelInput=lineInput.selectCol(x);</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       filter(pixelInput,pixelOutput);</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>         lineOutput[iband][x]=pixelOutput[iband];</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     }</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>       }</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       }</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     }</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   }</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span> }</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span> </div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span> <span class="keywordtype">void</span> filter::Filter::stat(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method)</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span> {</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   assert(output.nrOfCol()==input.nrOfCol());</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   vector<double> lineOutput(output.nrOfCol());</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   stat.setNoDataValues(m_noDataValues);</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     vector<double> pixelInput(input.nrOfBand());</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       pixelInput=lineInput.selectCol(x);</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       <span class="keywordflow">switch</span>(getFilterType(method)){</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">case</span>(filter::median):</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     lineOutput[x]=stat.median(pixelInput);</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       <span class="keywordflow">case</span>(filter::min):</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     lineOutput[x]=stat.mymin(pixelInput);</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       <span class="keywordflow">case</span>(filter::max):</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     lineOutput[x]=stat.mymax(pixelInput);</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       <span class="keywordflow">case</span>(filter::sum):</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     lineOutput[x]=stat.sum(pixelInput);</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       <span class="keywordflow">case</span>(filter::var):</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>     lineOutput[x]=stat.var(pixelInput);</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       <span class="keywordflow">case</span>(filter::stdev):</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>     lineOutput[x]=sqrt(stat.var(pixelInput));</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       <span class="keywordflow">case</span>(filter::mean):</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     lineOutput[x]=stat.mean(pixelInput);</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">case</span>(filter::percentile):</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     assert(m_threshold.size());</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     lineOutput[x]=stat.percentile(pixelInput,pixelInput.begin(),pixelInput.end(),m_threshold[0]);</div>
+<div class="line"><a name="l00054"></a><span class="lineno">   54</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> filter::Filter::pushNoDataValue(<span class="keywordtype">double</span> noDataValue){</div>
+<div class="line"><a name="l00055"></a><span class="lineno">   55</span>   <span class="keywordflow">if</span>(find(m_noDataValues.begin(),m_noDataValues.end(),noDataValue)==m_noDataValues.end())</div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>     m_noDataValues.push_back(noDataValue);</div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span>   <span class="keywordflow">return</span> m_noDataValues.size();</div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span> };</div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span> </div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> filter::Filter::setNoDataValues(std::vector<double> vnodata){</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   m_noDataValues=vnodata;</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>   <span class="keywordflow">return</span> m_noDataValues.size();</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span> };</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span> </div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span> <span class="keywordtype">void</span> filter::Filter::dwtForward(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span>     vector<double> pixelInput(input.nrOfBand());</div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>       pixelInput=lineInput.selectCol(x);</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>       dwtForward(pixelInput,wavelet_type,family);</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>         lineOutput[iband][x]=pixelInput[iband];</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>     }</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>       }</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>       }</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>     }</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>     progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   }</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span> }</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span> </div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span> <span class="keywordtype">void</span> filter::Filter::dwtInverse(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>     vector<double> pixelInput(input.nrOfBand());</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>       pixelInput=lineInput.selectCol(x);</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>       dwtInverse(pixelInput,wavelet_type,family);</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>         lineOutput[iband][x]=pixelInput[iband];</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>     }</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>       }</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>       }</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     }</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   }</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span> }</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span> </div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span> <span class="keywordtype">void</span> filter::Filter::dwtCut(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut){</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     vector<double> pixelInput(input.nrOfBand());</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>       pixelInput=lineInput.selectCol(x);</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>       dwtCut(pixelInput,wavelet_type,family,cut);</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>         lineOutput[iband][x]=pixelInput[iband];</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     }</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>       }</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>       }</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     }</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   }</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span> }</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span> </div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span> <span class="keywordtype">void</span> filter::Filter::dwtCutFrom(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">int</span> band){</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     vector<double> pixelInput(input.nrOfBand());</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>       pixelInput=lineInput.selectCol(x);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>       dwtForward(pixelInput,wavelet_type,family);</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     <span class="keywordflow">if</span>(iband>=band)</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>       pixelInput[iband]=0;</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>       }</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>       dwtInverse(pixelInput,wavelet_type,family);</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     lineOutput[iband][x]=pixelInput[iband];</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     }</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>       }</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>       }</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     }</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   }</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span> }</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span> </div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span> <span class="comment">//todo: support different padding strategies</span></div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span> <span class="keywordtype">void</span> filter::Filter::dwtForward(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   <span class="keywordtype">int</span> origsize=data.size();</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <span class="comment">//make sure data size if power of 2</span></div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <span class="keywordflow">while</span>(data.size()&(data.size()-1))</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     data.push_back(data.back());</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>       </div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keywordtype">int</span> nsize=data.size();</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   gsl_wavelet *w;</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   gsl_wavelet_workspace *work;</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   assert(nsize);</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   w=gsl_wavelet_alloc(getWaveletType(wavelet_type),family);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   gsl_wavelet_transform_forward(w,&(data[0]),1,nsize,work);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   data.erase(data.begin()+origsize,data.end());</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   gsl_wavelet_free (w);</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   gsl_wavelet_workspace_free (work);</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span> }</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span> </div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span> <span class="comment">//todo: support different padding strategies</span></div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span> <span class="keywordtype">void</span> filter::Filter::dwtInverse(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   <span class="keywordtype">int</span> origsize=data.size();</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   <span class="comment">//make sure data size if power of 2</span></div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   <span class="keywordflow">while</span>(data.size()&(data.size()-1))</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     data.push_back(data.back());</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   <span class="keywordtype">int</span> nsize=data.size();</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   gsl_wavelet *w;</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   gsl_wavelet_workspace *work;</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   assert(nsize);</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   w=gsl_wavelet_alloc(getWaveletType(wavelet_type),family);</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   gsl_wavelet_transform_inverse(w,&(data[0]),1,nsize,work);</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   data.erase(data.begin()+origsize,data.end());</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   gsl_wavelet_free (w);</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   gsl_wavelet_workspace_free (work);</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span> }</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span> </div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span> <span class="comment">//todo: support different padding strategies</span></div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span> <span class="keywordtype">void</span> filter::Filter::dwtCut(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut){</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   <span class="keywordtype">int</span> origsize=data.size();</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <span class="comment">//make sure data size if power of 2</span></div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="keywordflow">while</span>(data.size()&(data.size()-1))</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     data.push_back(data.back());</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keywordtype">int</span> nsize=data.size();</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   gsl_wavelet *w;</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   gsl_wavelet_workspace *work;</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   assert(nsize);</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   w=gsl_wavelet_alloc(getWaveletType(wavelet_type),family);</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   gsl_wavelet_transform_forward(w,&(data[0]),1,nsize,work);</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   std::vector<double> abscoeff(data.size());</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordtype">size_t</span>* p=<span class="keyword">new</span> <span class="keywordtype">size_t</span>[data.size()];</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<data.size();++index){</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     abscoeff[index]=fabs(data[index]);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   }</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   <span class="keywordtype">int</span> nc=(100-cut)/100.0*nsize;</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   gsl_sort_index(p,&(abscoeff[0]),1,nsize);</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;(i+nc)<nsize;i++)</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     data[p[i]]=0;</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   gsl_wavelet_transform_inverse(w,&(data[0]),1,nsize,work);</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   data.erase(data.begin()+origsize,data.end());</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <span class="keyword">delete</span>[] p;</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   gsl_wavelet_free (w);</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   gsl_wavelet_workspace_free (work);</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span> }</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span> </div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span> <span class="keywordtype">void</span> filter::Filter::morphology(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim, <span class="keywordtype">short</span> verbose)</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span> {</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="comment">// bool bverbose=(verbose>1)? true:false;</span></div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     vector<double> pixelInput(input.nrOfBand());</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>     vector<double> pixelOutput(input.nrOfBand());</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       pixelInput=lineInput.selectCol(x);</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>       filter(pixelInput,pixelOutput,method,dim);</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>       <span class="comment">// morphology(pixelInput,pixelOutput,method,dim,bverbose);</span></div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>         lineOutput[iband][x]=pixelOutput[iband];</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     }</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       }</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       }</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     }</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   }</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span> }</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span> </div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span> <span class="keywordtype">void</span> filter::Filter::smoothNoData(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <span class="keyword">const</span> std::string& interpolationType, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output)</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span> {</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     vector<double> pixelInput(input.nrOfBand());</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     vector<double> pixelOutput(input.nrOfBand());</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       pixelInput=lineInput.selectCol(x);</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>       smoothNoData(pixelInput,interpolationType,pixelOutput);</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>         lineOutput[iband][x]=pixelOutput[iband];</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     }</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>       }</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>       }</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     }</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>   }</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span> }</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span> </div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span> <span class="keywordtype">void</span> filter::Filter::smooth(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">short</span> dim)</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span> {</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   assert(dim>0);</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   m_taps.resize(dim);</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<dim;++itap)</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     m_taps[itap]=1.0/dim;</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>   filter(input,output);</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span> }</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span> </div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span> <span class="keywordtype">void</span> filter::Filter::filter(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output)</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span> {</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     vector<double> pixelInput(input.nrOfBand());</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     vector<double> pixelOutput(input.nrOfBand());</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       pixelInput=lineInput.selectCol(x);</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       filter(pixelInput,pixelOutput);</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>         lineOutput[iband][x]=pixelOutput[iband];</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     }</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       }</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       }</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     }</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>   }</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span> }</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span> </div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span> <span class="keywordtype">void</span> filter::Filter::stat(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method)</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span> {</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>   assert(output.nrOfCol()==input.nrOfCol());</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   vector<double> lineOutput(output.nrOfCol());</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   stat.setNoDataValues(m_noDataValues);</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     vector<double> pixelInput(input.nrOfBand());</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       pixelInput=lineInput.selectCol(x);</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       <span class="keywordflow">switch</span>(getFilterType(method)){</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="keywordflow">case</span>(filter::median):</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     lineOutput[x]=stat.median(pixelInput);</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       <span class="keywordflow">case</span>(filter::min):</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     lineOutput[x]=stat.mymin(pixelInput);</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       <span class="keywordflow">case</span>(filter::max):</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     lineOutput[x]=stat.mymax(pixelInput);</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       <span class="keywordflow">case</span>(filter::sum):</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     lineOutput[x]=stat.sum(pixelInput);</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       <span class="keywordflow">case</span>(filter::var):</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     lineOutput[x]=stat.var(pixelInput);</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       <span class="keywordflow">case</span>(filter::stdev):</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     lineOutput[x]=sqrt(stat.var(pixelInput));</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       <span class="keywordflow">case</span>(filter::mean):</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     lineOutput[x]=stat.mean(pixelInput);</div>
 <div class="line"><a name="l00409"></a><span class="lineno">  409</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     std::string errorString=<span class="stringliteral">"method not supported"</span>;</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">case</span>(filter::percentile):</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     assert(m_threshold.size());</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     lineOutput[x]=stat.percentile(pixelInput,pixelInput.begin(),pixelInput.end(),m_threshold[0]);</div>
 <div class="line"><a name="l00413"></a><span class="lineno">  413</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       }</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     }</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       output.writeData(lineOutput,GDT_Float64,y);</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     }</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       cerr << errorstring << <span class="stringliteral">"in line "</span> << y << endl;</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     }</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>   }</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span> }</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span> </div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span> <span class="keywordtype">void</span> filter::Filter::filter(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim)</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span> {</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());;</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     vector<double> pixelInput(input.nrOfBand());</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     vector<double> pixelOutput;</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       pixelInput=lineInput.selectCol(x);</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       filter(pixelInput,pixelOutput,method,dim);</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<pixelOutput.size();++iband){</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>         lineOutput[iband][x]=pixelOutput[iband];</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     <span class="comment">// if(pixelInput[iband]!=0)</span></div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     <span class="comment">//   assert(pixelOutput[iband]!=0);</span></div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       }</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     }</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       }</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       }</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     }</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>   }</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span> }</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span> </div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span> <span class="keywordtype">void</span> filter::Filter::getSavGolayCoefficients(vector<double> &tapz, <span class="keywordtype">int</span> np, <span class="keywordtype">int</span> nl, <span class="keywordtype">int</span> nr, <span class="keywordtype">int</span> ld, <span class="keywordtype">int</span> m) {</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>   <span class="keywordtype">int</span> j, k, imj, ipj, kk, mm;</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>   <span class="keywordtype">double</span> d, fac, sum;</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span> </div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>   <span class="comment">// c.resize(nl+1+nr);</span></div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>   vector<double> tmpc(np);</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>   <span class="keywordflow">if</span>(np < nl + nr + 1 || nl < 0 || nr < 0 || ld > m || nl + nr < m) {</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     cerr << <span class="stringliteral">"bad args in savgol"</span> << endl;</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>   }</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>   vector<int> indx(m + 1, 0);</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>   vector<double> a((m + 1) * (m + 1), 0.0);</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>   vector<double> b(m + 1, 0.0);</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span> </div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>   <span class="keywordflow">for</span>(ipj = 0; ipj <= (m << 1); ++ipj) {</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     sum = (ipj ? 0.0 : 1.0);</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>     <span class="keywordflow">for</span>(k = 1; k <= nr; ++k)</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       sum += (<span class="keywordtype">int</span>)pow((<span class="keywordtype">double</span>)k, (<span class="keywordtype">double</span>)ipj);</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     <span class="keywordflow">for</span>(k = 1; k <= nl; ++k)</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       sum += (<span class="keywordtype">int</span>)pow((<span class="keywordtype">double</span>) - k, (<span class="keywordtype">double</span>)ipj);</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     mm = (ipj < 2 * m - ipj ? ipj : 2 * m - ipj);</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     <span class="keywordflow">for</span>(imj = -mm; imj <= mm; imj += 2)</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       a[(ipj + imj) / 2 * (m + 1) + (ipj - imj) / 2] = sum;</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   }</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   ludcmp(a, indx, d);</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span> </div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>   <span class="keywordflow">for</span>(j = 0; j < m + 1; ++j)</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     b[j] = 0.0;</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>   b[ld] = 1.0;</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span> </div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>   lubksb(a, indx, b);</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>   <span class="comment">// for(kk = 0; kk < np; ++kk)</span></div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>   <span class="comment">//   c[kk] = 0.0;</span></div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>   <span class="keywordflow">for</span>(k = -nl; k <= nr; ++k) {</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>   <span class="comment">// for(k = -nl; k < nr; ++k) {</span></div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     sum = b[0];</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     fac = 1.0;</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     <span class="keywordflow">for</span>(mm = 1; mm <= m; ++mm)</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       sum += b[mm] * (fac *= k);</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     <span class="comment">// store in wrap=around order</span></div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>     kk = (np - k) % np;</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     <span class="comment">//re-order c as I need for taps</span></div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     <span class="comment">// kk=k+nl;</span></div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>     tmpc[kk] = sum;</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>   }</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   tapz.resize(nl+1+nr);</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>   <span class="comment">//  for(k=0;k<nl+1+nr)</span></div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   tapz[tapz.size()/2]=tmpc[0];</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="comment">//past data points</span></div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   <span class="keywordflow">for</span>(k=1;k<=tapz.size()/2;++k)</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     tapz[tapz.size()/2-k]=tmpc[k];</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>   <span class="comment">//future data points</span></div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>   <span class="keywordflow">for</span>(k=1;k<=tapz.size()/2;++k)</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     tapz[tapz.size()/2+k]=tmpc[np-k];</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span> }</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span> </div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span> <span class="keywordtype">void</span> filter::Filter::ludcmp(vector<double> &a, vector<int> &indx, <span class="keywordtype">double</span> &d) {</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="keyword">const</span> <span class="keywordtype">double</span> TINY = 1.0e-20;</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="keywordtype">int</span> i, imax = -1, j, k;</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <span class="keywordtype">double</span> big, dum, sum, temp;</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span> </div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   <span class="keywordtype">int</span> n = indx.size();</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   vector<double> vv(n, 0.0);</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span> </div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   d = 1.0;</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>   <span class="keywordflow">for</span>(i = 0; i < n; ++i) {</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     big = 0.0;</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     <span class="keywordflow">for</span>(j = 0; j < n; ++j)</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       <span class="keywordflow">if</span>((temp = fabs(a[i * n + j])) > big) big = temp;</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span> </div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     <span class="keywordflow">if</span>(big == 0.0) {</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       cerr << <span class="stringliteral">"Singular matrix in routine ludcmp"</span> << endl;</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>     }</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     vv[i] = 1. / big;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>   }</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     std::string errorString=<span class="stringliteral">"method not supported"</span>;</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       }</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     }</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       output.writeData(lineOutput,GDT_Float64,y);</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     }</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       cerr << errorstring << <span class="stringliteral">"in line "</span> << y << endl;</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     }</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>   }</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span> }</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span> </div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span> <span class="keywordtype">void</span> filter::Filter::stats(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> vector<std::string>& methods)</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span> {</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   assert(output.nrOfBand()==methods.size());</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   assert(output.nrOfCol()==input.nrOfCol());</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(methods.size(),output.nrOfCol());</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>   stat.setNoDataValues(m_noDataValues);</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     vector<double> pixelInput(input.nrOfBand());</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       pixelInput=lineInput.selectCol(x);</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       <span class="keywordtype">int</span> ithreshold=0;<span class="comment">//threshold to use for percentiles</span></div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imethod=0;imethod<methods.size();++imethod){</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>     <span class="keywordflow">switch</span>(getFilterType(methods[imethod])){</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     <span class="keywordflow">case</span>(filter::nvalid):</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       lineOutput[imethod][x]=stat.nvalid(pixelInput);</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     <span class="keywordflow">case</span>(filter::median):</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       lineOutput[imethod][x]=stat.median(pixelInput);</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>     <span class="keywordflow">case</span>(filter::min):</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       lineOutput[imethod][x]=stat.mymin(pixelInput);</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     <span class="keywordflow">case</span>(filter::max):</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       lineOutput[imethod][x]=stat.mymax(pixelInput);</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     <span class="keywordflow">case</span>(filter::sum):</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       lineOutput[imethod][x]=stat.sum(pixelInput);</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>     <span class="keywordflow">case</span>(filter::var):</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       lineOutput[imethod][x]=stat.var(pixelInput);</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">case</span>(filter::stdev):</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       lineOutput[imethod][x]=sqrt(stat.var(pixelInput));</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     <span class="keywordflow">case</span>(filter::mean):</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       lineOutput[imethod][x]=stat.mean(pixelInput);</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     <span class="keywordflow">case</span>(filter::percentile):{</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       assert(m_threshold.size());</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       <span class="keywordtype">double</span> threshold=(ithreshold<m_threshold.size())? m_threshold[ithreshold] : m_threshold[0];</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       lineOutput[imethod][x]=stat.percentile(pixelInput,pixelInput.begin(),pixelInput.end(),threshold);</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       ++ithreshold;</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     }</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       std::string errorString=<span class="stringliteral">"method not supported"</span>;</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     }</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       }</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     }</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imethod=0;imethod<methods.size();++imethod){</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     output.writeData(lineOutput[imethod],GDT_Float64,y,imethod);</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       }</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     cerr << errorstring << <span class="stringliteral">"in line "</span> << y << endl;</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       }</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     }</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>   }</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span> }</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span> </div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span> <span class="keywordtype">void</span> filter::Filter::filter(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim)</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span> {</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(input.nrOfBand(),input.nrOfCol());;</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     vector<double> pixelInput(input.nrOfBand());</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     vector<double> pixelOutput;</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       pixelInput=lineInput.selectCol(x);</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       filter(pixelInput,pixelOutput,method,dim);</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<pixelOutput.size();++iband){</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>         lineOutput[iband][x]=pixelOutput[iband];</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     <span class="comment">// if(pixelInput[iband]!=0)</span></div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     <span class="comment">//   assert(pixelOutput[iband]!=0);</span></div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       }</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     }</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       }</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>         cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       }</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     }</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>     progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>   }</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span> }</div>
 <div class="line"><a name="l00539"></a><span class="lineno">  539</span> </div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>   <span class="keywordflow">for</span>(j = 0; j < n; ++j) {</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     <span class="keywordflow">for</span>(i = 0; i < j; ++i) {</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       sum = a[i * n + j];</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>       <span class="keywordflow">for</span>(k = 0; k < i; ++k)</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     sum -= a[i * n + k] * a[k * n + j];</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       a[i * n + j] = sum;</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     }</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     big = 0.0;</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     <span class="keywordflow">for</span>(i = j; i < n; ++i) {</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       sum = a[i * n + j];</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordflow">for</span>(k = 0; k < j; ++k)</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     sum -= a[i * n + k] * a[k * n + j];</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       a[i * n + j] = sum;</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       <span class="keywordflow">if</span>((dum = vv[i] * fabs(sum)) >= big) {</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     big = dum;</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     imax = i;</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       }</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     }</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span> </div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     <span class="keywordflow">if</span>(j != imax) {</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="keywordflow">for</span>(k = 0; k < n; ++k) {</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     dum = a[imax * n + k];</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     a[imax * n + k] = a[j * n + k];</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     a[j * n + k] = dum;</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       }</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       d = -d;</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       vv[imax] = vv[j];</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     }</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     indx[j] = imax;</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     <span class="keywordflow">if</span>(a[j * n + j] == 0.0) a[j * n + j] = TINY;</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordflow">if</span>(j != n - 1) {</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       dum = 1. / a[j * n + j];</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       <span class="keywordflow">for</span>(i = j + 1; i < n; ++i)</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     a[i * n + j] *= dum;</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     }</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   }</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span> }</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span> </div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span> <span class="keywordtype">void</span> filter::Filter::lubksb(vector<double> &a, vector<int> &indx, vector<double> &b) {</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   <span class="keywordtype">int</span> i, ii = 0, ip, j;</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   <span class="keywordtype">double</span> sum;</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   <span class="keywordtype">int</span> n = indx.size();</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span> </div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   <span class="keywordflow">for</span>(i = 0; i < n; ++i) {</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     ip = indx[i];</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     sum = b[ip];</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     b[ip] = b[i];</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     <span class="keywordflow">if</span>(ii != 0)</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       <span class="keywordflow">for</span>(j = ii - 1; j < i; ++j)</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     sum -= a[i * n + j] * b[j];</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(sum != 0.0)</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       ii = i + 1;</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     b[i] = sum;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>   }</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   <span class="keywordflow">for</span>(i = n - 1; i >= 0; --i) {</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     sum = b[i];</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>     <span class="keywordflow">for</span>(j = i + 1; j < n; ++j)</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       sum -= a[i * n + j] * b[j];</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     b[i] = sum / a[i * n + i];</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>   }</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span> }</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span> </div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span> <span class="keywordtype">double</span> filter::Filter::getCentreWavelength(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<double></a>& srf, <span class="keyword">const</span> std::string& interpolationType, <span class="keywordtype">double</span> delta, <span class="keywordtype"> [...]
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span> {  </div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>   assert(srf.size()==2);<span class="comment">//[0]: wavelength, [1]: response function</span></div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>   <span class="keywordtype">int</span> nband=srf[0].size(); </div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>   <span class="keywordtype">double</span> start=floor(wavelengthIn[0]);</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>   <span class="keywordtype">double</span> end=ceil(wavelengthIn.back());</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     std::cout << <span class="stringliteral">"wavelengths in ["</span> << start << <span class="stringliteral">","</span> << end << <span class="stringliteral">"]"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span> </div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span> </div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>   gsl_interp_accel *acc;</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>   stat.allocAcc(acc);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>   gsl_spline *spline;</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>   stat.getSpline(interpolationType,nband,spline);</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>   stat.initSpline(spline,&(srf[0][0]),&(srf[1][0]),nband);</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     std::cout << <span class="stringliteral">"calculating norm of srf"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>   <span class="keywordtype">double</span> norm=0;</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>   norm=gsl_spline_eval_integ(spline,srf[0].front(),srf[0].back(),acc);</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     std::cout << <span class="stringliteral">"norm of srf: "</span> << norm << std::endl << std::flush;</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>   gsl_spline_free(spline);</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>   gsl_interp_accel_free(acc);  </div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>   std::vector<double> wavelength_fine;</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   <span class="keywordflow">for</span>(<span class="keywordtype">double</span> win=floor(wavelengthIn[0]);win<=ceil(wavelengthIn.back());win+=delta)</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     wavelength_fine.push_back(win);</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span> </div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     std::cout << <span class="stringliteral">"interpolate wavelengths to "</span> << wavelength_fine.size() << <span class="stringliteral">" entries "</span> << std::endl;</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>   std::vector<double> srf_fine;<span class="comment">//spectral response function, interpolated for wavelength_fine</span></div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span> </div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>   stat.interpolateUp(srf[0],srf[1],wavelength_fine,interpolationType,srf_fine,verbose);</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>   assert(srf_fine.size()==wavelength_fine.size());</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span> </div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>   gsl_interp_accel *accOut;</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>   stat.allocAcc(accOut);</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   gsl_spline *splineOut;</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>   stat.getSpline(interpolationType,wavelength_fine.size(),splineOut);</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   assert(splineOut);</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span> </div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>   std::vector<double> wavelengthOut(wavelength_fine.size());</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span> </div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<wavelengthOut.size();++iband)</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     wavelengthOut[iband]=wavelength_fine[iband]*srf_fine[iband];</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span> </div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>   stat.initSpline(splineOut,&(wavelength_fine[0]),&(wavelengthOut[0]),wavelength_fine.size());</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   <span class="keywordtype">double</span> centreWavelength=gsl_spline_eval_integ(splineOut,start,end,accOut)/norm;</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>   </div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>   gsl_spline_free(splineOut);</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>   gsl_interp_accel_free(accOut);</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span> </div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>   <span class="keywordflow">return</span>(centreWavelength);</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span> }</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span> </div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span> <span class="comment">// void filter::Filter::applyFwhm(const vector<double> &wavelengthIn, const ImgReaderGdal& input, const vector<double> &wavelengthOut, const vector<double> &fwhm, const std::string& interpolationType, ImgWriterGdal& output, bool verbose){</span></div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span> <span class="comment">//   Vector2d<double> lineInput(input.nrOfBand(),input.nrOfCol());</span></div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span> <span class="comment">//   Vector2d<double> lineOutput(wavelengthOut.size(),input.nrOfCol());</span></div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span> <span class="comment">//   const char* pszMessage;</span></div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span> <span class="comment">//   void* pProgressArg=NULL;</span></div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span> <span class="comment">//   GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span> <span class="comment">//   double progress=0;</span></div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span> <span class="comment">//   pfnProgress(progress,pszMessage,pProgressArg);</span></div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span> <span class="comment">//   for(int y=0;y<input.nrOfRow();++y){</span></div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span> <span class="comment">//     for(int iband=0;iband<input.nrOfBand();++iband)</span></div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span> <span class="comment">//       input.readData(lineInput[iband],GDT_Float64,y,iband);</span></div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span> <span class="comment">//     applyFwhm<double>(wavelengthIn,lineInput,wavelengthOut,fwhm, interpolationType, lineOutput, verbose);</span></div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span> <span class="comment">//     for(int iband=0;iband<output.nrOfBand();++iband){</span></div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span> <span class="comment">//       try{</span></div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span> <span class="comment">//         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</span></div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span> <span class="comment">//       }</span></div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span> <span class="comment">//       catch(string errorstring){</span></div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span> <span class="comment">//         cerr << errorstring << "in band " << iband << ", line " << y << endl;</span></div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span> <span class="comment">//       }</span></div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span> <span class="comment">//     progress=(1.0+y)/output.nrOfRow();</span></div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span> <span class="comment">//     pfnProgress(progress,pszMessage,pProgressArg);</span></div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span> </div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span> <span class="comment">// void filter::Filter::applySrf(const vector<double> &wavelengthIn, const ImgReaderGdal& input, const vector< Vector2d<double> > &srf, const std::string& interpolationType, ImgWriterGdal& output, bool verbose){</span></div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span> <span class="comment">//   assert(output.nrOfBand()==srf.size());</span></div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span> <span class="comment">//   double centreWavelength=0;</span></div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span> <span class="comment">//   Vector2d<double> lineInput(input.nrOfBand(),input.nrOfCol());</span></div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span> <span class="comment">//   const char* pszMessage;</span></div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span> <span class="comment">//   void* pProgressArg=NULL;</span></div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span> <span class="comment">//   GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span> <span class="comment">//   double progress=0;</span></div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span> <span class="comment">//   pfnProgress(progress,pszMessage,pProgressArg);</span></div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span> <span class="comment">//   for(int y=0;y<input.nrOfRow();++y){</span></div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span> <span class="comment">//     for(int iband=0;iband<input.nrOfBand();++iband)</span></div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span> <span class="comment">//       input.readData(lineInput[iband],GDT_Float64,y,iband);</span></div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span> <span class="comment">//     for(int isrf=0;isrf<srf.size();++isrf){</span></div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span> <span class="comment">//       vector<double> lineOutput(input.nrOfCol());</span></div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span> <span class="comment">//       centreWavelength=applySrf<double>(wavelengthIn,lineInput,srf[isrf], interpolationType, lineOutput, verbose);</span></div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span> <span class="comment">//       for(int iband=0;iband<output.nrOfBand();++iband){</span></div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span> <span class="comment">//         try{</span></div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span> <span class="comment">//           output.writeData(lineOutput,GDT_Float64,y,isrf);</span></div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span> <span class="comment">//         }</span></div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span> <span class="comment">//         catch(string errorstring){</span></div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span> <span class="comment">//           cerr << errorstring << "in band " << iband << ", line " << y << endl;</span></div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span> <span class="comment">//         }</span></div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span> <span class="comment">//       }</span></div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span> <span class="comment">//     progress=(1.0+y)/output.nrOfRow();</span></div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span> <span class="comment">//     pfnProgress(progress,pszMessage,pProgressArg);</span></div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span> <span class="comment">// }</span></div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span> <span class="keywordtype">void</span> filter::Filter::getSavGolayCoefficients(vector<double> &tapz, <span class="keywordtype">int</span> np, <span class="keywordtype">int</span> nl, <span class="keywordtype">int</span> nr, <span class="keywordtype">int</span> ld, <span class="keywordtype">int</span> m) {</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>   <span class="keywordtype">int</span> j, k, imj, ipj, kk, mm;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>   <span class="keywordtype">double</span> d, fac, sum;</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span> </div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>   <span class="comment">// c.resize(nl+1+nr);</span></div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>   vector<double> tmpc(np);</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>   <span class="keywordflow">if</span>(np < nl + nr + 1 || nl < 0 || nr < 0 || ld > m || nl + nr < m) {</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     cerr << <span class="stringliteral">"bad args in savgol"</span> << endl;</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>   }</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>   vector<int> indx(m + 1, 0);</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>   vector<double> a((m + 1) * (m + 1), 0.0);</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>   vector<double> b(m + 1, 0.0);</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span> </div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   <span class="keywordflow">for</span>(ipj = 0; ipj <= (m << 1); ++ipj) {</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     sum = (ipj ? 0.0 : 1.0);</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     <span class="keywordflow">for</span>(k = 1; k <= nr; ++k)</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       sum += (<span class="keywordtype">int</span>)pow((<span class="keywordtype">double</span>)k, (<span class="keywordtype">double</span>)ipj);</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     <span class="keywordflow">for</span>(k = 1; k <= nl; ++k)</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       sum += (<span class="keywordtype">int</span>)pow((<span class="keywordtype">double</span>) - k, (<span class="keywordtype">double</span>)ipj);</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     mm = (ipj < 2 * m - ipj ? ipj : 2 * m - ipj);</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     <span class="keywordflow">for</span>(imj = -mm; imj <= mm; imj += 2)</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       a[(ipj + imj) / 2 * (m + 1) + (ipj - imj) / 2] = sum;</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>   }</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>   ludcmp(a, indx, d);</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span> </div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>   <span class="keywordflow">for</span>(j = 0; j < m + 1; ++j)</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     b[j] = 0.0;</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   b[ld] = 1.0;</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span> </div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>   lubksb(a, indx, b);</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   <span class="comment">// for(kk = 0; kk < np; ++kk)</span></div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   <span class="comment">//   c[kk] = 0.0;</span></div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   <span class="keywordflow">for</span>(k = -nl; k <= nr; ++k) {</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>   <span class="comment">// for(k = -nl; k < nr; ++k) {</span></div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     sum = b[0];</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     fac = 1.0;</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     <span class="keywordflow">for</span>(mm = 1; mm <= m; ++mm)</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       sum += b[mm] * (fac *= k);</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="comment">// store in wrap=around order</span></div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     kk = (np - k) % np;</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     <span class="comment">//re-order c as I need for taps</span></div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="comment">// kk=k+nl;</span></div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     tmpc[kk] = sum;</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   }</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>   tapz.resize(nl+1+nr);</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   <span class="comment">//  for(k=0;k<nl+1+nr)</span></div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   tapz[tapz.size()/2]=tmpc[0];</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>   <span class="comment">//past data points</span></div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>   <span class="keywordflow">for</span>(k=1;k<=tapz.size()/2;++k)</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     tapz[tapz.size()/2-k]=tmpc[k];</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   <span class="comment">//future data points</span></div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   <span class="keywordflow">for</span>(k=1;k<=tapz.size()/2;++k)</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     tapz[tapz.size()/2+k]=tmpc[np-k];</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span> }</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span> </div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span> <span class="keywordtype">void</span> filter::Filter::ludcmp(vector<double> &a, vector<int> &indx, <span class="keywordtype">double</span> &d) {</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>   <span class="keyword">const</span> <span class="keywordtype">double</span> TINY = 1.0e-20;</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>   <span class="keywordtype">int</span> i, imax = -1, j, k;</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>   <span class="keywordtype">double</span> big, dum, sum, temp;</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span> </div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>   <span class="keywordtype">int</span> n = indx.size();</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>   vector<double> vv(n, 0.0);</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span> </div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>   d = 1.0;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>   <span class="keywordflow">for</span>(i = 0; i < n; ++i) {</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     big = 0.0;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     <span class="keywordflow">for</span>(j = 0; j < n; ++j)</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="keywordflow">if</span>((temp = fabs(a[i * n + j])) > big) big = temp;</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span> </div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     <span class="keywordflow">if</span>(big == 0.0) {</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       cerr << <span class="stringliteral">"Singular matrix in routine ludcmp"</span> << endl;</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     }</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     vv[i] = 1. / big;</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>   }</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span> </div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>   <span class="keywordflow">for</span>(j = 0; j < n; ++j) {</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordflow">for</span>(i = 0; i < j; ++i) {</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       sum = a[i * n + j];</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       <span class="keywordflow">for</span>(k = 0; k < i; ++k)</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     sum -= a[i * n + k] * a[k * n + j];</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       a[i * n + j] = sum;</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     }</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     big = 0.0;</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     <span class="keywordflow">for</span>(i = j; i < n; ++i) {</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       sum = a[i * n + j];</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       <span class="keywordflow">for</span>(k = 0; k < j; ++k)</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     sum -= a[i * n + k] * a[k * n + j];</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       a[i * n + j] = sum;</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       <span class="keywordflow">if</span>((dum = vv[i] * fabs(sum)) >= big) {</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     big = dum;</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     imax = i;</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       }</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     }</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span> </div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">if</span>(j != imax) {</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       <span class="keywordflow">for</span>(k = 0; k < n; ++k) {</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     dum = a[imax * n + k];</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     a[imax * n + k] = a[j * n + k];</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     a[j * n + k] = dum;</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       }</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>       d = -d;</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       vv[imax] = vv[j];</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     }</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     indx[j] = imax;</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     <span class="keywordflow">if</span>(a[j * n + j] == 0.0) a[j * n + j] = TINY;</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="keywordflow">if</span>(j != n - 1) {</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       dum = 1. / a[j * n + j];</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <span class="keywordflow">for</span>(i = j + 1; i < n; ++i)</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     a[i * n + j] *= dum;</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     }</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>   }</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span> }</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span> </div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span> <span class="keywordtype">void</span> filter::Filter::lubksb(vector<double> &a, vector<int> &indx, vector<double> &b) {</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>   <span class="keywordtype">int</span> i, ii = 0, ip, j;</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>   <span class="keywordtype">double</span> sum;</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>   <span class="keywordtype">int</span> n = indx.size();</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span> </div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   <span class="keywordflow">for</span>(i = 0; i < n; ++i) {</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     ip = indx[i];</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     sum = b[ip];</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     b[ip] = b[i];</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     <span class="keywordflow">if</span>(ii != 0)</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       <span class="keywordflow">for</span>(j = ii - 1; j < i; ++j)</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     sum -= a[i * n + j] * b[j];</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(sum != 0.0)</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       ii = i + 1;</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     b[i] = sum;</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   }</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   <span class="keywordflow">for</span>(i = n - 1; i >= 0; --i) {</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     sum = b[i];</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     <span class="keywordflow">for</span>(j = i + 1; j < n; ++j)</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       sum -= a[i * n + j] * b[j];</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     b[i] = sum / a[i * n + i];</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>   }</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span> }</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span> </div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span> <span class="keywordtype">double</span> filter::Filter::getCentreWavelength(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<double></a>& srf, <span class="keyword">const</span> std::string& interpolationType, <span class="keywordtype">double</span> delta, <span class="keywordtype"> [...]
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span> {  </div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>   assert(srf.size()==2);<span class="comment">//[0]: wavelength, [1]: response function</span></div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   <span class="keywordtype">int</span> nband=srf[0].size(); </div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   <span class="keywordtype">double</span> start=floor(wavelengthIn[0]);</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>   <span class="keywordtype">double</span> end=ceil(wavelengthIn.back());</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     std::cout << <span class="stringliteral">"wavelengths in ["</span> << start << <span class="stringliteral">","</span> << end << <span class="stringliteral">"]"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span> </div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span> </div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   gsl_interp_accel *acc;</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>   stat.allocAcc(acc);</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>   gsl_spline *spline;</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>   stat.getSpline(interpolationType,nband,spline);</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>   stat.initSpline(spline,&(srf[0][0]),&(srf[1][0]),nband);</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     std::cout << <span class="stringliteral">"calculating norm of srf"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>   <span class="keywordtype">double</span> norm=0;</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>   norm=gsl_spline_eval_integ(spline,srf[0].front(),srf[0].back(),acc);</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     std::cout << <span class="stringliteral">"norm of srf: "</span> << norm << std::endl << std::flush;</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>   gsl_spline_free(spline);</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>   gsl_interp_accel_free(acc);  </div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>   std::vector<double> wavelength_fine;</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>   <span class="keywordflow">for</span>(<span class="keywordtype">double</span> win=floor(wavelengthIn[0]);win<=ceil(wavelengthIn.back());win+=delta)</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     wavelength_fine.push_back(win);</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span> </div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     std::cout << <span class="stringliteral">"interpolate wavelengths to "</span> << wavelength_fine.size() << <span class="stringliteral">" entries "</span> << std::endl;</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>   std::vector<double> srf_fine;<span class="comment">//spectral response function, interpolated for wavelength_fine</span></div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span> </div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>   stat.interpolateUp(srf[0],srf[1],wavelength_fine,interpolationType,srf_fine,verbose);</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>   assert(srf_fine.size()==wavelength_fine.size());</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span> </div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>   gsl_interp_accel *accOut;</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>   stat.allocAcc(accOut);</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>   gsl_spline *splineOut;</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   stat.getSpline(interpolationType,wavelength_fine.size(),splineOut);</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>   assert(splineOut);</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span> </div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>   std::vector<double> wavelengthOut(wavelength_fine.size());</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span> </div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<wavelengthOut.size();++iband)</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     wavelengthOut[iband]=wavelength_fine[iband]*srf_fine[iband];</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span> </div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>   stat.initSpline(splineOut,&(wavelength_fine[0]),&(wavelengthOut[0]),wavelength_fine.size());</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>   <span class="keywordtype">double</span> centreWavelength=gsl_spline_eval_integ(splineOut,start,end,accOut)/norm;</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>   </div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   gsl_spline_free(splineOut);</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   gsl_interp_accel_free(accOut);</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span> </div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>   <span class="keywordflow">return</span>(centreWavelength);</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span> }</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span> </div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span> <span class="comment">// void filter::Filter::applyFwhm(const vector<double> &wavelengthIn, const ImgReaderGdal& input, const vector<double> &wavelengthOut, const vector<double> &fwhm, const std::string& interpolationType, ImgWriterGdal& output, bool verbose){</span></div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span> <span class="comment">//   Vector2d<double> lineInput(input.nrOfBand(),input.nrOfCol());</span></div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span> <span class="comment">//   Vector2d<double> lineOutput(wavelengthOut.size(),input.nrOfCol());</span></div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span> <span class="comment">//   const char* pszMessage;</span></div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span> <span class="comment">//   void* pProgressArg=NULL;</span></div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span> <span class="comment">//   GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span> <span class="comment">//   double progress=0;</span></div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span> <span class="comment">//   pfnProgress(progress,pszMessage,pProgressArg);</span></div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span> <span class="comment">//   for(int y=0;y<input.nrOfRow();++y){</span></div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span> <span class="comment">//     for(int iband=0;iband<input.nrOfBand();++iband)</span></div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span> <span class="comment">//       input.readData(lineInput[iband],GDT_Float64,y,iband);</span></div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span> <span class="comment">//     applyFwhm<double>(wavelengthIn,lineInput,wavelengthOut,fwhm, interpolationType, lineOutput, verbose);</span></div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span> <span class="comment">//     for(int iband=0;iband<output.nrOfBand();++iband){</span></div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span> <span class="comment">//       try{</span></div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span> <span class="comment">//         output.writeData(lineOutput[iband],GDT_Float64,y,iband);</span></div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span> <span class="comment">//       }</span></div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span> <span class="comment">//       catch(string errorstring){</span></div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span> <span class="comment">//         cerr << errorstring << "in band " << iband << ", line " << y << endl;</span></div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span> <span class="comment">//       }</span></div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span> <span class="comment">//     progress=(1.0+y)/output.nrOfRow();</span></div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span> <span class="comment">//     pfnProgress(progress,pszMessage,pProgressArg);</span></div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span> </div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span> <span class="comment">// void filter::Filter::applySrf(const vector<double> &wavelengthIn, const ImgReaderGdal& input, const vector< Vector2d<double> > &srf, const std::string& interpolationType, ImgWriterGdal& output, bool verbose){</span></div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span> <span class="comment">//   assert(output.nrOfBand()==srf.size());</span></div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span> <span class="comment">//   double centreWavelength=0;</span></div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span> <span class="comment">//   Vector2d<double> lineInput(input.nrOfBand(),input.nrOfCol());</span></div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span> <span class="comment">//   const char* pszMessage;</span></div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span> <span class="comment">//   void* pProgressArg=NULL;</span></div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span> <span class="comment">//   GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span> <span class="comment">//   double progress=0;</span></div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span> <span class="comment">//   pfnProgress(progress,pszMessage,pProgressArg);</span></div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span> <span class="comment">//   for(int y=0;y<input.nrOfRow();++y){</span></div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span> <span class="comment">//     for(int iband=0;iband<input.nrOfBand();++iband)</span></div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span> <span class="comment">//       input.readData(lineInput[iband],GDT_Float64,y,iband);</span></div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span> <span class="comment">//     for(int isrf=0;isrf<srf.size();++isrf){</span></div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span> <span class="comment">//       vector<double> lineOutput(input.nrOfCol());</span></div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span> <span class="comment">//       centreWavelength=applySrf<double>(wavelengthIn,lineInput,srf[isrf], interpolationType, lineOutput, verbose);</span></div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span> <span class="comment">//       for(int iband=0;iband<output.nrOfBand();++iband){</span></div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span> <span class="comment">//         try{</span></div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span> <span class="comment">//           output.writeData(lineOutput,GDT_Float64,y,isrf);</span></div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span> <span class="comment">//         }</span></div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span> <span class="comment">//         catch(string errorstring){</span></div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span> <span class="comment">//           cerr << errorstring << "in band " << iband << ", line " << y << endl;</span></div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span> <span class="comment">//         }</span></div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span> <span class="comment">//       }</span></div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span> <span class="comment">//     progress=(1.0+y)/output.nrOfRow();</span></div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span> <span class="comment">//     pfnProgress(progress,pszMessage,pProgressArg);</span></div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span> <span class="comment">// }</span></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Filter_8h_source.html b/doc/html/Filter_8h_source.html
index 7acf974..d95084a 100644
--- a/doc/html/Filter_8h_source.html
+++ b/doc/html/Filter_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <div class="line"><a name="l00033"></a><span class="lineno">   33</span> <span class="keyword">namespace </span>filter</div>
 <div class="line"><a name="l00034"></a><span class="lineno">   34</span> {</div>
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span>   </div>
-<div class="line"><a name="l00036"></a><span class="lineno">   36</span>   <span class="keyword">enum</span> FILTER_TYPE { median=0, var=1 , min=2, max=3, sum=4, mean=5, minmax=6, dilate=7, erode=8, close=9, open=10, homog=11, sobelx=12, sobely=13, sobelxy=14, sobelyx=-14, smooth=15, density=16, mode=17, mixed=18, smoothnodata=19, threshold=20, ismin=21, ismax=22, heterog=23, order=24, stdev=25, dwt=26, dwti=27, dwt_cut=28, dwt_cut_from=29, savgolay=30, percentile=31};</div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span>   <span class="keyword">enum</span> FILTER_TYPE { median=0, var=1 , min=2, max=3, sum=4, mean=5, minmax=6, dilate=7, erode=8, close=9, open=10, homog=11, sobelx=12, sobely=13, sobelxy=14, sobelyx=-14, smooth=15, density=16, mode=17, mixed=18, smoothnodata=19, threshold=20, ismin=21, ismax=22, heterog=23, order=24, stdev=25, dwt=26, dwti=27, dwt_cut=28, dwt_cut_from=29, savgolay=30, percentile=31, nvalid=32};</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> </div>
 <div class="line"><a name="l00038"></a><span class="lineno">   38</span>    <span class="keyword">enum</span> PADDING { symmetric=0, replicate=1, circular=2, zero=3};</div>
 <div class="line"><a name="l00039"></a><span class="lineno">   39</span> </div>
@@ -119,791 +119,803 @@
 <div class="line"><a name="l00065"></a><span class="lineno">   65</span>   <span class="keywordtype">void</span> setTaps(<span class="keyword">const</span> std::vector<double> &taps, <span class="keywordtype">bool</span> normalize=<span class="keyword">true</span>);</div>
 <div class="line"><a name="l00066"></a><span class="lineno">   66</span>   <span class="keywordtype">void</span> pushClass(<span class="keywordtype">short</span> theClass=1){m_class.push_back(theClass);};</div>
 <div class="line"><a name="l00067"></a><span class="lineno">   67</span>   <span class="keywordtype">void</span> pushMask(<span class="keywordtype">short</span> theMask=0){m_mask.push_back(theMask);};</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   <span class="keywordtype">int</span> pushNoDataValue(<span class="keywordtype">double</span> noDataValue=0);<span class="comment">//{m_mask.push_back(theMask);};</span></div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   <span class="keywordtype">void</span> pushThreshold(<span class="keywordtype">double</span> theThreshold){m_threshold.push_back(theThreshold);};</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   <span class="keywordtype">void</span> setThresholds(<span class="keyword">const</span> std::vector<double>& theThresholds){m_threshold=theThresholds;};</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> filter(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output);</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> filter(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim);</div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> smooth(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">short</span> dim);</div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> smoothNoData(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::string& interpolationType, std::vector<T>& output);</div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> filter(T* input, <span class="keywordtype">int</span> inputSize, std::vector<T>& output);</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> smooth(T* input, <span class="keywordtype">int</span> inputSize, std::vector<T>& output, <span class="keywordtype">short</span> dim);</div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <span class="comment">//template<class T> void morphology(const std::vector<T>& input, std::vector<T>& output, const std::string& method, int dim, bool verbose=false);</span></div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <span class="keywordtype">void</span> morphology(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim, <span class="keywordtype">short</span> verbose=0);</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <span class="keywordtype">void</span> filter(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output);</div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <span class="keywordtype">void</span> stat(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method);</div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <span class="keywordtype">void</span> filter(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim);</div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <span class="keywordtype">void</span> getSavGolayCoefficients(std::vector<double> &c, <span class="keywordtype">int</span> np, <span class="keywordtype">int</span> nl, <span class="keywordtype">int</span> nr, <span class="keywordtype">int</span> ld, <span class="keywordtype">int</span> m);</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <span class="keywordtype">void</span> ludcmp(std::vector<double> &a, std::vector<int> &indx, <span class="keywordtype">double</span> &d);</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <span class="keywordtype">void</span> lubksb(std::vector<double> &a, std::vector<int> &indx, std::vector<double> &b);</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <span class="comment">/* void savgolay(const ImgReaderGdal& input, ImgWriterGdal& output, int np, int nl, int nr, int m); */</span></div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <span class="keywordtype">void</span> smooth(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">short</span> dim);</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <span class="keywordtype">void</span> smoothNoData(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <span class="keyword">const</span> std::string& interpolationType, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output);</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <span class="keywordtype">double</span> getCentreWavelength(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<double></a>& srf, <span class="keyword">const</span> std::string& interpolationType, <span class="keywordtype">double</span> delta=1.0, <span class="keywordtype">bool</span [...]
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> applySrf(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<double></a>& srf, <span class="keywor [...]
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> applySrf(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<d [...]
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span> </div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> applyFwhm(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::vector<double> &wavelengthOut, <span class="keyword">const</span> std::vector<dou [...]
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> applyFwhm(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <span class="keyword">const</span> std::vector<double> &wavelengthOut, <span clas [...]
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <span class="keywordtype">void</span> dwtForward(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family);</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <span class="keywordtype">void</span> dwtInverse(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family);</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <span class="keywordtype">void</span> dwtCut(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut);</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <span class="keywordtype">void</span> dwtForward(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family);</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <span class="keywordtype">void</span> dwtInverse(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family);</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <span class="keywordtype">void</span> dwtCut(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut);</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <span class="keywordtype">void</span> dwtCutFrom(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">int</span> band);</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span> </div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span> <span class="keyword">private</span>:</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> pushNoDataValue(<span class="keywordtype">double</span> noDataValue);</div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> setNoDataValues(std::vector<double> vnodata);</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   <span class="keywordtype">void</span> pushThreshold(<span class="keywordtype">double</span> theThreshold){m_threshold.push_back(theThreshold);};</div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   <span class="keywordtype">void</span> setThresholds(<span class="keyword">const</span> std::vector<double>& theThresholds){m_threshold=theThresholds;};</div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> filter(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output);</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> filter(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim);</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> smooth(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">short</span> dim);</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> smoothNoData(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::string& interpolationType, std::vector<T>& output);</div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> filter(T* input, <span class="keywordtype">int</span> inputSize, std::vector<T>& output);</div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> smooth(T* input, <span class="keywordtype">int</span> inputSize, std::vector<T>& output, <span class="keywordtype">short</span> dim);</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <span class="comment">//template<class T> void morphology(const std::vector<T>& input, std::vector<T>& output, const std::string& method, int dim, bool verbose=false);</span></div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <span class="keywordtype">void</span> morphology(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim, <span class="keywordtype">short</span> verbose=0);</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <span class="keywordtype">void</span> filter(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output);</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <span class="keywordtype">void</span> stat(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method);</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <span class="keywordtype">void</span> stats(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::vector<std::string >& methods);</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <span class="keywordtype">void</span> filter(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim);</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <span class="keywordtype">void</span> getSavGolayCoefficients(std::vector<double> &c, <span class="keywordtype">int</span> np, <span class="keywordtype">int</span> nl, <span class="keywordtype">int</span> nr, <span class="keywordtype">int</span> ld, <span class="keywordtype">int</span> m);</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <span class="keywordtype">void</span> ludcmp(std::vector<double> &a, std::vector<int> &indx, <span class="keywordtype">double</span> &d);</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <span class="keywordtype">void</span> lubksb(std::vector<double> &a, std::vector<int> &indx, std::vector<double> &b);</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <span class="comment">/* void savgolay(const ImgReaderGdal& input, ImgWriterGdal& output, int np, int nl, int nr, int m); */</span></div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <span class="keywordtype">void</span> smooth(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">short</span> dim);</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <span class="keywordtype">void</span> smoothNoData(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <span class="keyword">const</span> std::string& interpolationType, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output);</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <span class="keywordtype">double</span> getCentreWavelength(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<double></a>& srf, <span class="keyword">const</span> std::string& interpolationType, <span class="keywordtype">double</span> delta=1.0, <span class="keywordtype">bool</span [...]
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> applySrf(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<double></a>& srf, <span class="keywor [...]
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> applySrf(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<d [...]
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span> </div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> applyFwhm(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::vector<double> &wavelengthOut, <span class="keyword">const</span> std::vector<dou [...]
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> applyFwhm(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <span class="keyword">const</span> std::vector<double> &wavelengthOut, <span clas [...]
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <span class="keywordtype">void</span> dwtForward(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family);</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <span class="keywordtype">void</span> dwtInverse(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family);</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <span class="keywordtype">void</span> dwtCut(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut);</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <span class="keywordtype">void</span> dwtForward(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family);</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <span class="keywordtype">void</span> dwtInverse(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family);</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <span class="keywordtype">void</span> dwtCut(std::vector<double>& data, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut);</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <span class="keywordtype">void</span> dwtCutFrom(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">int</span> band);</div>
 <div class="line"><a name="l00103"></a><span class="lineno">  103</span> </div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <span class="keyword">static</span> <span class="keywordtype">void</span> initFilterMap(std::map<std::string, FILTER_TYPE>& m_filterMap){</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>     <span class="comment">//initialize Map</span></div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>     m_filterMap[<span class="stringliteral">"dwt"</span>]=filter::dwt;</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>     m_filterMap[<span class="stringliteral">"dwti"</span>]=filter::dwti;</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>     m_filterMap[<span class="stringliteral">"dwt_cut"</span>]=filter::dwt_cut;</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>     m_filterMap[<span class="stringliteral">"dwt_cut_from"</span>]=filter::dwt_cut_from;</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>     m_filterMap[<span class="stringliteral">"stdev"</span>]=filter::stdev;</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>     m_filterMap[<span class="stringliteral">"var"</span>]=filter::var;</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>     m_filterMap[<span class="stringliteral">"min"</span>]=filter::min;</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>     m_filterMap[<span class="stringliteral">"max"</span>]=filter::max;</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>     m_filterMap[<span class="stringliteral">"sum"</span>]=filter::sum;</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>     m_filterMap[<span class="stringliteral">"mean"</span>]=filter::mean;</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>     m_filterMap[<span class="stringliteral">"minmax"</span>]=filter::minmax;</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     m_filterMap[<span class="stringliteral">"dilate"</span>]=filter::dilate;</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     m_filterMap[<span class="stringliteral">"erode"</span>]=filter::erode;</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     m_filterMap[<span class="stringliteral">"close"</span>]=filter::close;</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     m_filterMap[<span class="stringliteral">"open"</span>]=filter::open;</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     m_filterMap[<span class="stringliteral">"homog"</span>]=filter::homog;</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     m_filterMap[<span class="stringliteral">"sobelx"</span>]=filter::sobelx;</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>     m_filterMap[<span class="stringliteral">"sobely"</span>]=filter::sobely;</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>     m_filterMap[<span class="stringliteral">"sobelxy"</span>]=filter::sobelxy;</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     m_filterMap[<span class="stringliteral">"sobelyx"</span>]=filter::sobelyx;</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     m_filterMap[<span class="stringliteral">"smooth"</span>]=filter::smooth;</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     m_filterMap[<span class="stringliteral">"density"</span>]=filter::density;</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>     m_filterMap[<span class="stringliteral">"mode"</span>]=filter::mode;</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     m_filterMap[<span class="stringliteral">"mixed"</span>]=filter::mixed;</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     m_filterMap[<span class="stringliteral">"smoothnodata"</span>]=filter::smoothnodata;</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     m_filterMap[<span class="stringliteral">"threshold"</span>]=filter::threshold;</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     m_filterMap[<span class="stringliteral">"ismin"</span>]=filter::ismin;</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>     m_filterMap[<span class="stringliteral">"ismax"</span>]=filter::ismax;</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     m_filterMap[<span class="stringliteral">"heterog"</span>]=filter::heterog;</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     m_filterMap[<span class="stringliteral">"order"</span>]=filter::order;</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     m_filterMap[<span class="stringliteral">"median"</span>]=filter::median;</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     m_filterMap[<span class="stringliteral">"savgolay"</span>]=filter::savgolay;</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     m_filterMap[<span class="stringliteral">"percentile"</span>]=filter::percentile;</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   }</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span> </div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span> </div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <span class="keyword">static</span> PADDING getPadding(<span class="keyword">const</span> std::string& padString){</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     std::map<std::string, PADDING> padMap;</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     padMap[<span class="stringliteral">"zero"</span>]=filter::zero;</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     padMap[<span class="stringliteral">"symmetric"</span>]=filter::symmetric;</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     padMap[<span class="stringliteral">"replicate"</span>]=filter::replicate;</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     padMap[<span class="stringliteral">"circular"</span>]=filter::circular;</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     <span class="keywordflow">return</span>(padMap[padString]);</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   };</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span> </div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   std::vector<double> m_taps;</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   std::vector<short> m_class;</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   std::vector<short> m_mask;</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   std::string m_padding;</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   std::vector<double> m_noDataValues;</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   std::vector<double> m_threshold;</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span> };</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span> </div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span> </div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span> <span class="comment">//input[band], output</span></div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span> <span class="comment">//returns wavelength for which srf is maximum</span></div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> Filter::applySrf(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<double></a>& srf, <span class [...]
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span> {  </div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   assert(srf.size()==2);<span class="comment">//[0]: wavelength, [1]: response function</span></div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <span class="keywordtype">int</span> nband=srf[0].size(); </div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <span class="keywordtype">double</span> start=floor(wavelengthIn[0]);</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <span class="keywordtype">double</span> end=ceil(wavelengthIn.back());</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     std::cout << <span class="stringliteral">"wavelengths in ["</span> << start << <span class="stringliteral">","</span> << end << <span class="stringliteral">"]"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span> </div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span> </div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   gsl_interp_accel *acc;</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   stat.allocAcc(acc);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   gsl_spline *spline;</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   stat.getSpline(interpolationType,nband,spline);</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   stat.initSpline(spline,&(srf[0][0]),&(srf[1][0]),nband);</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     std::cout << <span class="stringliteral">"calculating norm of srf"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <span class="keywordtype">double</span> norm=0;</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   norm=gsl_spline_eval_integ(spline,srf[0].front(),srf[0].back(),acc);</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     std::cout << <span class="stringliteral">"norm of srf: "</span> << norm << std::endl << std::flush;</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   gsl_spline_free(spline);</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   gsl_interp_accel_free(acc);  </div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   <span class="comment">//interpolate input and srf to delta</span></div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   </div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   std::vector<double> wavelength_fine;</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="keywordflow">for</span>(<span class="keywordtype">double</span> win=floor(wavelengthIn[0]);win<=ceil(wavelengthIn.back());win+=delta)</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     wavelength_fine.push_back(win);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span> </div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     std::cout << <span class="stringliteral">"interpolate wavelengths to "</span> << wavelength_fine.size() << <span class="stringliteral">" entries "</span> << std::endl;</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   std::vector<double> srf_fine;<span class="comment">//spectral response function, interpolated for wavelength_fine</span></div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span> </div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   stat.interpolateUp(srf[0],srf[1],wavelength_fine,interpolationType,srf_fine,verbose);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   assert(srf_fine.size()==wavelength_fine.size());</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span> <span class="keyword">private</span>:</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span> </div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <span class="keyword">static</span> <span class="keywordtype">void</span> initFilterMap(std::map<std::string, FILTER_TYPE>& m_filterMap){</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>     <span class="comment">//initialize Map</span></div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>     m_filterMap[<span class="stringliteral">"dwt"</span>]=filter::dwt;</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>     m_filterMap[<span class="stringliteral">"dwti"</span>]=filter::dwti;</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>     m_filterMap[<span class="stringliteral">"dwt_cut"</span>]=filter::dwt_cut;</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>     m_filterMap[<span class="stringliteral">"dwt_cut_from"</span>]=filter::dwt_cut_from;</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>     m_filterMap[<span class="stringliteral">"stdev"</span>]=filter::stdev;</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>     m_filterMap[<span class="stringliteral">"var"</span>]=filter::var;</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>     m_filterMap[<span class="stringliteral">"min"</span>]=filter::min;</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>     m_filterMap[<span class="stringliteral">"max"</span>]=filter::max;</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>     m_filterMap[<span class="stringliteral">"sum"</span>]=filter::sum;</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     m_filterMap[<span class="stringliteral">"mean"</span>]=filter::mean;</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     m_filterMap[<span class="stringliteral">"minmax"</span>]=filter::minmax;</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     m_filterMap[<span class="stringliteral">"dilate"</span>]=filter::dilate;</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     m_filterMap[<span class="stringliteral">"erode"</span>]=filter::erode;</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     m_filterMap[<span class="stringliteral">"close"</span>]=filter::close;</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     m_filterMap[<span class="stringliteral">"open"</span>]=filter::open;</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>     m_filterMap[<span class="stringliteral">"homog"</span>]=filter::homog;</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>     m_filterMap[<span class="stringliteral">"sobelx"</span>]=filter::sobelx;</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     m_filterMap[<span class="stringliteral">"sobely"</span>]=filter::sobely;</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     m_filterMap[<span class="stringliteral">"sobelxy"</span>]=filter::sobelxy;</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     m_filterMap[<span class="stringliteral">"sobelyx"</span>]=filter::sobelyx;</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>     m_filterMap[<span class="stringliteral">"smooth"</span>]=filter::smooth;</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     m_filterMap[<span class="stringliteral">"density"</span>]=filter::density;</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     m_filterMap[<span class="stringliteral">"mode"</span>]=filter::mode;</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     m_filterMap[<span class="stringliteral">"mixed"</span>]=filter::mixed;</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     m_filterMap[<span class="stringliteral">"smoothnodata"</span>]=filter::smoothnodata;</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>     m_filterMap[<span class="stringliteral">"threshold"</span>]=filter::threshold;</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     m_filterMap[<span class="stringliteral">"ismin"</span>]=filter::ismin;</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     m_filterMap[<span class="stringliteral">"ismax"</span>]=filter::ismax;</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     m_filterMap[<span class="stringliteral">"heterog"</span>]=filter::heterog;</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     m_filterMap[<span class="stringliteral">"order"</span>]=filter::order;</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     m_filterMap[<span class="stringliteral">"nvalid"</span>]=filter::nvalid;</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     m_filterMap[<span class="stringliteral">"median"</span>]=filter::median;</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     m_filterMap[<span class="stringliteral">"savgolay"</span>]=filter::savgolay;</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     m_filterMap[<span class="stringliteral">"percentile"</span>]=filter::percentile;</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   }</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span> </div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span> </div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <span class="keyword">static</span> PADDING getPadding(<span class="keyword">const</span> std::string& padString){</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     std::map<std::string, PADDING> padMap;</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     padMap[<span class="stringliteral">"zero"</span>]=filter::zero;</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     padMap[<span class="stringliteral">"symmetric"</span>]=filter::symmetric;</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     padMap[<span class="stringliteral">"replicate"</span>]=filter::replicate;</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     padMap[<span class="stringliteral">"circular"</span>]=filter::circular;</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     <span class="keywordflow">return</span>(padMap[padString]);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   };</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span> </div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   std::vector<double> m_taps;</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   std::vector<short> m_class;</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   std::vector<short> m_mask;</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   std::string m_padding;</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   std::vector<double> m_noDataValues;</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   std::vector<double> m_threshold;</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span> };</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span> </div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span> </div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span> <span class="comment">//input[band], output</span></div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span> <span class="comment">//returns wavelength for which srf is maximum</span></div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> Filter::applySrf(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<double></a>& srf, <span class [...]
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span> {  </div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   assert(srf.size()==2);<span class="comment">//[0]: wavelength, [1]: response function</span></div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <span class="keywordtype">int</span> nband=srf[0].size(); </div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <span class="keywordtype">double</span> start=floor(wavelengthIn[0]);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <span class="keywordtype">double</span> end=ceil(wavelengthIn.back());</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     std::cout << <span class="stringliteral">"wavelengths in ["</span> << start << <span class="stringliteral">","</span> << end << <span class="stringliteral">"]"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span> </div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span> </div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   gsl_interp_accel *acc;</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   stat.allocAcc(acc);</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   gsl_spline *spline;</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   stat.getSpline(interpolationType,nband,spline);</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   stat.initSpline(spline,&(srf[0][0]),&(srf[1][0]),nband);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     std::cout << <span class="stringliteral">"calculating norm of srf"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="keywordtype">double</span> norm=0;</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   norm=gsl_spline_eval_integ(spline,srf[0].front(),srf[0].back(),acc);</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     std::cout << <span class="stringliteral">"norm of srf: "</span> << norm << std::endl << std::flush;</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   gsl_spline_free(spline);</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   gsl_interp_accel_free(acc);  </div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="comment">//interpolate input and srf to delta</span></div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   </div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   std::vector<double> wavelength_fine;</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="keywordflow">for</span>(<span class="keywordtype">double</span> win=floor(wavelengthIn[0]);win<=ceil(wavelengthIn.back());win+=delta)</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     wavelength_fine.push_back(win);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span> </div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     std::cout << <span class="stringliteral">"interpolate wavelengths to "</span> << wavelength_fine.size() << <span class="stringliteral">" entries "</span> << std::endl;</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   std::vector<double> srf_fine;<span class="comment">//spectral response function, interpolated for wavelength_fine</span></div>
 <div class="line"><a name="l00198"></a><span class="lineno">  198</span> </div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   gsl_interp_accel *accOut;</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   stat.allocAcc(accOut);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   gsl_spline *splineOut;</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   stat.getSpline(interpolationType,wavelength_fine.size(),splineOut);</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   assert(splineOut);</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span> </div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   assert(wavelengthIn.size()==input.size());</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   std::vector<double> input_fine;</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   std::vector<double> product(wavelength_fine.size());</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   std::vector<double> wavelengthOut(wavelength_fine.size());</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   stat.interpolateUp(wavelengthIn,input,wavelength_fine,interpolationType,input_fine,verbose);</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span> </div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     std::cout << <span class="stringliteral">"input_fine.size(): "</span> << input_fine.size() << std::endl;</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input_fine.size();++iband){</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     product[iband]=input_fine[iband]*srf_fine[iband];</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     wavelengthOut[iband]=wavelength_fine[iband]*srf_fine[iband];</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   }</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span> </div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   assert(input_fine.size()==srf_fine.size());</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   assert(input_fine.size()==wavelength_fine.size());</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   stat.initSpline(splineOut,&(wavelength_fine[0]),&(product[0]),wavelength_fine.size());</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <span class="keywordflow">if</span>(normalize)</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     output=gsl_spline_eval_integ(splineOut,start,end,accOut)/norm;</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     output=gsl_spline_eval_integ(splineOut,start,end,accOut);</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span> </div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   stat.initSpline(splineOut,&(wavelength_fine[0]),&(wavelengthOut[0]),wavelength_fine.size());</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   <span class="keywordtype">double</span> centreWavelength=gsl_spline_eval_integ(splineOut,start,end,accOut)/norm;</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   </div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   gsl_spline_free(splineOut);</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   gsl_interp_accel_free(accOut);</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span> </div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   <span class="keywordflow">return</span>(centreWavelength);</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span> }</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   stat.interpolateUp(srf[0],srf[1],wavelength_fine,interpolationType,srf_fine,verbose);</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   assert(srf_fine.size()==wavelength_fine.size());</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span> </div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   gsl_interp_accel *accOut;</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   stat.allocAcc(accOut);</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   gsl_spline *splineOut;</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   stat.getSpline(interpolationType,wavelength_fine.size(),splineOut);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   assert(splineOut);</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span> </div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   assert(wavelengthIn.size()==input.size());</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   std::vector<double> input_fine;</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   std::vector<double> product(wavelength_fine.size());</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   std::vector<double> wavelengthOut(wavelength_fine.size());</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   stat.interpolateUp(wavelengthIn,input,wavelength_fine,interpolationType,input_fine,verbose);</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span> </div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     std::cout << <span class="stringliteral">"input_fine.size(): "</span> << input_fine.size() << std::endl;</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input_fine.size();++iband){</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     product[iband]=input_fine[iband]*srf_fine[iband];</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     wavelengthOut[iband]=wavelength_fine[iband]*srf_fine[iband];</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   }</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span> </div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   assert(input_fine.size()==srf_fine.size());</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   assert(input_fine.size()==wavelength_fine.size());</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   stat.initSpline(splineOut,&(wavelength_fine[0]),&(product[0]),wavelength_fine.size());</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   <span class="keywordflow">if</span>(normalize)</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     output=gsl_spline_eval_integ(splineOut,start,end,accOut)/norm;</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     output=gsl_spline_eval_integ(splineOut,start,end,accOut);</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span> </div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   stat.initSpline(splineOut,&(wavelength_fine[0]),&(wavelengthOut[0]),wavelength_fine.size());</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <span class="keywordtype">double</span> centreWavelength=gsl_spline_eval_integ(splineOut,start,end,accOut)/norm;</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   </div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   gsl_spline_free(splineOut);</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   gsl_interp_accel_free(accOut);</div>
 <div class="line"><a name="l00234"></a><span class="lineno">  234</span> </div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span> <span class="comment">//input[band][sample], output[sample] (if !transposeInput)</span></div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span> <span class="comment">//returns wavelength for which srf is maximum</span></div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> Filter::applySrf(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vecto [...]
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span> {  </div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   assert(srf.size()==2);<span class="comment">//[0]: wavelength, [1]: response function</span></div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <span class="keywordtype">int</span> nband=srf[0].size(); </div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nsample=(transposeInput)? input.size():input[0].size();</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   output.resize((nsample+down-1)/down);</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <span class="keywordtype">double</span> start=floor(wavelengthIn[0]);</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="keywordtype">double</span> end=ceil(wavelengthIn.back());</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     std::cout << <span class="stringliteral">"wavelengths in ["</span> << start << <span class="stringliteral">","</span> << end << <span class="stringliteral">"]"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span> </div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span> </div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   gsl_interp_accel *acc;</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   stat.allocAcc(acc);</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   gsl_spline *spline;</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   stat.getSpline(interpolationType,nband,spline);</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   stat.initSpline(spline,&(srf[0][0]),&(srf[1][0]),nband);</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     std::cout << <span class="stringliteral">"calculating norm of srf"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="keywordtype">double</span> norm=0;</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   norm=gsl_spline_eval_integ(spline,srf[0].front(),srf[0].back(),acc);</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     std::cout << <span class="stringliteral">"norm of srf: "</span> << norm << std::endl << std::flush;</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   gsl_spline_free(spline);</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   gsl_interp_accel_free(acc);  </div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="comment">//interpolate input and srf to delta</span></div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   </div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   std::vector<double> wavelength_fine;</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordflow">for</span>(<span class="keywordtype">double</span> win=floor(wavelengthIn[0]);win<=ceil(wavelengthIn.back());win+=delta)</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     wavelength_fine.push_back(win);</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span> </div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     std::cout << <span class="stringliteral">"interpolate wavelengths to "</span> << wavelength_fine.size() << <span class="stringliteral">" entries "</span> << std::endl;</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   std::vector<double> srf_fine;<span class="comment">//spectral response function, interpolated for wavelength_fine</span></div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span> </div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   stat.interpolateUp(srf[0],srf[1],wavelength_fine,interpolationType,srf_fine,verbose);</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   assert(srf_fine.size()==wavelength_fine.size());</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="keywordflow">return</span>(centreWavelength);</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span> }</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span> </div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span> <span class="comment">//input[band][sample], output[sample] (if !transposeInput)</span></div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span> <span class="comment">//returns wavelength for which srf is maximum</span></div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> Filter::applySrf(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vecto [...]
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span> {  </div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   assert(srf.size()==2);<span class="comment">//[0]: wavelength, [1]: response function</span></div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <span class="keywordtype">int</span> nband=srf[0].size(); </div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nsample=(transposeInput)? input.size():input[0].size();</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   output.resize((nsample+down-1)/down);</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="keywordtype">double</span> start=floor(wavelengthIn[0]);</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <span class="keywordtype">double</span> end=ceil(wavelengthIn.back());</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     std::cout << <span class="stringliteral">"wavelengths in ["</span> << start << <span class="stringliteral">","</span> << end << <span class="stringliteral">"]"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span> </div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span> </div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   gsl_interp_accel *acc;</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   stat.allocAcc(acc);</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   gsl_spline *spline;</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   stat.getSpline(interpolationType,nband,spline);</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   stat.initSpline(spline,&(srf[0][0]),&(srf[1][0]),nband);</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     std::cout << <span class="stringliteral">"calculating norm of srf"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordtype">double</span> norm=0;</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   norm=gsl_spline_eval_integ(spline,srf[0].front(),srf[0].back(),acc);</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     std::cout << <span class="stringliteral">"norm of srf: "</span> << norm << std::endl << std::flush;</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   gsl_spline_free(spline);</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   gsl_interp_accel_free(acc);  </div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="comment">//interpolate input and srf to delta</span></div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   </div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   std::vector<double> wavelength_fine;</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   <span class="keywordflow">for</span>(<span class="keywordtype">double</span> win=floor(wavelengthIn[0]);win<=ceil(wavelengthIn.back());win+=delta)</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     wavelength_fine.push_back(win);</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span> </div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     std::cout << <span class="stringliteral">"interpolate wavelengths to "</span> << wavelength_fine.size() << <span class="stringliteral">" entries "</span> << std::endl;</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   std::vector<double> srf_fine;<span class="comment">//spectral response function, interpolated for wavelength_fine</span></div>
 <div class="line"><a name="l00275"></a><span class="lineno">  275</span> </div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   gsl_interp_accel *accOut;</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   stat.allocAcc(accOut);</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   gsl_spline *splineOut;</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   stat.getSpline(interpolationType,wavelength_fine.size(),splineOut);</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   assert(splineOut);</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span> </div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   std::vector<double> wavelengthOut;</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   <span class="keywordtype">double</span> centreWavelength=0;</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nsample;++isample){</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="keywordflow">if</span>((isample+1+down/2)%down)</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     std::vector<T> inputValues;</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     <span class="keywordflow">if</span>(transposeInput)</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       inputValues=input[isample];</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>       input.selectCol(isample,inputValues);</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     assert(wavelengthIn.size()==inputValues.size());</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     std::vector<double> input_fine;</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     std::vector<double> product(wavelength_fine.size());</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     stat.interpolateUp(wavelengthIn,inputValues,wavelength_fine,interpolationType,input_fine,verbose);</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span> </div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input_fine.size();++iband){</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>       product[iband]=input_fine[iband]*srf_fine[iband];</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>       <span class="keywordflow">if</span>(wavelengthOut.size()<input_fine.size())</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>         wavelengthOut.push_back(wavelength_fine[iband]*srf_fine[iband]);</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     }</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span> </div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     assert(input_fine.size()==srf_fine.size());</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     assert(input_fine.size()==wavelength_fine.size());</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     stat.initSpline(splineOut,&(wavelength_fine[0]),&(product[0]),wavelength_fine.size());</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     <span class="keywordflow">if</span>(normalize)</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       output[isample/down]=gsl_spline_eval_integ(splineOut,start,end,accOut)/norm;</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>       output[isample/down]=gsl_spline_eval_integ(splineOut,start,end,accOut);</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span> </div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     stat.initSpline(splineOut,&(wavelength_fine[0]),&(wavelengthOut[0]),wavelength_fine.size());</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="keywordflow">if</span>(centreWavelength>0);</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>       centreWavelength=gsl_spline_eval_integ(splineOut,start,end,accOut)/norm;</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   }</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   gsl_spline_free(splineOut);</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   gsl_interp_accel_free(accOut);</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span> </div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordflow">return</span>(centreWavelength);</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span> }</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   stat.interpolateUp(srf[0],srf[1],wavelength_fine,interpolationType,srf_fine,verbose);</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   assert(srf_fine.size()==wavelength_fine.size());</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span> </div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   gsl_interp_accel *accOut;</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   stat.allocAcc(accOut);</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   gsl_spline *splineOut;</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   stat.getSpline(interpolationType,wavelength_fine.size(),splineOut);</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   assert(splineOut);</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span> </div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   std::vector<double> wavelengthOut;</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <span class="keywordtype">double</span> centreWavelength=0;</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nsample;++isample){</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     <span class="keywordflow">if</span>((isample+1+down/2)%down)</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     std::vector<T> inputValues;</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     <span class="keywordflow">if</span>(transposeInput)</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>       inputValues=input[isample];</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>       input.selectCol(isample,inputValues);</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     assert(wavelengthIn.size()==inputValues.size());</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     std::vector<double> input_fine;</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     std::vector<double> product(wavelength_fine.size());</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     stat.interpolateUp(wavelengthIn,inputValues,wavelength_fine,interpolationType,input_fine,verbose);</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span> </div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input_fine.size();++iband){</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       product[iband]=input_fine[iband]*srf_fine[iband];</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       <span class="keywordflow">if</span>(wavelengthOut.size()<input_fine.size())</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>         wavelengthOut.push_back(wavelength_fine[iband]*srf_fine[iband]);</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     }</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span> </div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     assert(input_fine.size()==srf_fine.size());</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     assert(input_fine.size()==wavelength_fine.size());</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     stat.initSpline(splineOut,&(wavelength_fine[0]),&(product[0]),wavelength_fine.size());</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     <span class="keywordflow">if</span>(normalize)</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       output[isample/down]=gsl_spline_eval_integ(splineOut,start,end,accOut)/norm;</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       output[isample/down]=gsl_spline_eval_integ(splineOut,start,end,accOut);</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span> </div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     stat.initSpline(splineOut,&(wavelength_fine[0]),&(wavelengthOut[0]),wavelength_fine.size());</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     <span class="keywordflow">if</span>(centreWavelength>0);</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       centreWavelength=gsl_spline_eval_integ(splineOut,start,end,accOut)/norm;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   }</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   gsl_spline_free(splineOut);</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   gsl_interp_accel_free(accOut);</div>
 <div class="line"><a name="l00321"></a><span class="lineno">  321</span> </div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::applyFwhm(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::vector<double> &wavelengthOut, <span class="keyword">const</span> std::vector& [...]
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <span class="keywordtype">double</span> delta=1;<span class="comment">//1 nm resolution</span></div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   std::vector<double> stddev(fwhm.size());</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<fwhm.size();++index)</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     stddev[index]=fwhm[index]/2.0/sqrt(2*log(2.0));<span class="comment">//http://mathworld.wolfram.com/FullWidthatHalfMaximum.html</span></div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>   assert(wavelengthOut.size()==fwhm.size());</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>   assert(wavelengthIn.size()==input.size());</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>   assert(wavelengthIn[0]<=wavelengthOut[0]);</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   assert(wavelengthIn.back()>=wavelengthOut.back());</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   std::vector<double> input_fine;</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>   std::vector<double> wavelength_fine;</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>   <span class="keywordflow">for</span>(<span class="keywordtype">double</span> win=floor(wavelengthIn[0]);win<=ceil(wavelengthIn.back());win+=delta)</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     wavelength_fine.push_back(win);</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<wavelength_fine.size();++index)</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>       std::cout << <span class="stringliteral">" "</span> << wavelength_fine[index];</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     std::cout << std::endl;</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     std::cout << <span class="stringliteral">"interpolate input wavelength to "</span> << delta << <span class="stringliteral">" nm resolution (size="</span> << wavelength_fine.size() << <span class="stringliteral">")"</span> << std::endl;</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   }</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   stat.interpolateUp(wavelengthIn,input,wavelength_fine,interpolationType,input_fine,verbose);</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   <span class="keywordtype">int</span> nbandIn=wavelength_fine.size();</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     </div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>   <span class="keywordtype">int</span> nbandOut=wavelengthOut.size();</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   output.resize(nbandOut);</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> tf(nbandIn,nbandOut);</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexOut=0;indexOut<nbandOut;++indexOut){</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     <span class="keywordtype">double</span> norm=0;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexIn=0;indexIn<nbandIn;++indexIn){</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       <span class="comment">// tf(indexIn,indexOut)=</span></div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       tf[indexIn][indexOut]=</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>         exp((wavelengthOut[indexOut]-wavelength_fine[indexIn])</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>             *(wavelength_fine[indexIn]-wavelengthOut[indexOut])</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>             /2.0/stddev[indexOut]</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>             /stddev[indexOut]);</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>       tf[indexIn][indexOut]/=sqrt(2.0*M_PI);</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       tf[indexIn][indexOut]/=stddev[indexOut];</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       norm+=tf[indexIn][indexOut];</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     }</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     output[indexOut]=0;</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexIn=0;indexIn<nbandIn;++indexIn)</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       output[indexOut]+=input_fine[indexIn]*tf[indexIn][indexOut]/norm;</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   }</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span> }</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span> </div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span> </div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   <span class="comment">//input[inBand][sample], output[outBand][sample]</span></div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::applyFwhm(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <span class="keyword">const</span> std::vector<double> &wavelengthOut, <s [...]
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   <span class="keywordtype">double</span> delta=1;<span class="comment">//1 nm resolution</span></div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   std::vector<double> stddev(fwhm.size());</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<fwhm.size();++index)</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     stddev[index]=fwhm[index]/2.0/sqrt(2*log(2.0));<span class="comment">//http://mathworld.wolfram.com/FullWidthatHalfMaximum.html</span></div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>   std::vector<double> wavelength_fine;</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   <span class="keywordflow">for</span>(<span class="keywordtype">double</span> win=floor(wavelengthIn[0]);win<=ceil(wavelengthIn.back());win+=delta)</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     wavelength_fine.push_back(win);</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   assert(wavelengthOut.size()==fwhm.size());</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   assert(wavelengthIn[0]<=wavelengthOut[0]);</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   assert(wavelengthIn.back()>=wavelengthOut.back());</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>   <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<wavelength_fine.size();++index)</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       std::cout << <span class="stringliteral">" "</span> << wavelength_fine[index];</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     std::cout << std::endl;</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     std::cout << <span class="stringliteral">"interpolate input wavelength to "</span> << delta << <span class="stringliteral">" nm resolution (size="</span> << wavelength_fine.size() << <span class="stringliteral">")"</span> << std::endl;</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   }</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   <span class="keywordtype">int</span> nbandIn=wavelength_fine.size();</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   <span class="keywordtype">int</span> nbandOut=wavelengthOut.size();</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>   output.resize(nbandOut,(input[0].size()+down-1)/down);</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span> </div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> tf(nbandIn,nbandOut);</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   std::vector<double> norm(nbandOut);</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexOut=0;indexOut<nbandOut;++indexOut){</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     norm[indexOut]=0;</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexIn=0;indexIn<nbandIn;++indexIn){</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       tf[indexIn][indexOut]=</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>         exp((wavelengthOut[indexOut]-wavelength_fine[indexIn])</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>             *(wavelength_fine[indexIn]-wavelengthOut[indexOut])</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>             /2.0/stddev[indexOut]</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>             /stddev[indexOut]);</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       tf[indexIn][indexOut]/=sqrt(2.0*M_PI);</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       tf[indexIn][indexOut]/=stddev[indexOut];</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       norm[indexOut]+=tf[indexIn][indexOut];</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     }</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>   }</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span> </div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<input[0].size();++isample){</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     <span class="keywordflow">if</span>((isample+1+down/2)%down)</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>     std::vector<T> inputValues;</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     input.selectCol(isample,inputValues);</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     assert(wavelengthIn.size()==inputValues.size());</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexOut=0;indexOut<nbandOut;++indexOut){</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       std::vector<double> input_fine;</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       stat.interpolateUp(wavelengthIn,inputValues,wavelength_fine,interpolationType,input_fine,verbose);</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       output[indexOut][(isample+down-1)/down]=0;</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexIn=0;indexIn<nbandIn;++indexIn){</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>         output[indexOut][(isample+down-1)/down]+=input_fine[indexIn]*tf[indexIn][indexOut]/norm[indexOut];</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       }</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     }</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>   }</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span> }</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span> </div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::smooth(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">short</span> dim)</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span> {</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>   assert(dim>0);</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>   m_taps.resize(dim);</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<dim;++itap)</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     m_taps[itap]=1.0/dim;</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   filter(input,output);</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>  }</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span> </div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::smoothNoData(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::string& interpolationType, std::vector<T>& output)</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span> {</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   stat.setNoDataValues(m_noDataValues);</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>   std::vector<double> abscis(input.size());</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<abscis.size();++i)</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     abscis[i]=i;</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>   stat.interpolateNoData(abscis,input,interpolationType,output);</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>  }</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span> </div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::filter(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output)</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span> {</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>   assert(input.size()>=m_taps.size());</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>   output.resize(input.size());</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>   <span class="keywordtype">int</span> i=0;</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>   <span class="comment">//start: extend input by padding</span></div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>   <span class="keywordflow">for</span>(i=0;i<m_taps.size()/2;++i){</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>     <span class="comment">//todo:introduce nodata?</span></div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     output[i]=m_taps[m_taps.size()/2]*input[i];</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=m_taps.size()/2;++t){</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[i+t];</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       <span class="keywordflow">if</span>(i>=t)</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     output[i]+=m_taps[m_taps.size()/2-t]*input[i-t];</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     <span class="keywordflow">case</span>(replicate):</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[0];</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     <span class="keywordflow">case</span>(circular):</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[input.size()+i-t];</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="keywordflow">return</span>(centreWavelength);</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span> }</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span> </div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::applyFwhm(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::vector<double> &wavelengthOut, <span class="keyword">const</span> std::vector& [...]
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>   <span class="keywordtype">double</span> delta=1;<span class="comment">//1 nm resolution</span></div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>   std::vector<double> stddev(fwhm.size());</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<fwhm.size();++index)</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     stddev[index]=fwhm[index]/2.0/sqrt(2*log(2.0));<span class="comment">//http://mathworld.wolfram.com/FullWidthatHalfMaximum.html</span></div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   assert(wavelengthOut.size()==fwhm.size());</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   assert(wavelengthIn.size()==input.size());</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   assert(wavelengthIn[0]<=wavelengthOut[0]);</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>   assert(wavelengthIn.back()>=wavelengthOut.back());</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   std::vector<double> input_fine;</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   std::vector<double> wavelength_fine;</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keywordflow">for</span>(<span class="keywordtype">double</span> win=floor(wavelengthIn[0]);win<=ceil(wavelengthIn.back());win+=delta)</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     wavelength_fine.push_back(win);</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<wavelength_fine.size();++index)</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       std::cout << <span class="stringliteral">" "</span> << wavelength_fine[index];</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     std::cout << std::endl;</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     std::cout << <span class="stringliteral">"interpolate input wavelength to "</span> << delta << <span class="stringliteral">" nm resolution (size="</span> << wavelength_fine.size() << <span class="stringliteral">")"</span> << std::endl;</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   }</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>   stat.interpolateUp(wavelengthIn,input,wavelength_fine,interpolationType,input_fine,verbose);</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   <span class="keywordtype">int</span> nbandIn=wavelength_fine.size();</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     </div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keywordtype">int</span> nbandOut=wavelengthOut.size();</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   output.resize(nbandOut);</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> tf(nbandIn,nbandOut);</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexOut=0;indexOut<nbandOut;++indexOut){</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     <span class="keywordtype">double</span> norm=0;</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexIn=0;indexIn<nbandIn;++indexIn){</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       <span class="comment">// tf(indexIn,indexOut)=</span></div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       tf[indexIn][indexOut]=</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>         exp((wavelengthOut[indexOut]-wavelength_fine[indexIn])</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>             *(wavelength_fine[indexIn]-wavelengthOut[indexOut])</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>             /2.0/stddev[indexOut]</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>             /stddev[indexOut]);</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       tf[indexIn][indexOut]/=sqrt(2.0*M_PI);</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       tf[indexIn][indexOut]/=stddev[indexOut];</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       norm+=tf[indexIn][indexOut];</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     }</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     output[indexOut]=0;</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexIn=0;indexIn<nbandIn;++indexIn)</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       output[indexOut]+=input_fine[indexIn]*tf[indexIn][indexOut]/norm;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>   }</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span> }</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span> </div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span> </div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   <span class="comment">//input[inBand][sample], output[outBand][sample]</span></div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::applyFwhm(<span class="keyword">const</span> std::vector<double> &wavelengthIn, <span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <span class="keyword">const</span> std::vector<double> &wavelengthOut, <s [...]
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>   <span class="keywordtype">double</span> delta=1;<span class="comment">//1 nm resolution</span></div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   std::vector<double> stddev(fwhm.size());</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<fwhm.size();++index)</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     stddev[index]=fwhm[index]/2.0/sqrt(2*log(2.0));<span class="comment">//http://mathworld.wolfram.com/FullWidthatHalfMaximum.html</span></div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   std::vector<double> wavelength_fine;</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   <span class="keywordflow">for</span>(<span class="keywordtype">double</span> win=floor(wavelengthIn[0]);win<=ceil(wavelengthIn.back());win+=delta)</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     wavelength_fine.push_back(win);</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>   assert(wavelengthOut.size()==fwhm.size());</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   assert(wavelengthIn[0]<=wavelengthOut[0]);</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>   assert(wavelengthIn.back()>=wavelengthOut.back());</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<wavelength_fine.size();++index)</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       std::cout << <span class="stringliteral">" "</span> << wavelength_fine[index];</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     std::cout << std::endl;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     std::cout << <span class="stringliteral">"interpolate input wavelength to "</span> << delta << <span class="stringliteral">" nm resolution (size="</span> << wavelength_fine.size() << <span class="stringliteral">")"</span> << std::endl;</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>   }</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   <span class="keywordtype">int</span> nbandIn=wavelength_fine.size();</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <span class="keywordtype">int</span> nbandOut=wavelengthOut.size();</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   output.resize(nbandOut,(input[0].size()+down-1)/down);</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span> </div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> tf(nbandIn,nbandOut);</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   std::vector<double> norm(nbandOut);</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexOut=0;indexOut<nbandOut;++indexOut){</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     norm[indexOut]=0;</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexIn=0;indexIn<nbandIn;++indexIn){</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       tf[indexIn][indexOut]=</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>         exp((wavelengthOut[indexOut]-wavelength_fine[indexIn])</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>             *(wavelength_fine[indexIn]-wavelengthOut[indexOut])</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>             /2.0/stddev[indexOut]</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>             /stddev[indexOut]);</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       tf[indexIn][indexOut]/=sqrt(2.0*M_PI);</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       tf[indexIn][indexOut]/=stddev[indexOut];</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       norm[indexOut]+=tf[indexIn][indexOut];</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     }</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>   }</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span> </div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<input[0].size();++isample){</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     <span class="keywordflow">if</span>((isample+1+down/2)%down)</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     std::vector<T> inputValues;</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     input.selectCol(isample,inputValues);</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     assert(wavelengthIn.size()==inputValues.size());</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexOut=0;indexOut<nbandOut;++indexOut){</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       std::vector<double> input_fine;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       stat.interpolateUp(wavelengthIn,inputValues,wavelength_fine,interpolationType,input_fine,verbose);</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       output[indexOut][(isample+down-1)/down]=0;</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> indexIn=0;indexIn<nbandIn;++indexIn){</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         output[indexOut][(isample+down-1)/down]+=input_fine[indexIn]*tf[indexIn][indexOut]/norm[indexOut];</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>       }</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     }</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>   }</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span> }</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span> </div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::smooth(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">short</span> dim)</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span> {</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>   assert(dim>0);</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   m_taps.resize(dim);</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<dim;++itap)</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>     m_taps[itap]=1.0/dim;</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   filter(input,output);</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>  }</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span> </div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::smoothNoData(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::string& interpolationType, std::vector<T>& output)</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span> {</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   stat.setNoDataValues(m_noDataValues);</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>   std::vector<double> abscis(input.size());</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<abscis.size();++i)</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     abscis[i]=i;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>   stat.interpolateNoData(abscis,input,interpolationType,output);</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>  }</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span> </div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::filter(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output)</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span> {</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>   assert(input.size()>=m_taps.size());</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>   output.resize(input.size());</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   <span class="keywordtype">int</span> i=0;</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>   <span class="comment">//start: extend input by padding</span></div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>   <span class="keywordflow">for</span>(i=0;i<m_taps.size()/2;++i){</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     <span class="comment">//todo:introduce nodata?</span></div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>     output[i]=m_taps[m_taps.size()/2]*input[i];</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=m_taps.size()/2;++t){</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[i+t];</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       <span class="keywordflow">if</span>(i>=t)</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     output[i]+=m_taps[m_taps.size()/2-t]*input[i-t];</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     <span class="keywordflow">case</span>(replicate):</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[0];</div>
 <div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     <span class="keywordflow">case</span>(zero):</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       output[i]+=m_taps[m_taps.size()/2-t]*0;</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     <span class="keywordflow">case</span>(circular):</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[input.size()+i-t];</div>
 <div class="line"><a name="l00466"></a><span class="lineno">  466</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>     <span class="keywordflow">case</span>(symmetric):</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[t-i];</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     }</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       }</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     }</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>   }</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>   <span class="comment">//main</span></div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>   <span class="keywordflow">for</span>(i=m_taps.size()/2;i<input.size()-m_taps.size()/2;++i){</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     <span class="comment">//todo:introduce nodata</span></div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     T leaveOut=(*(m_taps.begin()))*input[i-m_taps.size()/2];</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>     T include=(m_taps.back())*input[i+m_taps.size()/2];</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     output[i]=0;</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=0;t<m_taps.size();++t)</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       output[i]+=input[i-m_taps.size()/2+t]*m_taps[t];</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>   }</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>   <span class="comment">//end: extend input by padding</span></div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>   <span class="keywordflow">for</span>(i=input.size()-m_taps.size()/2;i<input.size();++i){</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     <span class="comment">//todo:introduce nodata?</span></div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     output[i]=m_taps[m_taps.size()/2]*input[i];</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     <span class="comment">//todo:introduce nodata?</span></div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=m_taps.size()/2;++t){</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[i-t];</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       <span class="keywordflow">if</span>(i+t<input.size())</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     output[i]+=m_taps[m_taps.size()/2+t]*input[i+t];</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     <span class="keywordflow">case</span>(replicate):</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       output[i]+=m_taps[m_taps.size()/2+t]*input.back();</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     <span class="keywordflow">case</span>(circular):</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[t-1];</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>     <span class="keywordflow">case</span>(zero):</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       output[i]+=m_taps[m_taps.size()/2-t]*0;</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     <span class="keywordflow">case</span>(symmetric):</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[t-i];</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     }</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       }</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     }</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>   }</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>   <span class="comment">//main</span></div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>   <span class="keywordflow">for</span>(i=m_taps.size()/2;i<input.size()-m_taps.size()/2;++i){</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     <span class="comment">//todo:introduce nodata</span></div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     T leaveOut=(*(m_taps.begin()))*input[i-m_taps.size()/2];</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     T include=(m_taps.back())*input[i+m_taps.size()/2];</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     output[i]=0;</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=0;t<m_taps.size();++t)</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       output[i]+=input[i-m_taps.size()/2+t]*m_taps[t];</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   }</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   <span class="comment">//end: extend input by padding</span></div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>   <span class="keywordflow">for</span>(i=input.size()-m_taps.size()/2;i<input.size();++i){</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     <span class="comment">//todo:introduce nodata?</span></div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     output[i]=m_taps[m_taps.size()/2]*input[i];</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     <span class="comment">//todo:introduce nodata?</span></div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=m_taps.size()/2;++t){</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[i-t];</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       <span class="keywordflow">if</span>(i+t<input.size())</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     output[i]+=m_taps[m_taps.size()/2+t]*input[i+t];</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     <span class="keywordflow">case</span>(replicate):</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       output[i]+=m_taps[m_taps.size()/2+t]*input.back();</div>
 <div class="line"><a name="l00500"></a><span class="lineno">  500</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     <span class="keywordflow">case</span>(zero):</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       output[i]+=m_taps[m_taps.size()/2+t]*0;</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     <span class="keywordflow">case</span>(circular):</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[t-1];</div>
 <div class="line"><a name="l00503"></a><span class="lineno">  503</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     <span class="keywordflow">case</span>(symmetric):</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[i-t];</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     }</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       }</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>     <span class="comment">//output[i]+=(m_taps[m_taps.size()/2+t]+m_taps[m_taps.size()/2-t])*input[i-t];</span></div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     <span class="keywordflow">case</span>(zero):</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>       output[i]+=m_taps[m_taps.size()/2+t]*0;</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>     <span class="keywordflow">case</span>(symmetric):</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[i-t];</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l00511"></a><span class="lineno">  511</span>     }</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   }</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span> }</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span> </div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span> <span class="comment">//todo: filling statBuffer can be optimized (no need to clear and fill entire buffer, just push back new value...)</span></div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::filter(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim)</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span> {</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   <span class="keywordtype">bool</span> verbose=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   assert(dim);</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   output.resize(input.size());</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="keywordtype">int</span> i=0;</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   stat.setNoDataValues(m_noDataValues);</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   std::vector<T> statBuffer;</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   <span class="keywordtype">short</span> binValue=0;</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>   <span class="comment">//start: extend input by padding</span></div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <span class="keywordflow">for</span>(i=0;i<dim/2;++i){</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     binValue=0;</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       <span class="keywordflow">if</span>(input[i]==m_class[iclass]){</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>         binValue=m_class[0];</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       }</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     }</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>     <span class="keywordflow">if</span>(m_class.size())</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       statBuffer.push_back(binValue);</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       statBuffer.push_back(input[i]);</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span> </div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=dim/2;++t){</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       T theValue=input[i+t];</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>         <span class="keywordflow">if</span>(theValue==m_class[iclass]){</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>           binValue=m_class[0];</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>         }</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       }</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       <span class="keywordflow">if</span>(m_class.size())</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     statBuffer.push_back(binValue);</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     statBuffer.push_back(theValue);</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span> </div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       <span class="keywordflow">if</span>(i>=t){</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     theValue=input[i-t];</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       }</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     <span class="keywordflow">case</span>(replicate):</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       theValue=input[0];</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     <span class="keywordflow">case</span>(circular):</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       theValue=input[input.size()+i-t];</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       }</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     <span class="comment">//output[i]+=(m_taps[m_taps.size()/2+t]+m_taps[m_taps.size()/2-t])*input[i-t];</span></div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     }</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>   }</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span> }</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span> </div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span> <span class="comment">//todo: filling statBuffer can be optimized (no need to clear and fill entire buffer, just push back new value...)</span></div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::filter(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dim)</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span> {</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="keywordtype">bool</span> verbose=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   assert(dim);</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   output.resize(input.size());</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   <span class="keywordtype">int</span> i=0;</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>   stat.setNoDataValues(m_noDataValues);</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   std::vector<T> statBuffer;</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>   <span class="keywordtype">short</span> binValue=0;</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>   <span class="comment">//start: extend input by padding</span></div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>   <span class="keywordflow">for</span>(i=0;i<dim/2;++i){</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     binValue=0;</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       <span class="keywordflow">if</span>(input[i]==m_class[iclass]){</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>         binValue=m_class[0];</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       }</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     }</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     <span class="keywordflow">if</span>(m_class.size())</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       statBuffer.push_back(binValue);</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       statBuffer.push_back(input[i]);</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span> </div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=dim/2;++t){</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       T theValue=input[i+t];</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>         <span class="keywordflow">if</span>(theValue==m_class[iclass]){</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>           binValue=m_class[0];</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>         }</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       }</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       <span class="keywordflow">if</span>(m_class.size())</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     statBuffer.push_back(binValue);</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     statBuffer.push_back(theValue);</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span> </div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       <span class="keywordflow">if</span>(i>=t){</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     theValue=input[i-t];</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       }</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     <span class="keywordflow">case</span>(replicate):</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       theValue=input[0];</div>
 <div class="line"><a name="l00563"></a><span class="lineno">  563</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     <span class="keywordflow">case</span>(zero):</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       theValue=0;</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     <span class="keywordflow">case</span>(circular):</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       theValue=input[input.size()+i-t];</div>
 <div class="line"><a name="l00566"></a><span class="lineno">  566</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     <span class="keywordflow">case</span>(symmetric):</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       theValue=input[t-i];</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     }</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       }</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>         <span class="keywordflow">if</span>(theValue==m_class[iclass]){</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>           binValue=m_class[0];</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>         }</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       }</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       <span class="keywordflow">if</span>(m_class.size())</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     statBuffer.push_back(binValue);</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     statBuffer.push_back(theValue);</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     }</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span> </div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     <span class="keywordflow">switch</span>(getFilterType(method)){</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     <span class="keywordflow">case</span>(filter::median):</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       output[i]=stat.median(statBuffer);</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     <span class="keywordflow">case</span>(filter::min):</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     <span class="keywordflow">case</span>(filter::erode):</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       output[i]=stat.mymin(statBuffer);</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     <span class="keywordflow">case</span>(filter::max):</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     <span class="keywordflow">case</span>(filter::dilate):</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       output[i]=stat.mymax(statBuffer);</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>     <span class="keywordflow">case</span>(filter::sum):</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       output[i]=sqrt(stat.sum(statBuffer));</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="keywordflow">case</span>(filter::var):</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       output[i]=stat.var(statBuffer);</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     <span class="keywordflow">case</span>(zero):</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       theValue=0;</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordflow">case</span>(symmetric):</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       theValue=input[t-i];</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     }</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       }</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>         <span class="keywordflow">if</span>(theValue==m_class[iclass]){</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>           binValue=m_class[0];</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>         }</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>       }</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       <span class="keywordflow">if</span>(m_class.size())</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     statBuffer.push_back(binValue);</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     statBuffer.push_back(theValue);</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     }</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span> </div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     <span class="keywordflow">switch</span>(getFilterType(method)){</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     <span class="keywordflow">case</span>(filter::nvalid):</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       output[i]=stat.nvalid(statBuffer);</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     <span class="keywordflow">case</span>(filter::median):</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       output[i]=stat.median(statBuffer);</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     <span class="keywordflow">case</span>(filter::min):</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>     <span class="keywordflow">case</span>(filter::erode):</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       output[i]=stat.mymin(statBuffer);</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     <span class="keywordflow">case</span>(filter::max):</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="keywordflow">case</span>(filter::dilate):</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       output[i]=stat.mymax(statBuffer);</div>
 <div class="line"><a name="l00602"></a><span class="lineno">  602</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     <span class="keywordflow">case</span>(filter::stdev):</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       output[i]=sqrt(stat.var(statBuffer));</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     <span class="keywordflow">case</span>(filter::sum):</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       output[i]=sqrt(stat.sum(statBuffer));</div>
 <div class="line"><a name="l00605"></a><span class="lineno">  605</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keywordflow">case</span>(filter::mean):</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       output[i]=stat.mean(statBuffer);</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keywordflow">case</span>(filter::var):</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       output[i]=stat.var(statBuffer);</div>
 <div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     <span class="keywordflow">case</span>(filter::percentile):</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       assert(m_threshold.size());</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       output[i]=stat.percentile(statBuffer,statBuffer.begin(),statBuffer.end(),m_threshold[0]);</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordflow">default</span>:{</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       std::ostringstream ess;</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       ess << <span class="stringliteral">"method "</span> << method << <span class="stringliteral">" ("</span> << getFilterType(method) << <span class="stringliteral">") not supported"</span>;</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     }</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     }</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>   }</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>   <span class="comment">//main</span></div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>   statBuffer.clear();</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>   <span class="keywordflow">for</span>(i=dim/2;i<input.size()-dim/2;++i){</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     binValue=0;</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=0;t<dim;++t){</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>         <span class="keywordflow">if</span>(input[i-dim/2+t]==m_class[iclass]){</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>           binValue=m_class[0];</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>         }</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       }</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       <span class="keywordflow">if</span>(m_class.size())</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         statBuffer.push_back(binValue);</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         statBuffer.push_back(input[i-dim/2+t]);</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     }</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     <span class="keywordflow">switch</span>(getFilterType(method)){</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     <span class="keywordflow">case</span>(filter::median):</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       output[i]=stat.median(statBuffer);</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     <span class="keywordflow">case</span>(filter::min):</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     <span class="keywordflow">case</span>(filter::erode):</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       output[i]=stat.mymin(statBuffer);</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     <span class="keywordflow">case</span>(filter::max):</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     <span class="keywordflow">case</span>(filter::dilate):</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>       output[i]=stat.mymax(statBuffer);</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     <span class="keywordflow">case</span>(filter::sum):</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       output[i]=sqrt(stat.sum(statBuffer));</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     <span class="keywordflow">case</span>(filter::var):</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       output[i]=stat.var(statBuffer);</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     <span class="keywordflow">case</span>(filter::mean):</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       output[i]=stat.mean(statBuffer);</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     <span class="keywordflow">case</span>(filter::stdev):</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       output[i]=sqrt(stat.var(statBuffer));</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     <span class="keywordflow">case</span>(filter::mean):</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       output[i]=stat.mean(statBuffer);</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     <span class="keywordflow">case</span>(filter::percentile):</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       assert(m_threshold.size());</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       output[i]=stat.percentile(statBuffer,statBuffer.begin(),statBuffer.end(),m_threshold[0]);</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     <span class="keywordflow">default</span>:{</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       std::ostringstream ess;</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       ess << <span class="stringliteral">"method "</span> << method << <span class="stringliteral">" ("</span> << getFilterType(method) << <span class="stringliteral">") not supported"</span>;</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     }</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     }</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>   }</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   <span class="comment">//main</span></div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   statBuffer.clear();</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>   <span class="keywordflow">for</span>(i=dim/2;i<input.size()-dim/2;++i){</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     binValue=0;</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=0;t<dim;++t){</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         <span class="keywordflow">if</span>(input[i-dim/2+t]==m_class[iclass]){</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>           binValue=m_class[0];</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         }</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       }</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       <span class="keywordflow">if</span>(m_class.size())</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>         statBuffer.push_back(binValue);</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>         statBuffer.push_back(input[i-dim/2+t]);</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     }</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>     <span class="keywordflow">switch</span>(getFilterType(method)){</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordflow">case</span>(filter::nvalid):</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       output[i]=stat.nvalid(statBuffer);</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="keywordflow">case</span>(filter::median):</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       output[i]=stat.median(statBuffer);</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordflow">case</span>(filter::min):</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     <span class="keywordflow">case</span>(filter::erode):</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       output[i]=stat.mymin(statBuffer);</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     <span class="keywordflow">case</span>(filter::max):</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     <span class="keywordflow">case</span>(filter::dilate):</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       output[i]=stat.mymax(statBuffer);</div>
 <div class="line"><a name="l00657"></a><span class="lineno">  657</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     <span class="keywordflow">case</span>(filter::percentile):</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>       assert(m_threshold.size());</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       output[i]=stat.percentile(statBuffer,statBuffer.begin(),statBuffer.end(),m_threshold[0]);</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       std::string errorString=<span class="stringliteral">"method not supported"</span>;</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     }</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     statBuffer.clear();</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   }</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <span class="comment">//end: extend input by padding</span></div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   <span class="keywordflow">for</span>(i=input.size()-dim/2;i<input.size();++i){</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     binValue=0;</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       <span class="keywordflow">if</span>(input[i]==m_class[iclass]){</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     binValue=m_class[0];</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>       }</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     }</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     <span class="keywordflow">if</span>(m_class.size())</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>       statBuffer.push_back(binValue);</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       statBuffer.push_back(input[i]);</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span> </div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=dim/2;++t){</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       T theValue=input[i-t];</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     <span class="keywordflow">if</span>(theValue==m_class[iclass]){</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       binValue=m_class[0];</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     }</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       }</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       <span class="keywordflow">if</span>(m_class.size())</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     statBuffer.push_back(binValue);</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     statBuffer.push_back(theValue);</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       <span class="keywordflow">if</span>(i+t<input.size())</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     theValue=input[i+t];</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     <span class="keywordflow">case</span>(replicate):</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       theValue=input.back();</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="keywordflow">case</span>(circular):</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       theValue=input[t-1];</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="keywordflow">case</span>(zero):</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       theValue=0;</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     <span class="keywordflow">case</span>(symmetric):</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       theValue=input[i-t];</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     }</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>       }</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     <span class="keywordflow">if</span>(theValue==m_class[iclass]){</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>       binValue=m_class[0];</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     }</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>       }</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       <span class="keywordflow">if</span>(m_class.size())</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     statBuffer.push_back(binValue);</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     statBuffer.push_back(theValue);</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     }</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     <span class="keywordflow">switch</span>(getFilterType(method)){</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     <span class="keywordflow">case</span>(filter::median):</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       output[i]=stat.median(statBuffer);</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     <span class="keywordflow">case</span>(filter::min):</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     <span class="keywordflow">case</span>(filter::erode):</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>       output[i]=stat.mymin(statBuffer);</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="keywordflow">case</span>(filter::max):</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     <span class="keywordflow">case</span>(filter::dilate):</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       output[i]=stat.mymax(statBuffer);</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     <span class="keywordflow">case</span>(filter::sum):</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       output[i]=sqrt(stat.sum(statBuffer));</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>     <span class="keywordflow">case</span>(filter::var):</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>       output[i]=stat.var(statBuffer);</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>     <span class="keywordflow">case</span>(filter::mean):</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>       output[i]=stat.mean(statBuffer);</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     <span class="keywordflow">case</span>(filter::percentile):</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>       assert(m_threshold.size());</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       output[i]=stat.percentile(statBuffer,statBuffer.begin(),statBuffer.end(),m_threshold[0]);</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       std::string errorString=<span class="stringliteral">"method not supported"</span>;</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     }</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>   }</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>  }</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span> </div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::smooth(T* input, <span class="keywordtype">int</span> inputSize, std::vector<T>& output, <span class="keywordtype">short</span> dim)</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span> {</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>   assert(dim>0);</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>   m_taps.resize(dim);</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<dim;++itap)</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>     m_taps[itap]=1.0/dim;</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>   filter(input,output);</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>  }</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span> </div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::filter(T* input, <span class="keywordtype">int</span> inputSize, std::vector<T>& output)</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span> {</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>   assert(inputSize>=m_taps.size());</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>   output.resize(inputSize);</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>   <span class="keywordtype">int</span> i=0;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span> </div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>   <span class="comment">//start: extend input by padding</span></div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>   <span class="keywordflow">for</span>(i=0;i<m_taps.size()/2;++i){</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     <span class="comment">//todo:introduce nodata</span></div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     output[i]=m_taps[m_taps.size()/2]*input[i];</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span> </div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=m_taps.size()/2;++t){</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[i+t];</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       <span class="keywordflow">if</span>(i>=t)</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>     output[i]+=m_taps[m_taps.size()/2-t]*input[i-t];</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>     <span class="keywordflow">case</span>(replicate):</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[0];</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     <span class="keywordflow">case</span>(circular):</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[input.size()+i-t];</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     <span class="keywordflow">case</span>(zero):</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>       output[i]+=m_taps[m_taps.size()/2-t]*0;</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     <span class="keywordflow">case</span>(symmetric):</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[t-i];</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     }</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       }</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>     }</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>   }</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>   <span class="comment">//main</span></div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>   <span class="keywordflow">for</span>(i=m_taps.size()/2;i<input.size()-m_taps.size()/2;++i){</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     <span class="comment">//todo:introduce nodata</span></div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>     T leaveOut=(*(m_taps.begin()))*input[i-m_taps.size()/2];</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     T include=(m_taps.back())*input[i+m_taps.size()/2];</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     output[i]=0;</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=0;t<m_taps.size();++t)</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       output[i]+=input[i-m_taps.size()/2+t]*m_taps[t];</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>   }</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>   <span class="comment">//end: extend input by padding</span></div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>   <span class="keywordflow">for</span>(i=input.size()-m_taps.size()/2;i<input.size();++i){</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     <span class="comment">//todo:introduce nodata</span></div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     output[i]=m_taps[m_taps.size()/2]*input[i];</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>     <span class="comment">//todo:introduce nodata</span></div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=m_taps.size()/2;++t){</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[i-t];</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       <span class="keywordflow">if</span>(i+t<input.size())</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>     output[i]+=m_taps[m_taps.size()/2+t]*input[i+t];</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>     <span class="keywordflow">case</span>(replicate):</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       output[i]+=m_taps[m_taps.size()/2+t]*input.back();</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     <span class="keywordflow">case</span>(circular):</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[t-1];</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     <span class="keywordflow">case</span>(zero):</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       output[i]+=m_taps[m_taps.size()/2+t]*0;</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     <span class="keywordflow">case</span>(symmetric):</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[i-t];</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>     }</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       }</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     }</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>   }</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span> }</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span> </div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span> }</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span> </div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span> <span class="preprocessor">#endif </span><span class="comment">/* _MYFILTER_H_ */</span><span class="preprocessor"></span></div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     <span class="keywordflow">case</span>(filter::sum):</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>       output[i]=sqrt(stat.sum(statBuffer));</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <span class="keywordflow">case</span>(filter::var):</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>       output[i]=stat.var(statBuffer);</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     <span class="keywordflow">case</span>(filter::mean):</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       output[i]=stat.mean(statBuffer);</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     <span class="keywordflow">case</span>(filter::percentile):</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       assert(m_threshold.size());</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>       output[i]=stat.percentile(statBuffer,statBuffer.begin(),statBuffer.end(),m_threshold[0]);</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       std::string errorString=<span class="stringliteral">"method not supported"</span>;</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     }</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     statBuffer.clear();</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   }</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>   <span class="comment">//end: extend input by padding</span></div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   <span class="keywordflow">for</span>(i=input.size()-dim/2;i<input.size();++i){</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     binValue=0;</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>       <span class="keywordflow">if</span>(input[i]==m_class[iclass]){</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     binValue=m_class[0];</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       }</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     }</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     <span class="keywordflow">if</span>(m_class.size())</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       statBuffer.push_back(binValue);</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       statBuffer.push_back(input[i]);</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span> </div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=dim/2;++t){</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       T theValue=input[i-t];</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     <span class="keywordflow">if</span>(theValue==m_class[iclass]){</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       binValue=m_class[0];</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     }</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       }</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       <span class="keywordflow">if</span>(m_class.size())</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>     statBuffer.push_back(binValue);</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     statBuffer.push_back(theValue);</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       <span class="keywordflow">if</span>(i+t<input.size())</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     theValue=input[i+t];</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     <span class="keywordflow">case</span>(replicate):</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       theValue=input.back();</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     <span class="keywordflow">case</span>(circular):</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>       theValue=input[t-1];</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     <span class="keywordflow">case</span>(zero):</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>       theValue=0;</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     <span class="keywordflow">case</span>(symmetric):</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>       theValue=input[i-t];</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     }</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>       }</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     <span class="keywordflow">if</span>(theValue==m_class[iclass]){</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>       binValue=m_class[0];</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>     }</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>       }</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>       <span class="keywordflow">if</span>(m_class.size())</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     statBuffer.push_back(binValue);</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     statBuffer.push_back(theValue);</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     }</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     <span class="keywordflow">switch</span>(getFilterType(method)){</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="keywordflow">case</span>(filter::nvalid):</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       output[i]=stat.nvalid(statBuffer);</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>     <span class="keywordflow">case</span>(filter::median):</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>       output[i]=stat.median(statBuffer);</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     <span class="keywordflow">case</span>(filter::min):</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     <span class="keywordflow">case</span>(filter::erode):</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>       output[i]=stat.mymin(statBuffer);</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>     <span class="keywordflow">case</span>(filter::max):</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     <span class="keywordflow">case</span>(filter::dilate):</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>       output[i]=stat.mymax(statBuffer);</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     <span class="keywordflow">case</span>(filter::sum):</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>       output[i]=sqrt(stat.sum(statBuffer));</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     <span class="keywordflow">case</span>(filter::var):</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>       output[i]=stat.var(statBuffer);</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     <span class="keywordflow">case</span>(filter::mean):</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       output[i]=stat.mean(statBuffer);</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     <span class="keywordflow">case</span>(filter::percentile):</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       assert(m_threshold.size());</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       output[i]=stat.percentile(statBuffer,statBuffer.begin(),statBuffer.end(),m_threshold[0]);</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       std::string errorString=<span class="stringliteral">"method not supported"</span>;</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>     }</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>   }</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>  }</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span> </div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::smooth(T* input, <span class="keywordtype">int</span> inputSize, std::vector<T>& output, <span class="keywordtype">short</span> dim)</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span> {</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>   assert(dim>0);</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>   m_taps.resize(dim);</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<dim;++itap)</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     m_taps[itap]=1.0/dim;</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>   filter(input,output);</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>  }</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span> </div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter::filter(T* input, <span class="keywordtype">int</span> inputSize, std::vector<T>& output)</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span> {</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>   assert(inputSize>=m_taps.size());</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>   output.resize(inputSize);</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>   <span class="keywordtype">int</span> i=0;</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span> </div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>   <span class="comment">//start: extend input by padding</span></div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>   <span class="keywordflow">for</span>(i=0;i<m_taps.size()/2;++i){</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     <span class="comment">//todo:introduce nodata</span></div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     output[i]=m_taps[m_taps.size()/2]*input[i];</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span> </div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=m_taps.size()/2;++t){</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[i+t];</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       <span class="keywordflow">if</span>(i>=t)</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     output[i]+=m_taps[m_taps.size()/2-t]*input[i-t];</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>     <span class="keywordflow">case</span>(replicate):</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[0];</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>     <span class="keywordflow">case</span>(circular):</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[input.size()+i-t];</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>     <span class="keywordflow">case</span>(zero):</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>       output[i]+=m_taps[m_taps.size()/2-t]*0;</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     <span class="keywordflow">case</span>(symmetric):</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[t-i];</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>     }</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       }</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>     }</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>   }</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>   <span class="comment">//main</span></div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>   <span class="keywordflow">for</span>(i=m_taps.size()/2;i<input.size()-m_taps.size()/2;++i){</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     <span class="comment">//todo:introduce nodata</span></div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>     T leaveOut=(*(m_taps.begin()))*input[i-m_taps.size()/2];</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     T include=(m_taps.back())*input[i+m_taps.size()/2];</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>     output[i]=0;</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=0;t<m_taps.size();++t)</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       output[i]+=input[i-m_taps.size()/2+t]*m_taps[t];</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>   }</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>   <span class="comment">//end: extend input by padding</span></div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>   <span class="keywordflow">for</span>(i=input.size()-m_taps.size()/2;i<input.size();++i){</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     <span class="comment">//todo:introduce nodata</span></div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     output[i]=m_taps[m_taps.size()/2]*input[i];</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     <span class="comment">//todo:introduce nodata</span></div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> t=1;t<=m_taps.size()/2;++t){</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       output[i]+=m_taps[m_taps.size()/2-t]*input[i-t];</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       <span class="keywordflow">if</span>(i+t<input.size())</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     output[i]+=m_taps[m_taps.size()/2+t]*input[i+t];</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     <span class="keywordflow">switch</span>(getPadding(m_padding)){</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>     <span class="keywordflow">case</span>(replicate):</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       output[i]+=m_taps[m_taps.size()/2+t]*input.back();</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     <span class="keywordflow">case</span>(circular):</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[t-1];</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     <span class="keywordflow">case</span>(zero):</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>       output[i]+=m_taps[m_taps.size()/2+t]*0;</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     <span class="keywordflow">case</span>(symmetric):</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       output[i]+=m_taps[m_taps.size()/2+t]*input[i-t];</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     }</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>       }</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     }</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>   }</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span> }</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span> </div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span> }</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span> </div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span> <span class="preprocessor">#endif </span><span class="comment">/* _MYFILTER_H_ */</span><span class="preprocessor"></span></div>
 <div class="ttc" id="classfilter_1_1Filter_html"><div class="ttname"><a href="classfilter_1_1Filter.html">filter::Filter</a></div><div class="ttdef"><b>Definition:</b> <a href="Filter_8h_source.html#l00040">Filter.h:40</a></div></div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Filter__old_8h_source.html b/doc/html/Filter__old_8h_source.html
index 53f6055..4a3130a 100644
--- a/doc/html/Filter__old_8h_source.html
+++ b/doc/html/Filter__old_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -958,15 +958,15 @@
 <div class="line"><a name="l00904"></a><span class="lineno">  904</span> }</div>
 <div class="line"><a name="l00905"></a><span class="lineno">  905</span> </div>
 <div class="line"><a name="l00906"></a><span class="lineno">  906</span> <span class="preprocessor">#endif </span><span class="comment">/* _MYFILTER_H_ */</span><span class="preprocessor"></span></div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfsann_8h_source.html b/doc/html/ImgGdal_8h_source.html
similarity index 63%
copy from doc/html/pkfsann_8h_source.html
copy to doc/html/ImgGdal_8h_source.html
index f9befaf..47441ed 100644
--- a/doc/html/pkfsann_8h_source.html
+++ b/doc/html/ImgGdal_8h_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/src/apps/pkfsann.h Source File</title>
+<title>pktools: /home/kempenep/pktools/src/imageclasses/ImgGdal.h Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,17 +44,17 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html">imageclasses</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">pkfsann.h</div>  </div>
+<div class="title">ImgGdal.h</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span> <span class="comment">/**********************************************************************</span></div>
-<div class="line"><a name="l00002"></a><span class="lineno">    2</span> <span class="comment">pkfsann.h: feature selection for ann classifier</span></div>
-<div class="line"><a name="l00003"></a><span class="lineno">    3</span> <span class="comment">Copyright (C) 2008-2014 Pieter Kempeneers</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno">    2</span> <span class="comment">ImgUpdaterGdal.h: class to read raster files using GDAL API library</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno">    3</span> <span class="comment">Copyright (C) 2008-2012 Pieter Kempeneers</span></div>
 <div class="line"><a name="l00004"></a><span class="lineno">    4</span> <span class="comment"></span></div>
 <div class="line"><a name="l00005"></a><span class="lineno">    5</span> <span class="comment">This file is part of pktools</span></div>
 <div class="line"><a name="l00006"></a><span class="lineno">    6</span> <span class="comment"></span></div>
@@ -71,41 +71,45 @@
 <div class="line"><a name="l00017"></a><span class="lineno">   17</span> <span class="comment">You should have received a copy of the GNU General Public License</span></div>
 <div class="line"><a name="l00018"></a><span class="lineno">   18</span> <span class="comment">along with pktools.  If not, see <http://www.gnu.org/licenses/>.</span></div>
 <div class="line"><a name="l00019"></a><span class="lineno">   19</span> <span class="comment">***********************************************************************/</span></div>
-<div class="line"><a name="l00020"></a><span class="lineno">   20</span> <span class="preprocessor">#include <string></span></div>
-<div class="line"><a name="l00021"></a><span class="lineno">   21</span> <span class="preprocessor">#include <vector></span></div>
-<div class="line"><a name="l00022"></a><span class="lineno">   22</span> <span class="preprocessor">#include "base/Vector2d.h"</span></div>
-<div class="line"><a name="l00023"></a><span class="lineno">   23</span> </div>
-<div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="preprocessor">#ifndef _PKFSANNH_H_</span></div>
-<div class="line"><a name="l00025"></a><span class="lineno">   25</span> <span class="preprocessor"></span><span class="preprocessor">#define _PKFSANNH_H_</span></div>
-<div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="preprocessor"></span></div>
-<div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="keyword">enum</span> SelectorValue  { NA=0, SFFS=1, SFS=2, SBS=3, BFS=4};</div>
-<div class="line"><a name="l00028"></a><span class="lineno">   28</span> </div>
-<div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="classCostFactoryANN.html">   29</a></span> <span class="keyword">class </span><a class="code" href="classCostFactoryANN.html">CostFactoryANN</a> : <span class="keyword">public</span> <a class="code" href="classCostFactory.html">CostFactory</a></div>
-<div class="line"><a name="l00030"></a><span class="lineno">   30</span> {</div>
-<div class="line"><a name="l00031"></a><span class="lineno">   31</span>  <span class="keyword">public</span>:</div>
-<div class="line"><a name="l00032"></a><span class="lineno">   32</span>   <a class="code" href="classCostFactoryANN.html">CostFactoryANN</a>();</div>
-<div class="line"><a name="l00033"></a><span class="lineno">   33</span>   <a class="code" href="classCostFactoryANN.html">CostFactoryANN</a>(<span class="keyword">const</span> std::vector<unsigned int>& nneuron, <span class="keywordtype">float</span> connection, <span class="keyword">const</span> std::vector<float> weights, <span class="keywordtype">float</span> learning, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxit, <span cla [...]
-<div class="line"><a name="l00034"></a><span class="lineno">   34</span>   ~<a class="code" href="classCostFactoryANN.html">CostFactoryANN</a>();</div>
-<div class="line"><a name="l00035"></a><span class="lineno">   35</span>   <span class="keywordtype">double</span> getCost(<span class="keyword">const</span> std::vector<<a class="code" href="classVector2d.html">Vector2d<float></a> > &trainingFeatures);</div>
-<div class="line"><a name="l00036"></a><span class="lineno">   36</span>   </div>
-<div class="line"><a name="l00037"></a><span class="lineno">   37</span>  <span class="keyword">private</span>:</div>
-<div class="line"><a name="l00038"></a><span class="lineno">   38</span>   std::vector<unsigned int> m_nneuron;</div>
-<div class="line"><a name="l00039"></a><span class="lineno">   39</span>   <span class="keywordtype">float</span> m_connection;</div>
-<div class="line"><a name="l00040"></a><span class="lineno">   40</span>   <span class="keyword">const</span> std::vector<float> m_weights;</div>
-<div class="line"><a name="l00041"></a><span class="lineno">   41</span>   <span class="keywordtype">float</span> m_learning;</div>
-<div class="line"><a name="l00042"></a><span class="lineno">   42</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_maxit;</div>
-<div class="line"><a name="l00043"></a><span class="lineno">   43</span> };</div>
-<div class="line"><a name="l00044"></a><span class="lineno">   44</span> </div>
-<div class="line"><a name="l00045"></a><span class="lineno">   45</span> </div>
-<div class="line"><a name="l00046"></a><span class="lineno">   46</span> <span class="preprocessor">#endif</span></div>
-<div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
-<div class="ttc" id="classCostFactoryANN_html"><div class="ttname"><a href="classCostFactoryANN.html">CostFactoryANN</a></div><div class="ttdef"><b>Definition:</b> <a href="pkfsann_8h_source.html#l00029">pkfsann.h:29</a></div></div>
-<div class="ttc" id="classCostFactory_html"><div class="ttname"><a href="classCostFactory.html">CostFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="CostFactory_8h_source.html#l00030">CostFactory.h:30</a></div></div>
+<div class="line"><a name="l00020"></a><span class="lineno">   20</span> <span class="preprocessor">#ifndef _IMGUPDATERGDAL_H_</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno">   21</span> <span class="preprocessor"></span><span class="preprocessor">#define _IMGUPDATERGDAL_H_</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno">   22</span> <span class="preprocessor"></span></div>
+<div class="line"><a name="l00023"></a><span class="lineno">   23</span> <span class="preprocessor">#include "ImgReaderGdal.h"</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="preprocessor">#include "ImgWriterGdal.h"</span></div>
+<div class="line"><a name="l00025"></a><span class="lineno">   25</span> </div>
+<div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="comment">//--------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="classImgUpdaterGdal.html">   27</a></span> <span class="keyword">class </span><a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a> : <span class="keyword">public</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>, <span class="keyword">public</span> <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a></div>
+<div class="line"><a name="l00028"></a><span class="lineno">   28</span> {</div>
+<div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00030"></a><span class="lineno">   30</span>   <a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00031"></a><span class="lineno">   31</span>   <a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>(<span class="keyword">const</span> std::string& filename){open(filename);};</div>
+<div class="line"><a name="l00032"></a><span class="lineno">   32</span>   ~<a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00033"></a><span class="lineno">   33</span>   <span class="keywordtype">void</span> open(<span class="keyword">const</span> std::string& filename);</div>
+<div class="line"><a name="l00034"></a><span class="lineno">   34</span>   <span class="keywordtype">void</span> close(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00035"></a><span class="lineno">   35</span> </div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a name="l00037"></a><span class="lineno">   37</span>   <span class="keywordtype">void</span> setCodec();<span class="comment">//double magicX, double magicY);</span></div>
+<div class="line"><a name="l00038"></a><span class="lineno">   38</span> </div>
+<div class="line"><a name="l00039"></a><span class="lineno">   39</span>   std::string m_filename;</div>
+<div class="line"><a name="l00040"></a><span class="lineno">   40</span>   GDALDataset *m_gds;</div>
+<div class="line"><a name="l00041"></a><span class="lineno">   41</span>   <span class="keywordtype">int</span> m_ncol;</div>
+<div class="line"><a name="l00042"></a><span class="lineno">   42</span>   <span class="keywordtype">int</span> m_nrow;</div>
+<div class="line"><a name="l00043"></a><span class="lineno">   43</span>   <span class="keywordtype">int</span> m_nband;</div>
+<div class="line"><a name="l00044"></a><span class="lineno">   44</span>   <span class="keywordtype">double</span> m_gt[6];</div>
+<div class="line"><a name="l00045"></a><span class="lineno">   45</span>   std::vector<double> m_noDataValues;</div>
+<div class="line"><a name="l00046"></a><span class="lineno">   46</span>   std::vector<double> m_scale;</div>
+<div class="line"><a name="l00047"></a><span class="lineno">   47</span>   std::vector<double> m_offset;</div>
+<div class="line"><a name="l00048"></a><span class="lineno">   48</span> };</div>
+<div class="line"><a name="l00049"></a><span class="lineno">   49</span> </div>
+<div class="line"><a name="l00050"></a><span class="lineno">   50</span> <span class="preprocessor">#endif // _IMGUPDATERGDAL_H_</span></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
+<div class="ttc" id="classImgUpdaterGdal_html"><div class="ttname"><a href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgGdal_8h_source.html#l00027">ImgGdal.h:27</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgRasterGdal_8cc_source.html b/doc/html/ImgRasterGdal_8cc_source.html
new file mode 100644
index 0000000..dee282b
--- /dev/null
+++ b/doc/html/ImgRasterGdal_8cc_source.html
@@ -0,0 +1,414 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: /home/kempenep/pktools/src/imageclasses/ImgRasterGdal.cc Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.6</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html">imageclasses</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">ImgRasterGdal.cc</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span> <span class="comment">/**********************************************************************</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno">    2</span> <span class="comment">ImgRasterGdal.cc: class to read raster files using GDAL API library</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno">    3</span> <span class="comment">Copyright (C) 2008-2012 Pieter Kempeneers</span></div>
+<div class="line"><a name="l00004"></a><span class="lineno">    4</span> <span class="comment"></span></div>
+<div class="line"><a name="l00005"></a><span class="lineno">    5</span> <span class="comment">This file is part of pktools</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno">    6</span> <span class="comment"></span></div>
+<div class="line"><a name="l00007"></a><span class="lineno">    7</span> <span class="comment">pktools is free software: you can redistribute it and/or modify</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno">    8</span> <span class="comment">it under the terms of the GNU General Public License as published by</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno">    9</span> <span class="comment">the Free Software Foundation, either version 3 of the License, or</span></div>
+<div class="line"><a name="l00010"></a><span class="lineno">   10</span> <span class="comment">(at your option) any later version.</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno">   11</span> <span class="comment"></span></div>
+<div class="line"><a name="l00012"></a><span class="lineno">   12</span> <span class="comment">pktools is distributed in the hope that it will be useful,</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno">   13</span> <span class="comment">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div>
+<div class="line"><a name="l00014"></a><span class="lineno">   14</span> <span class="comment">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno">   15</span> <span class="comment">GNU General Public License for more details.</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno">   16</span> <span class="comment"></span></div>
+<div class="line"><a name="l00017"></a><span class="lineno">   17</span> <span class="comment">You should have received a copy of the GNU General Public License</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno">   18</span> <span class="comment">along with pktools.  If not, see <http://www.gnu.org/licenses/>.</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno">   19</span> <span class="comment">***********************************************************************/</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno">   20</span> <span class="preprocessor">#include <iostream></span></div>
+<div class="line"><a name="l00021"></a><span class="lineno">   21</span> <span class="preprocessor">#include "ImgRasterGdal.h"</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno">   22</span> </div>
+<div class="line"><a name="l00023"></a><span class="lineno">   23</span> ImgRasterGdal::ImgRasterGdal(<span class="keywordtype">void</span>)</div>
+<div class="line"><a name="l00024"></a><span class="lineno">   24</span>   : m_gds(NULL), m_ncol(0), m_nrow(0), m_nband(0)</div>
+<div class="line"><a name="l00025"></a><span class="lineno">   25</span> {}</div>
+<div class="line"><a name="l00026"></a><span class="lineno">   26</span> </div>
+<div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="comment">//--------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="keywordtype">void</span> ImgRasterGdal::close(<span class="keywordtype">void</span>)</div>
+<div class="line"><a name="l00029"></a><span class="lineno">   29</span> {</div>
+<div class="line"><a name="l00030"></a><span class="lineno">   30</span>   GDALClose(m_gds);</div>
+<div class="line"><a name="l00031"></a><span class="lineno">   31</span> }</div>
+<div class="line"><a name="l00032"></a><span class="lineno">   32</span> </div>
+<div class="line"><a name="l00033"></a><span class="lineno">   33</span> std::string ImgRasterGdal::getProjection(<span class="keywordtype">void</span>)<span class="keyword"> const </span></div>
+<div class="line"><a name="l00034"></a><span class="lineno">   34</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00035"></a><span class="lineno">   35</span>   std::string theProjection=m_gds->GetProjectionRef();</div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span>   <span class="comment">// size_t startpos,endpos;</span></div>
+<div class="line"><a name="l00037"></a><span class="lineno">   37</span>   <span class="comment">// while((startpos=theProjection.find(",AUTHORITY"))!=std::string::npos){</span></div>
+<div class="line"><a name="l00038"></a><span class="lineno">   38</span>   <span class="comment">//   endpos=theProjection.find("]",startpos+1,1)+1;</span></div>
+<div class="line"><a name="l00039"></a><span class="lineno">   39</span>   <span class="comment">//   theProjection.erase(startpos,endpos-startpos);</span></div>
+<div class="line"><a name="l00040"></a><span class="lineno">   40</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00041"></a><span class="lineno">   41</span>   <span class="keywordflow">return</span> theProjection;</div>
+<div class="line"><a name="l00042"></a><span class="lineno">   42</span> }</div>
+<div class="line"><a name="l00043"></a><span class="lineno">   43</span> </div>
+<div class="line"><a name="l00044"></a><span class="lineno">   44</span> std::string ImgRasterGdal::getProjectionRef(<span class="keywordtype">void</span>)<span class="keyword"> const </span></div>
+<div class="line"><a name="l00045"></a><span class="lineno">   45</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00046"></a><span class="lineno">   46</span>   std::string theProjection;</div>
+<div class="line"><a name="l00047"></a><span class="lineno">   47</span>   <span class="keywordflow">if</span>(m_gds->GetProjectionRef())</div>
+<div class="line"><a name="l00048"></a><span class="lineno">   48</span>     <span class="keywordflow">return</span>(m_gds->GetProjectionRef());</div>
+<div class="line"><a name="l00049"></a><span class="lineno">   49</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00050"></a><span class="lineno">   50</span>     <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
+<div class="line"><a name="l00051"></a><span class="lineno">   51</span> }</div>
+<div class="line"><a name="l00052"></a><span class="lineno">   52</span> </div>
+<div class="line"><a name="l00053"></a><span class="lineno">   53</span> GDALDataType ImgRasterGdal::getDataType(<span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00054"></a><span class="lineno">   54</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00055"></a><span class="lineno">   55</span>   assert(band<m_nband+1);</div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>   <span class="keywordflow">return</span> (m_gds->GetRasterBand(band+1))->GetRasterDataType();</div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span> }</div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span> </div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span> GDALRasterBand* ImgRasterGdal::getRasterBand(<span class="keywordtype">int</span> band)</div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span> {</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   assert(band<m_nband+1);</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>   <span class="keywordflow">return</span> (m_gds->GetRasterBand(band+1));</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span> }</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span> </div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span> GDALColorTable* ImgRasterGdal::getColorTable(<span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>   assert(band<m_nband+1);</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   <span class="keywordflow">return</span> (m_gds->GetRasterBand(band+1))->GetColorTable();</div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span> }</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span> </div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span> std::string ImgRasterGdal::getDriverDescription()<span class="keyword"> const</span></div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <span class="keywordflow">return</span> m_gds->GetDriver()->GetDescription();</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span> }</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span> </div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="keywordtype">void</span> ImgRasterGdal::getGeoTransform(<span class="keywordtype">double</span>* gt)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   m_gds->GetGeoTransform(gt);</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span> }</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span> </div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span> <span class="comment">// void ImgRasterGdal::getGeoTransform(double& ulx, double& uly, double& deltaX, double& deltaY, double& rot1, double& rot2) const</span></div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span> <span class="comment">//   double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span> <span class="comment">//   m_gds->GetGeoTransform(adfGeoTransform);</span></div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span> <span class="comment">//   ulx=adfGeoTransform[0];</span></div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span> <span class="comment">//   deltaX=adfGeoTransform[1];</span></div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span> <span class="comment">//   rot1=adfGeoTransform[2];</span></div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span> <span class="comment">//   uly=adfGeoTransform[3];</span></div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span> <span class="comment">//   rot2=adfGeoTransform[4];</span></div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span> <span class="comment">//   deltaY=-adfGeoTransform[5];//convention of GDAL!</span></div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span> </div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span> std::string ImgRasterGdal::getGeoTransform()<span class="keyword"> const</span></div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   m_gds->GetGeoTransform(gt);</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   std::ostringstream s;</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   s << <span class="stringliteral">"["</span> << gt[0] << <span class="stringliteral">","</span> << gt[1] << <span class="stringliteral">","</span> << gt[2] << <span class="stringliteral">","</span> << gt[3] << <span class="stringliteral">","</span> << gt[4] << <span class="stringliteral">",& [...]
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <span class="keywordflow">return</span>(s.str());</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <span class="comment">// if(!isGeoRef())</span></div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <span class="comment">//   return("");</span></div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <span class="comment">// else{</span></div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <span class="comment">//   double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <span class="comment">//   m_gds->GetGeoTransform(adfGeoTransform);</span></div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <span class="comment">//   double ulx=adfGeoTransform[0];</span></div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <span class="comment">//   double deltaX=adfGeoTransform[1];</span></div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <span class="comment">//   double rot1=adfGeoTransform[2];</span></div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <span class="comment">//   double uly=adfGeoTransform[3];</span></div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <span class="comment">//   double rot2=adfGeoTransform[4];</span></div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <span class="comment">//   double deltaY=-adfGeoTransform[5];//convention of GDAL!</span></div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <span class="comment">//   std::ostringstream s;</span></div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <span class="comment">//   s << "[" << ulx << "," << deltaX << "," << rot1 << "," << uly << "," << rot2 << "," << -deltaY << "]";</span></div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <span class="comment">//   return(s.str());</span></div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span> }</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span> </div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span> <span class="keywordtype">char</span>** ImgRasterGdal::getMetadata()</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span> {</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <span class="keywordflow">if</span>(m_gds->GetMetadata()!=NULL)</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     <span class="keywordflow">return</span>(m_gds->GetMetadata());</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     <span class="keywordflow">return</span> (<span class="keywordtype">char</span>**)<span class="stringliteral">""</span>;</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span> }</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span> </div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span> <span class="keywordtype">char</span>** ImgRasterGdal::getMetadata()<span class="keyword"> const</span></div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <span class="keywordflow">if</span>(m_gds->GetMetadata()!=NULL)</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     <span class="keywordflow">return</span>(m_gds->GetMetadata());</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <span class="keywordflow">else</span> </div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     <span class="keywordflow">return</span> (<span class="keywordtype">char</span>**)<span class="stringliteral">""</span>;</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span> }</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span> </div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span> <span class="keywordtype">void</span> ImgRasterGdal::getMetadata(std::list<std::string>& metadata)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <span class="keywordtype">char</span>** cmetadata=m_gds->GetMetadata();</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <span class="keywordflow">while</span>(*cmetadata!=NULL){</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     metadata.push_back(*(cmetadata));</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     ++cmetadata;</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   }</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span> }</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span> </div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span> std::string ImgRasterGdal::getDescription()<span class="keyword"> const</span></div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <span class="keywordflow">if</span>(m_gds->GetDriver()->GetDescription()!=NULL)</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     <span class="keywordflow">return</span> m_gds->GetDriver()->GetDescription();</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span> }</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span> </div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span> std::string ImgRasterGdal::getMetadataItem()<span class="keyword"> const </span></div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <span class="keywordflow">if</span>(m_gds->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME )!=NULL)</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     <span class="keywordflow">return</span> m_gds->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME );</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span> }</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span> std::string ImgRasterGdal::getImageDescription()<span class="keyword"> const </span></div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <span class="keywordflow">if</span>(m_gds->GetDriver()->GetMetadataItem(<span class="stringliteral">"TIFFTAG_IMAGEDESCRIPTION"</span>)!=NULL)</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     <span class="keywordflow">return</span> m_gds->GetDriver()->GetMetadataItem(<span class="stringliteral">"TIFFTAG_IMAGEDESCRIPTION"</span>);</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span> }</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span> </div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span> std::string ImgRasterGdal::getInterleave()<span class="keyword"> const</span></div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <span class="keywordflow">if</span>(m_gds->GetMetadataItem( <span class="stringliteral">"INTERLEAVE"</span>, <span class="stringliteral">"IMAGE_STRUCTURE"</span>))</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     <span class="keywordflow">return</span> m_gds->GetMetadataItem( <span class="stringliteral">"INTERLEAVE"</span>, <span class="stringliteral">"IMAGE_STRUCTURE"</span>);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     <span class="keywordflow">return</span>(<span class="stringliteral">"BAND"</span>);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span> }</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span> </div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span> std::string ImgRasterGdal::getCompression()<span class="keyword"> const</span></div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   <span class="keywordflow">if</span>(m_gds->GetMetadataItem( <span class="stringliteral">"COMPRESSION"</span>, <span class="stringliteral">"IMAGE_STRUCTURE"</span>))</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     <span class="keywordflow">return</span> m_gds->GetMetadataItem( <span class="stringliteral">"COMPRESSION"</span>, <span class="stringliteral">"IMAGE_STRUCTURE"</span>);</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     <span class="keywordflow">return</span>(<span class="stringliteral">"NONE"</span>);</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span> }</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span> </div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span> <span class="keywordtype">bool</span> ImgRasterGdal::getBoundingBox(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   m_gds->GetGeoTransform(gt);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span> </div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   <span class="comment">//assuming</span></div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   ulx=gt[0];</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   uly=gt[3];</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   lrx=gt[0]+nrOfCol()*gt[1]+nrOfRow()*gt[2];</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   lry=gt[3]+nrOfCol()*gt[4]+nrOfRow()*gt[5];</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     <span class="comment">// ulx=m_ulx;</span></div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     <span class="comment">// uly=m_uly;</span></div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     <span class="comment">// lrx=ulx+nrOfCol()*m_delta_x;</span></div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     <span class="comment">// lry=uly-nrOfRow()*m_delta_y;</span></div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   }</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     <span class="comment">// ulx=0;</span></div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     <span class="comment">// uly=nrOfRow()-1;</span></div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     <span class="comment">// lrx=nrOfCol()-1;</span></div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     <span class="comment">// lry=0;</span></div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   }</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span> }</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span> </div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span> <span class="keywordtype">bool</span> ImgRasterGdal::getCenterPos(<span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   m_gds->GetGeoTransform(gt);</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span> </div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   <span class="comment">//assuming</span></div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   x=gt[0]+(nrOfCol()/2.0)*gt[1]+(nrOfRow()/2.0)*gt[2];</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   y=gt[3]+(nrOfCol()/2.0)*gt[4]+(nrOfRow()/2.0)*gt[5];</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="comment">// x=m_ulx+(nrOfCol()/2.0)*m_delta_x;</span></div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     <span class="comment">// y=m_uly-(nrOfRow()/2.0)*m_delta_y;</span></div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   }</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     <span class="comment">// x=nrOfCol()/2.0;</span></div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     <span class="comment">// y=nrOfRow()/2.0;</span></div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   }</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span> }</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span> </div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span> <span class="comment">//i and j represent fraction of pixels, return true if image is georeferenced</span></div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span> <span class="keywordtype">bool</span> ImgRasterGdal::geo2image(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y, <span class="keywordtype">double</span>& i, <span class="keywordtype">double</span>& j)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="comment">//double values are returned, caller is responsible for interpolation step</span></div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   m_gds->GetGeoTransform(gt);</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="comment">//assuming</span></div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span> </div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   <span class="keywordtype">double</span> denom=(gt[1]-gt[2]*gt[4]/gt[5]);</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   <span class="keywordtype">double</span> eps=0.00001;</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <span class="keywordflow">if</span>(fabs(denom)>eps){</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     i=(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom;</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     j=(y-gt[3]-gt[4]*(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom)/gt[5];</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   }</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     <span class="comment">// double ulx=m_ulx;</span></div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     <span class="comment">// double uly=m_uly;</span></div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     <span class="comment">// i=(x-ulx)/m_delta_x;</span></div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     <span class="comment">// j=(uly-y)/m_delta_y;</span></div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   }</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     <span class="comment">// i=x;</span></div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     <span class="comment">// j=nrOfRow()-y;</span></div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   }</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span> }</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span> </div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span> <span class="comment">//x and y represent center of pixel, return true if image is georeferenced</span></div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span> <span class="keywordtype">bool</span> ImgRasterGdal::image2geo(<span class="keywordtype">double</span> i, <span class="keywordtype">double</span> j, <span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   m_gds->GetGeoTransform(gt);</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span> </div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="comment">//assuming</span></div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span> </div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   x=gt[0]+(0.5+i)*gt[1]+(0.5+j)*gt[2];</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   y=gt[3]+(0.5+i)*gt[4]+(0.5+j)*gt[5];</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     <span class="comment">// x=m_ulx+(0.5+i)*m_delta_x;</span></div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     <span class="comment">// y=m_uly-(0.5+j)*m_delta_y;</span></div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   }</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     <span class="comment">// x=0.5+i;</span></div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     <span class="comment">// y=nrOfRow()-(0.5+j);</span></div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   }</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span> }</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span> </div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span> <span class="keywordtype">bool</span> ImgRasterGdal::covers(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span>  y)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordtype">double</span> theULX, theULY, theLRX, theLRY;</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   getBoundingBox(theULX,theULY,theLRX,theLRY);</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="keywordflow">return</span>((x > theULX)&&</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>          (x < theLRX)&&</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>          (y < theULY)&&</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>          (y >theLRY));</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span> }</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span> </div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span> <span class="keywordtype">bool</span> ImgRasterGdal::covers(<span class="keywordtype">double</span> ulx, <span class="keywordtype">double</span>  uly, <span class="keywordtype">double</span> lrx, <span class="keywordtype">double</span> lry)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="keywordtype">double</span> theULX, theULY, theLRX, theLRY;</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>   getBoundingBox(theULX,theULY,theLRX,theLRY);</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   <span class="keywordflow">return</span>((ulx < theLRX)&&(lrx > theULX)&&(lry < theULY)&&(uly > theLRY));</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span> }</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span> </div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span> <span class="keywordtype">int</span> ImgRasterGdal::getNoDataValues(std::vector<double>& noDataValues)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     noDataValues=m_noDataValues;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     <span class="keywordflow">return</span> m_noDataValues.size();</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   }</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span> }</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span> </div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span> <span class="keywordtype">int</span> ImgRasterGdal::pushNoDataValue(<span class="keywordtype">double</span> noDataValue)</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span> {</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>   <span class="keywordflow">if</span>(find(m_noDataValues.begin(),m_noDataValues.end(),noDataValue)==m_noDataValues.end())</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     m_noDataValues.push_back(noDataValue);</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   <span class="keywordflow">return</span>(m_noDataValues.size());</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span> }</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span> </div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span> <span class="comment">// bool ImgRasterGdal::setNoDataValue(double noDataValue,int band)</span></div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span> <span class="comment">//   GDALRasterBand  *poBand;</span></div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span> <span class="comment">//   poBand = m_gds->GetRasterBand(band+1);</span></div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span> <span class="comment">//   if(poBand->SetNoDataValue(noDataValue)!=CE_None)</span></div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span> <span class="comment">//     return false;</span></div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span> <span class="comment">//   else</span></div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span> <span class="comment">//     return true;</span></div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span> <span class="comment">// }</span></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/ImgRasterGdal_8h_source.html b/doc/html/ImgRasterGdal_8h_source.html
new file mode 100644
index 0000000..26c3f05
--- /dev/null
+++ b/doc/html/ImgRasterGdal_8h_source.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: /home/kempenep/pktools/src/imageclasses/ImgRasterGdal.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.6</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html">imageclasses</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">ImgRasterGdal.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span> <span class="comment">/**********************************************************************</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno">    2</span> <span class="comment">ImgRasterGdal.h: class to read raster files using GDAL API library</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno">    3</span> <span class="comment">Copyright (C) 2008-2012 Pieter Kempeneers</span></div>
+<div class="line"><a name="l00004"></a><span class="lineno">    4</span> <span class="comment"></span></div>
+<div class="line"><a name="l00005"></a><span class="lineno">    5</span> <span class="comment">This file is part of pktools</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno">    6</span> <span class="comment"></span></div>
+<div class="line"><a name="l00007"></a><span class="lineno">    7</span> <span class="comment">pktools is free software: you can redistribute it and/or modify</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno">    8</span> <span class="comment">it under the terms of the GNU General Public License as published by</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno">    9</span> <span class="comment">the Free Software Foundation, either version 3 of the License, or</span></div>
+<div class="line"><a name="l00010"></a><span class="lineno">   10</span> <span class="comment">(at your option) any later version.</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno">   11</span> <span class="comment"></span></div>
+<div class="line"><a name="l00012"></a><span class="lineno">   12</span> <span class="comment">pktools is distributed in the hope that it will be useful,</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno">   13</span> <span class="comment">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div>
+<div class="line"><a name="l00014"></a><span class="lineno">   14</span> <span class="comment">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno">   15</span> <span class="comment">GNU General Public License for more details.</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno">   16</span> <span class="comment"></span></div>
+<div class="line"><a name="l00017"></a><span class="lineno">   17</span> <span class="comment">You should have received a copy of the GNU General Public License</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno">   18</span> <span class="comment">along with pktools.  If not, see <http://www.gnu.org/licenses/>.</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno">   19</span> <span class="comment">***********************************************************************/</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno">   20</span> <span class="preprocessor">#ifndef _IMGRASTERGDAL_H_</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno">   21</span> <span class="preprocessor"></span><span class="preprocessor">#define _IMGRASTERGDAL_H_</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno">   22</span> <span class="preprocessor"></span></div>
+<div class="line"><a name="l00023"></a><span class="lineno">   23</span> <span class="preprocessor">#include <fstream></span></div>
+<div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="preprocessor">#include <sstream></span></div>
+<div class="line"><a name="l00025"></a><span class="lineno">   25</span> <span class="preprocessor">#include <string></span></div>
+<div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="preprocessor">#include <vector></span></div>
+<div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="preprocessor">#include <list></span></div>
+<div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="preprocessor">#include <algorithm></span></div>
+<div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="preprocessor">#include <assert.h></span></div>
+<div class="line"><a name="l00030"></a><span class="lineno">   30</span> <span class="preprocessor">#include "gdal_priv.h"</span></div>
+<div class="line"><a name="l00031"></a><span class="lineno">   31</span> </div>
+<div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="keyword">enum</span> RESAMPLE { NEAR = 0, BILINEAR = 1, BICUBIC = 2 };</div>
+<div class="line"><a name="l00033"></a><span class="lineno">   33</span> </div>
+<div class="line"><a name="l00034"></a><span class="lineno">   34</span> <span class="comment">//--------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classImgRasterGdal.html">   35</a></span> <span class="keyword">class </span><a class="code" href="classImgRasterGdal.html">ImgRasterGdal</a></div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span> {</div>
+<div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00038"></a><span class="lineno">   38</span>   <a class="code" href="classImgRasterGdal.html">ImgRasterGdal</a>(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00039"></a><span class="lineno">   39</span>   <span class="keyword">virtual</span> ~<a class="code" href="classImgRasterGdal.html">ImgRasterGdal</a>(<span class="keywordtype">void</span>){};</div>
+<div class="line"><a name="l00040"></a><span class="lineno">   40</span> </div>
+<div class="line"><a name="l00041"></a><span class="lineno">   41</span>   <span class="keyword">virtual</span> <span class="keywordtype">void</span> close(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00042"></a><span class="lineno">   42</span>   std::string getFileName()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_filename;};</div>
+<div class="line"><a name="l00043"></a><span class="lineno">   43</span>   <span class="keywordtype">int</span> nrOfCol(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_ncol;};</div>
+<div class="line"><a name="l00044"></a><span class="lineno">   44</span>   <span class="keywordtype">int</span> nrOfRow(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_nrow;};</div>
+<div class="line"><a name="l00045"></a><span class="lineno">   45</span>   <span class="keywordtype">int</span> nrOfBand(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_nband;};</div>
+<div class="line"><a name="l00046"></a><span class="lineno">   46</span>   <span class="keywordtype">bool</span> isGeoRef()<span class="keyword"> const </span>{<span class="keywordtype">double</span> gt[6];getGeoTransform(gt);<span class="keywordflow">if</span>(gt[5]<0) <span class="keywordflow">return</span> <span class="keyword">true</span>;<span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;};</div>
+<div class="line"><a name="l00047"></a><span class="lineno">   47</span>   std::string getProjection(<span class="keywordtype">void</span>) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00048"></a><span class="lineno">   48</span>   std::string getProjectionRef(<span class="keywordtype">void</span>) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00049"></a><span class="lineno">   49</span>   std::string getGeoTransform() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00050"></a><span class="lineno">   50</span>   <span class="keywordtype">void</span> getGeoTransform(<span class="keywordtype">double</span>* gt) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00051"></a><span class="lineno">   51</span>   <span class="keywordtype">bool</span> getBoundingBox (<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00052"></a><span class="lineno">   52</span>   <span class="keywordtype">bool</span> getCenterPos(<span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00053"></a><span class="lineno">   53</span>   <span class="keywordtype">double</span> getUlx()<span class="keyword"> const </span>{<span class="keywordtype">double</span> ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);<span class="keywordflow">return</span>(ulx);};</div>
+<div class="line"><a name="l00054"></a><span class="lineno">   54</span>   <span class="keywordtype">double</span> getUly()<span class="keyword"> const </span>{<span class="keywordtype">double</span> ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);<span class="keywordflow">return</span>(uly);};</div>
+<div class="line"><a name="l00055"></a><span class="lineno">   55</span>   <span class="keywordtype">double</span> getLrx()<span class="keyword"> const </span>{<span class="keywordtype">double</span> ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);<span class="keywordflow">return</span>(lrx);};</div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>   <span class="keywordtype">double</span> getLry()<span class="keyword"> const </span>{<span class="keywordtype">double</span> ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);<span class="keywordflow">return</span>(lry);};</div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span> </div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>   <span class="keywordtype">int</span> getNoDataValues(std::vector<double>& noDataValues) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>   <span class="keywordtype">bool</span> isNoData(<span class="keywordtype">double</span> value)<span class="keyword"> const</span>{<span class="keywordflow">if</span>(m_noDataValues.empty()) <span class="keywordflow">return</span> <span class="keyword">false</span>;<span class="keywordflow">else</span> <span class="keywordflow">return</span> find(m_noDataValues.begin(),m_noDataValues.end(),value)!=m_noDataValue [...]
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span>   <span class="keywordtype">int</span> pushNoDataValue(<span class="keywordtype">double</span> noDataValue);</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="keywordtype">int</span> setNoData(<span class="keyword">const</span> std::vector<double> nodata){m_noDataValues=nodata; <span class="keywordflow">return</span>(m_noDataValues.size());};</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>   CPLErr GDALSetNoDataValue(<span class="keywordtype">double</span> noDataValue, <span class="keywordtype">int</span> band=0) {<span class="keywordflow">return</span> getRasterBand(band)->SetNoDataValue(noDataValue);};</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>   <span class="keywordtype">bool</span> covers(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>   <span class="keywordtype">bool</span> covers(<span class="keywordtype">double</span> ulx, <span class="keywordtype">double</span>  uly, <span class="keywordtype">double</span> lrx, <span class="keywordtype">double</span> lry) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>   <span class="keywordtype">bool</span> geo2image(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y, <span class="keywordtype">double</span>& i, <span class="keywordtype">double</span>& j) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>   <span class="keywordtype">bool</span> image2geo(<span class="keywordtype">double</span> i, <span class="keywordtype">double</span> j, <span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>   <span class="keywordtype">double</span> getDeltaX(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordtype">double</span> gt[6];getGeoTransform(gt);<span class="keywordflow">return</span> gt[1];};</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   <span class="keywordtype">double</span> getDeltaY(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordtype">double</span> gt[6];getGeoTransform(gt);<span class="keywordflow">return</span> -gt[5];};</div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span> </div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   GDALDataType getDataType(<span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   GDALRasterBand* getRasterBand(<span class="keywordtype">int</span> band=0);</div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>   GDALColorTable* getColorTable(<span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   std::string getDriverDescription() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   std::string getImageType()<span class="keyword"> const</span>{<span class="keywordflow">return</span> getDriverDescription();};</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span> <span class="comment">//   std::string getImageType() const{return "GTiff";};</span></div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   std::string getInterleave() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   std::string getCompression() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   GDALDataset* getDataset(){<span class="keywordflow">return</span> m_gds;};</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <span class="keywordtype">char</span>** getMetadata();</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <span class="keywordtype">char</span>** getMetadata() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <span class="keywordtype">void</span> getMetadata(std::list<std::string>& metadata) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span> </div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   std::string getDescription() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   std::string getMetadataItem() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   std::string getImageDescription() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span> </div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>;</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>;</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span> </div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   std::string m_filename;</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   GDALDataset *m_gds;</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <span class="keywordtype">int</span> m_ncol;</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <span class="keywordtype">int</span> m_nrow;</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <span class="keywordtype">int</span> m_nband;</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <span class="keywordtype">double</span> m_gt[6];</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   std::vector<double> m_noDataValues;</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span> };</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span> </div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span> <span class="preprocessor">#endif // _IMGRASTERGDAL_H_</span></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
+<div class="ttc" id="classImgRasterGdal_html"><div class="ttname"><a href="classImgRasterGdal.html">ImgRasterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgRasterGdal_8h_source.html#l00035">ImgRasterGdal.h:35</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/ImgReaderGdal_8cc_source.html b/doc/html/ImgReaderGdal_8cc_source.html
index f56b603..cccab6b 100644
--- a/doc/html/ImgReaderGdal_8cc_source.html
+++ b/doc/html/ImgReaderGdal_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,699 +77,381 @@
 <div class="line"><a name="l00023"></a><span class="lineno">   23</span> <span class="preprocessor">#include <iostream></span></div>
 <div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="preprocessor">#include <gsl/gsl_cdf.h></span></div>
 <div class="line"><a name="l00025"></a><span class="lineno">   25</span> </div>
-<div class="line"><a name="l00026"></a><span class="lineno">   26</span> ImgReaderGdal::ImgReaderGdal(<span class="keywordtype">void</span>)</div>
-<div class="line"><a name="l00027"></a><span class="lineno">   27</span>   : m_gds(NULL), m_ncol(0), m_nrow(0), m_nband(0)</div>
-<div class="line"><a name="l00028"></a><span class="lineno">   28</span> {}</div>
-<div class="line"><a name="l00029"></a><span class="lineno">   29</span> </div>
-<div class="line"><a name="l00030"></a><span class="lineno">   30</span> <span class="keywordtype">void</span> ImgReaderGdal::open(<span class="keyword">const</span> std::string& filename)<span class="comment">//, double magicX, double magicY)</span></div>
-<div class="line"><a name="l00031"></a><span class="lineno">   31</span> {</div>
-<div class="line"><a name="l00032"></a><span class="lineno">   32</span>   m_filename = filename;</div>
-<div class="line"><a name="l00033"></a><span class="lineno">   33</span>   setCodec();<span class="comment">//magicX,magicY);</span></div>
-<div class="line"><a name="l00034"></a><span class="lineno">   34</span> }</div>
-<div class="line"><a name="l00035"></a><span class="lineno">   35</span> </div>
-<div class="line"><a name="l00036"></a><span class="lineno">   36</span> ImgReaderGdal::~ImgReaderGdal(<span class="keywordtype">void</span>)</div>
+<div class="line"><a name="l00026"></a><span class="lineno">   26</span> ImgReaderGdal::ImgReaderGdal(<span class="keywordtype">void</span>){};</div>
+<div class="line"><a name="l00027"></a><span class="lineno">   27</span> </div>
+<div class="line"><a name="l00028"></a><span class="lineno">   28</span> ImgReaderGdal::~ImgReaderGdal(<span class="keywordtype">void</span>)</div>
+<div class="line"><a name="l00029"></a><span class="lineno">   29</span> {</div>
+<div class="line"><a name="l00030"></a><span class="lineno">   30</span>   <span class="comment">// delete m_gds;</span></div>
+<div class="line"><a name="l00031"></a><span class="lineno">   31</span> <span class="comment">//   GDALDumpOpenDatasets(stderr);</span></div>
+<div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="comment">//   GDALDestroyDriverManager();//could be used by other objects...</span></div>
+<div class="line"><a name="l00033"></a><span class="lineno">   33</span> }</div>
+<div class="line"><a name="l00034"></a><span class="lineno">   34</span> </div>
+<div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="comment">//--------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keywordtype">void</span> ImgReaderGdal::open(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> GDALAccess& readMode)</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> {</div>
-<div class="line"><a name="l00038"></a><span class="lineno">   38</span>   <span class="comment">// delete m_gds;</span></div>
-<div class="line"><a name="l00039"></a><span class="lineno">   39</span> <span class="comment">//   GDALDumpOpenDatasets(stderr);</span></div>
-<div class="line"><a name="l00040"></a><span class="lineno">   40</span> <span class="comment">//   GDALDestroyDriverManager();//could be used by other objects...</span></div>
-<div class="line"><a name="l00041"></a><span class="lineno">   41</span> }</div>
-<div class="line"><a name="l00042"></a><span class="lineno">   42</span> </div>
-<div class="line"><a name="l00043"></a><span class="lineno">   43</span> <span class="comment">//--------------------------------------------------------------------------</span></div>
-<div class="line"><a name="l00044"></a><span class="lineno">   44</span> <span class="keywordtype">void</span> ImgReaderGdal::close(<span class="keywordtype">void</span>)</div>
-<div class="line"><a name="l00045"></a><span class="lineno">   45</span> {</div>
-<div class="line"><a name="l00046"></a><span class="lineno">   46</span>   GDALClose(m_gds);</div>
-<div class="line"><a name="l00047"></a><span class="lineno">   47</span> }</div>
-<div class="line"><a name="l00048"></a><span class="lineno">   48</span> </div>
-<div class="line"><a name="l00049"></a><span class="lineno">   49</span> <span class="keywordtype">void</span> ImgReaderGdal::setCodec()<span class="comment">//double magicX, double magicY)</span></div>
-<div class="line"><a name="l00050"></a><span class="lineno">   50</span> {</div>
-<div class="line"><a name="l00051"></a><span class="lineno">   51</span>   GDALAllRegister();</div>
-<div class="line"><a name="l00052"></a><span class="lineno">   52</span>   m_gds = (GDALDataset *) GDALOpen(m_filename.c_str(), GA_ReadOnly );</div>
-<div class="line"><a name="l00053"></a><span class="lineno">   53</span>   <span class="keywordflow">if</span>(m_gds == NULL){</div>
-<div class="line"><a name="l00054"></a><span class="lineno">   54</span>     std::string errorString=<span class="stringliteral">"FileOpenError"</span>;</div>
-<div class="line"><a name="l00055"></a><span class="lineno">   55</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00056"></a><span class="lineno">   56</span>   }</div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>   m_ncol= m_gds->GetRasterXSize();</div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>   m_nrow= m_gds->GetRasterYSize();</div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>   m_nband= m_gds->GetRasterCount();</div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span>   <span class="comment">// m_isGeoRef=( static_cast<std::string>(m_gds->GetProjectionRef())  != "" );</span></div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="comment">// m_magic_x=magicX;</span></div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>   <span class="comment">// m_magic_y=magicY;</span></div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>   <span class="keywordtype">double</span> adfGeoTransform[6];</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>   m_gds->GetGeoTransform( adfGeoTransform );</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>   <span class="comment">// if( m_gds->GetGeoTransform( adfGeoTransform ) == CE_None ){</span></div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>   m_gt[0]=adfGeoTransform[0];</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>   m_gt[1]=adfGeoTransform[1];</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   m_gt[2]=adfGeoTransform[2];</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   m_gt[3]=adfGeoTransform[3];</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   m_gt[4]=adfGeoTransform[4];</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   m_gt[5]=adfGeoTransform[5];</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <span class="comment">// else{</span></div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <span class="comment">//   m_gt[0]=0;</span></div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   <span class="comment">//   m_gt[1]=1;</span></div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   <span class="comment">//   m_gt[2]=0;</span></div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <span class="comment">//   m_gt[3]=0;</span></div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <span class="comment">//   m_gt[4]=0;</span></div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <span class="comment">//   m_gt[5]=1;</span></div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span> }</div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span> </div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span> std::string ImgReaderGdal::getProjection(<span class="keywordtype">void</span>)<span class="keyword"> const </span></div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   std::string theProjection=m_gds->GetProjectionRef();</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <span class="comment">// size_t startpos,endpos;</span></div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <span class="comment">// while((startpos=theProjection.find(",AUTHORITY"))!=std::string::npos){</span></div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <span class="comment">//   endpos=theProjection.find("]",startpos+1,1)+1;</span></div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <span class="comment">//   theProjection.erase(startpos,endpos-startpos);</span></div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <span class="keywordflow">return</span> theProjection;</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span> }</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span> </div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span> std::string ImgReaderGdal::getProjectionRef(<span class="keywordtype">void</span>)<span class="keyword"> const </span></div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   std::string theProjection;</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <span class="keywordflow">if</span>(m_gds->GetProjectionRef())</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>     <span class="keywordflow">return</span>(m_gds->GetProjectionRef());</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>     <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span> }</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span> </div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span> GDALDataType ImgReaderGdal::getDataType(<span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   assert(band<m_nband+1);</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <span class="keywordflow">return</span> (m_gds->GetRasterBand(band+1))->GetRasterDataType();</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span> }</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span> </div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span> GDALRasterBand* ImgReaderGdal::getRasterBand(<span class="keywordtype">int</span> band)</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span> {</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   assert(band<m_nband+1);</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <span class="keywordflow">return</span> (m_gds->GetRasterBand(band+1));</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span> }</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span> </div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span> GDALColorTable* ImgReaderGdal::getColorTable(<span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   assert(band<m_nband+1);</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <span class="keywordflow">return</span> (m_gds->GetRasterBand(band+1))->GetColorTable();</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span> }</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span> </div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span> std::string ImgReaderGdal::getDriverDescription()<span class="keyword"> const</span></div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <span class="keywordflow">return</span> m_gds->GetDriver()->GetDescription();</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span> }</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span> </div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span> <span class="keywordtype">void</span> ImgReaderGdal::getGeoTransform(<span class="keywordtype">double</span>* gt)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span> }</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span> </div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span> <span class="comment">// void ImgReaderGdal::getGeoTransform(double& ulx, double& uly, double& deltaX, double& deltaY, double& rot1, double& rot2) const</span></div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span> <span class="comment">//   double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span> <span class="comment">//   m_gds->GetGeoTransform(adfGeoTransform);</span></div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span> <span class="comment">//   ulx=adfGeoTransform[0];</span></div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span> <span class="comment">//   deltaX=adfGeoTransform[1];</span></div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span> <span class="comment">//   rot1=adfGeoTransform[2];</span></div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span> <span class="comment">//   uly=adfGeoTransform[3];</span></div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span> <span class="comment">//   rot2=adfGeoTransform[4];</span></div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span> <span class="comment">//   deltaY=-adfGeoTransform[5];//convention of GDAL!</span></div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l00038"></a><span class="lineno">   38</span>   m_filename = filename;</div>
+<div class="line"><a name="l00039"></a><span class="lineno">   39</span>   setCodec(readMode);</div>
+<div class="line"><a name="l00040"></a><span class="lineno">   40</span> }</div>
+<div class="line"><a name="l00041"></a><span class="lineno">   41</span> </div>
+<div class="line"><a name="l00042"></a><span class="lineno">   42</span> <span class="keywordtype">void</span> ImgReaderGdal::close(<span class="keywordtype">void</span>)</div>
+<div class="line"><a name="l00043"></a><span class="lineno">   43</span> {</div>
+<div class="line"><a name="l00044"></a><span class="lineno">   44</span>   ImgRasterGdal::close();</div>
+<div class="line"><a name="l00045"></a><span class="lineno">   45</span> }</div>
+<div class="line"><a name="l00046"></a><span class="lineno">   46</span> </div>
+<div class="line"><a name="l00047"></a><span class="lineno">   47</span> <span class="keywordtype">void</span> ImgReaderGdal::setCodec(<span class="keyword">const</span> GDALAccess& readMode)</div>
+<div class="line"><a name="l00048"></a><span class="lineno">   48</span> {</div>
+<div class="line"><a name="l00049"></a><span class="lineno">   49</span>   GDALAllRegister();</div>
+<div class="line"><a name="l00050"></a><span class="lineno">   50</span>   m_gds = (GDALDataset *) GDALOpen(m_filename.c_str(), readMode );</div>
+<div class="line"><a name="l00051"></a><span class="lineno">   51</span>   <span class="keywordflow">if</span>(m_gds == NULL){</div>
+<div class="line"><a name="l00052"></a><span class="lineno">   52</span>     std::string errorString=<span class="stringliteral">"FileOpenError"</span>;</div>
+<div class="line"><a name="l00053"></a><span class="lineno">   53</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00054"></a><span class="lineno">   54</span>   }</div>
+<div class="line"><a name="l00055"></a><span class="lineno">   55</span>   m_ncol= m_gds->GetRasterXSize();</div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>   m_nrow= m_gds->GetRasterYSize();</div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span>   m_nband= m_gds->GetRasterCount();</div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>   <span class="comment">// m_isGeoRef=( static_cast<std::string>(m_gds->GetProjectionRef())  != "" );</span></div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>   <span class="comment">// m_magic_x=magicX;</span></div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span>   <span class="comment">// m_magic_y=magicY;</span></div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="keywordtype">double</span> adfGeoTransform[6];</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>   m_gds->GetGeoTransform( adfGeoTransform );</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>   <span class="comment">// if( m_gds->GetGeoTransform( adfGeoTransform ) == CE_None ){</span></div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>   m_gt[0]=adfGeoTransform[0];</div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>   m_gt[1]=adfGeoTransform[1];</div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>   m_gt[2]=adfGeoTransform[2];</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>   m_gt[3]=adfGeoTransform[3];</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   m_gt[4]=adfGeoTransform[4];</div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   m_gt[5]=adfGeoTransform[5];</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   <span class="comment">// else{</span></div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>   <span class="comment">//   m_gt[0]=0;</span></div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <span class="comment">//   m_gt[1]=1;</span></div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <span class="comment">//   m_gt[2]=0;</span></div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   <span class="comment">//   m_gt[3]=0;</span></div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   <span class="comment">//   m_gt[4]=0;</span></div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <span class="comment">//   m_gt[5]=1;</span></div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span> }</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span> </div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span> </div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span> <span class="keywordtype">double</span> ImgReaderGdal::getMin(<span class="keywordtype">int</span>& x, <span class="keywordtype">int</span>& y, <span class="keywordtype">int</span> band)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <span class="keywordtype">double</span> minValue=0;</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   std::vector<double> lineBuffer(nrOfCol());</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>     readData(lineBuffer,GDT_Float64,irow,band);</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>       <span class="keywordflow">if</span>(isNoData(lineBuffer[icol]))</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>       <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>     <span class="keywordflow">if</span>(lineBuffer[icol]<minValue){</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>           y=irow;</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>           x=icol;</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>           minValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>         }</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>       }</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>     y=irow;</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>     x=icol;</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>     minValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>       }</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     }</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   }</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>     <span class="keywordflow">return</span> minValue;</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>     <span class="keywordflow">throw</span>(static_cast<std::string>(<span class="stringliteral">"Warning: not initialized"</span>));</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span> }</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span> </div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span> <span class="keywordtype">double</span> ImgReaderGdal::getMax(<span class="keywordtype">int</span>& x, <span class="keywordtype">int</span>& y, <span class="keywordtype">int</span> band)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <span class="keywordtype">double</span> maxValue=0;</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   std::vector<double> lineBuffer(nrOfCol());</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     readData(lineBuffer,GDT_Float64,irow,band);</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>       <span class="keywordflow">if</span>(isNoData(lineBuffer[icol]))</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>       <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     <span class="keywordflow">if</span>(lineBuffer[icol]>maxValue){</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>           y=irow;</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>           x=icol;</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>           maxValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>         }</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>       }</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     y=irow;</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     x=icol;</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     maxValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>       }</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     }</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   }</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     <span class="keywordflow">return</span> maxValue;</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     <span class="keywordflow">throw</span>(static_cast<std::string>(<span class="stringliteral">"Warning: not initialized"</span>));</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span> }</div>
 <div class="line"><a name="l00141"></a><span class="lineno">  141</span> </div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span> std::string ImgReaderGdal::getGeoTransform()<span class="keyword"> const</span></div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span> <span class="keywordtype">void</span> ImgReaderGdal::getMinMax(<span class="keywordtype">int</span> startCol, <span class="keywordtype">int</span> endCol, <span class="keywordtype">int</span> startRow, <span class="keywordtype">int</span> endRow, <span class="keywordtype">int</span> band, <span class="keywordtype">double</span>& minValue, <span class="keywordtype">double</span>& maxValue)<span class="ke [...]
 <div class="line"><a name="l00143"></a><span class="lineno">  143</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   std::ostringstream s;</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   s << <span class="stringliteral">"["</span> << gt[0] << <span class="stringliteral">","</span> << gt[1] << <span class="stringliteral">","</span> << gt[2] << <span class="stringliteral">","</span> << gt[3] << <span class="stringliteral">","</span> << gt[4] << <span class="stringliteral">",& [...]
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <span class="keywordflow">return</span>(s.str());</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <span class="comment">// if(!isGeoRef())</span></div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <span class="comment">//   return("");</span></div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <span class="comment">// else{</span></div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   <span class="comment">//   double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <span class="comment">//   m_gds->GetGeoTransform(adfGeoTransform);</span></div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <span class="comment">//   double ulx=adfGeoTransform[0];</span></div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <span class="comment">//   double deltaX=adfGeoTransform[1];</span></div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="comment">//   double rot1=adfGeoTransform[2];</span></div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <span class="comment">//   double uly=adfGeoTransform[3];</span></div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <span class="comment">//   double rot2=adfGeoTransform[4];</span></div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <span class="comment">//   double deltaY=-adfGeoTransform[5];//convention of GDAL!</span></div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="comment">//   std::ostringstream s;</span></div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <span class="comment">//   s << "[" << ulx << "," << deltaX << "," << rot1 << "," << uly << "," << rot2 << "," << -deltaY << "]";</span></div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <span class="comment">//   return(s.str());</span></div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span> }</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span> </div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span> <span class="keywordtype">char</span>** ImgReaderGdal::getMetadata()</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span> {</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <span class="keywordflow">if</span>(m_gds->GetMetadata()!=NULL)</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     <span class="keywordflow">return</span>(m_gds->GetMetadata());</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     <span class="keywordflow">return</span> (<span class="keywordtype">char</span>**)<span class="stringliteral">""</span>;</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span> }</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span> </div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span> <span class="keywordtype">char</span>** ImgReaderGdal::getMetadata()<span class="keyword"> const</span></div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <span class="keywordflow">if</span>(m_gds->GetMetadata()!=NULL)</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     <span class="keywordflow">return</span>(m_gds->GetMetadata());</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keywordflow">else</span> </div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     <span class="keywordflow">return</span> (<span class="keywordtype">char</span>**)<span class="stringliteral">""</span>;</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span> }</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span> </div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span> <span class="keywordtype">void</span> ImgReaderGdal::getMetadata(std::list<std::string>& metadata)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   <span class="keywordtype">char</span>** cmetadata=m_gds->GetMetadata();</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   <span class="keywordflow">while</span>(*cmetadata!=NULL){</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     metadata.push_back(*(cmetadata));</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     ++cmetadata;</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   }</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span> }</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span> </div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span> std::string ImgReaderGdal::getDescription()<span class="keyword"> const</span></div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <span class="keywordflow">if</span>(m_gds->GetDriver()->GetDescription()!=NULL)</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     <span class="keywordflow">return</span> m_gds->GetDriver()->GetDescription();</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span> }</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span> </div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span> std::string ImgReaderGdal::getMetadataItem()<span class="keyword"> const </span></div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keywordflow">if</span>(m_gds->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME )!=NULL)</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     <span class="keywordflow">return</span> m_gds->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME );</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span> }</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span> std::string ImgReaderGdal::getImageDescription()<span class="keyword"> const </span></div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   <span class="keywordflow">if</span>(m_gds->GetDriver()->GetMetadataItem(<span class="stringliteral">"TIFFTAG_IMAGEDESCRIPTION"</span>)!=NULL)</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="keywordflow">return</span> m_gds->GetDriver()->GetMetadataItem(<span class="stringliteral">"TIFFTAG_IMAGEDESCRIPTION"</span>);</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span> }</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span> </div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span> std::string ImgReaderGdal::getInterleave()<span class="keyword"> const</span></div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   <span class="keywordflow">if</span>(m_gds->GetMetadataItem( <span class="stringliteral">"INTERLEAVE"</span>, <span class="stringliteral">"IMAGE_STRUCTURE"</span>))</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     <span class="keywordflow">return</span> m_gds->GetMetadataItem( <span class="stringliteral">"INTERLEAVE"</span>, <span class="stringliteral">"IMAGE_STRUCTURE"</span>);</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     <span class="keywordflow">return</span>(<span class="stringliteral">"BAND"</span>);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span> }</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span> </div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span> std::string ImgReaderGdal::getCompression()<span class="keyword"> const</span></div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   <span class="keywordflow">if</span>(m_gds->GetMetadataItem( <span class="stringliteral">"COMPRESSION"</span>, <span class="stringliteral">"IMAGE_STRUCTURE"</span>))</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     <span class="keywordflow">return</span> m_gds->GetMetadataItem( <span class="stringliteral">"COMPRESSION"</span>, <span class="stringliteral">"IMAGE_STRUCTURE"</span>);</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="keywordflow">return</span>(<span class="stringliteral">"NONE"</span>);</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span> }</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span> </div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span> <span class="keywordtype">bool</span> ImgReaderGdal::getBoundingBox(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span> </div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="comment">//assuming</span></div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   ulx=gt[0];</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   uly=gt[3];</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   lrx=gt[0]+nrOfCol()*gt[1]+nrOfRow()*gt[2];</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   lry=gt[3]+nrOfCol()*gt[4]+nrOfRow()*gt[5];</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     <span class="comment">// ulx=m_ulx;</span></div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     <span class="comment">// uly=m_uly;</span></div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="comment">// lrx=ulx+nrOfCol()*m_delta_x;</span></div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     <span class="comment">// lry=uly-nrOfRow()*m_delta_y;</span></div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   }</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     <span class="comment">// ulx=0;</span></div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     <span class="comment">// uly=nrOfRow()-1;</span></div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     <span class="comment">// lrx=nrOfCol()-1;</span></div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     <span class="comment">// lry=0;</span></div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <span class="keywordtype">bool</span> isConstraint=(maxValue>minValue);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <span class="keywordtype">double</span> minConstraint=minValue;</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <span class="keywordtype">double</span> maxConstraint=maxValue;</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   std::vector<double> lineBuffer(endCol-startCol+1);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   assert(endRow<nrOfRow());</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=startCol;irow<endRow+1;++irow){</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     readData(lineBuffer,GDT_Float64,startCol,endCol,irow,band);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<lineBuffer.size();++icol){</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>       <span class="keywordflow">if</span>(isNoData(lineBuffer[icol]))</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>       <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     <span class="keywordflow">if</span>(isConstraint){</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>       <span class="keywordflow">if</span>(lineBuffer[icol]<minConstraint)</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>       <span class="keywordflow">if</span>(lineBuffer[icol]>maxConstraint)</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     }</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     <span class="keywordflow">if</span>(lineBuffer[icol]<minValue)</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>       minValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     <span class="keywordflow">if</span>(lineBuffer[icol]>maxValue)</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>       maxValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>       }</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     <span class="keywordflow">if</span>(isConstraint){</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>       <span class="keywordflow">if</span>(lineBuffer[icol]<minConstraint)</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>       <span class="keywordflow">if</span>(lineBuffer[icol]>maxConstraint)</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     }</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     minValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     maxValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>       }</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     }</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   }</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <span class="keywordflow">if</span>(!isValid)</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     <span class="keywordflow">throw</span>(static_cast<std::string>(<span class="stringliteral">"Warning: not initialized"</span>));</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span> }</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span> </div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span> <span class="keywordtype">void</span> ImgReaderGdal::getMinMax(<span class="keywordtype">double</span>& minValue, <span class="keywordtype">double</span>& maxValue, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   <span class="keywordtype">bool</span> isConstraint=(maxValue>minValue);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <span class="keywordtype">double</span> minConstraint=minValue;</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keywordtype">double</span> maxConstraint=maxValue;</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   std::vector<double> lineBuffer(nrOfCol());</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     readData(lineBuffer,GDT_Float64,irow,band);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>       <span class="keywordflow">if</span>(isNoData(lineBuffer[icol]))</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>       <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     <span class="keywordflow">if</span>(isConstraint){</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>       <span class="keywordflow">if</span>(lineBuffer[icol]<minConstraint)</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>       <span class="keywordflow">if</span>(lineBuffer[icol]>maxConstraint)</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     }</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     <span class="keywordflow">if</span>(lineBuffer[icol]<minValue)</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>       minValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     <span class="keywordflow">if</span>(lineBuffer[icol]>maxValue)</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>       maxValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>       }</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="keywordflow">if</span>(isConstraint){</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>       <span class="keywordflow">if</span>(lineBuffer[icol]<minConstraint)</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>       <span class="keywordflow">if</span>(lineBuffer[icol]>maxConstraint)</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     }</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     minValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     maxValue=lineBuffer[icol];</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>       }</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     }</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   }</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <span class="keywordflow">if</span>(!isValid)</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     <span class="keywordflow">throw</span>(static_cast<std::string>(<span class="stringliteral">"Warning: not initialized"</span>));</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span> }</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span> </div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span> <span class="keywordtype">double</span> ImgReaderGdal::getHistogram(std::vector<double>& histvector, <span class="keywordtype">double</span>& min, <span class="keywordtype">double</span>& max, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>& nbin, <span class="keywordtype">int</span> theBand, <span class="keywordtype">bool</span> kde){</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   <span class="keywordtype">double</span> minValue=0;</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   <span class="keywordtype">double</span> maxValue=0;</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       </div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <span class="keywordflow">if</span>(min>=max)</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     getMinMax(minValue,maxValue,theBand);</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     minValue=min;</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     maxValue=max;</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   }</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="keywordflow">if</span>(min<max&&min>minValue)</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     minValue=min;</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keywordflow">if</span>(min<max&&max<maxValue)</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     maxValue=max;</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   min=minValue;</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   max=maxValue;</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span> </div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <span class="keywordtype">double</span> sigma=0;</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <span class="keywordflow">if</span>(kde){</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     <span class="keywordtype">double</span> meanValue=0;</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     <span class="keywordtype">double</span> stdDev=0;</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     GDALProgressFunc pfnProgress;</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     <span class="keywordtype">void</span>* pProgressData;</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     GDALRasterBand* rasterBand;</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     rasterBand=getRasterBand(theBand);</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     <span class="comment">//rest minvalue and MaxValue as ComputeStatistics does not account for nodata, scale and offset</span></div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     minValue=min;</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     maxValue=max;</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span> </div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     <span class="keywordflow">if</span>(m_scale.size()>theBand){</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>       stdDev*=m_scale[theBand];</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     }</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     sigma=1.06*stdDev*pow(getNvalid(theBand),-0.2);</div>
 <div class="line"><a name="l00259"></a><span class="lineno">  259</span>   }</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span> }</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span> </div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span> <span class="keywordtype">bool</span> ImgReaderGdal::getCenterPos(<span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span> </div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="comment">//assuming</span></div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   x=gt[0]+(nrOfCol()/2.0)*gt[1]+(nrOfRow()/2.0)*gt[2];</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   y=gt[3]+(nrOfCol()/2.0)*gt[4]+(nrOfRow()/2.0)*gt[5];</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     <span class="comment">// x=m_ulx+(nrOfCol()/2.0)*m_delta_x;</span></div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     <span class="comment">// y=m_uly-(nrOfRow()/2.0)*m_delta_y;</span></div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   }</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="comment">// x=nrOfCol()/2.0;</span></div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     <span class="comment">// y=nrOfRow()/2.0;</span></div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   }</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span> }</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span> </div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span> <span class="comment">//i and j represent fraction of pixels, return true if image is georeferenced</span></div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span> <span class="keywordtype">bool</span> ImgReaderGdal::geo2image(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y, <span class="keywordtype">double</span>& i, <span class="keywordtype">double</span>& j)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   <span class="comment">//double values are returned, caller is responsible for interpolation step</span></div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="comment">//assuming</span></div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span> </div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordtype">double</span> denom=(gt[1]-gt[2]*gt[4]/gt[5]);</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="keywordtype">double</span> eps=0.00001;</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="keywordflow">if</span>(fabs(denom)>eps){</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     i=(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom;</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     j=(y-gt[3]-gt[4]*(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom)/gt[5];</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   }</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     <span class="comment">// double ulx=m_ulx;</span></div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     <span class="comment">// double uly=m_uly;</span></div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     <span class="comment">// i=(x-ulx)/m_delta_x;</span></div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="comment">// j=(uly-y)/m_delta_y;</span></div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   }</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     <span class="comment">// i=x;</span></div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     <span class="comment">// j=nrOfRow()-y;</span></div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   }</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span> }</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span> </div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span> <span class="comment">//x and y represent center of pixel, return true if image is georeferenced</span></div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span> <span class="keywordtype">bool</span> ImgReaderGdal::image2geo(<span class="keywordtype">double</span> i, <span class="keywordtype">double</span> j, <span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>   m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span> </div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>   <span class="comment">//assuming</span></div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span> </div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   x=gt[0]+(0.5+i)*gt[1]+(0.5+j)*gt[2];</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   y=gt[3]+(0.5+i)*gt[4]+(0.5+j)*gt[5];</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     <span class="comment">// x=m_ulx+(0.5+i)*m_delta_x;</span></div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     <span class="comment">// y=m_uly-(0.5+j)*m_delta_y;</span></div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   }</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     <span class="comment">// x=0.5+i;</span></div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     <span class="comment">// y=nrOfRow()-(0.5+j);</span></div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   }</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span> }</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span> </div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span> <span class="keywordtype">bool</span> ImgReaderGdal::covers(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span>  y)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   <span class="keywordtype">double</span> theULX, theULY, theLRX, theLRY;</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   getBoundingBox(theULX,theULY,theLRX,theLRY);</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   <span class="keywordflow">return</span>((x > theULX)&&</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>          (x < theLRX)&&</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>          (y < theULY)&&</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>          (y >theLRY));</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span> }</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span> </div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span> <span class="keywordtype">bool</span> ImgReaderGdal::covers(<span class="keywordtype">double</span> ulx, <span class="keywordtype">double</span>  uly, <span class="keywordtype">double</span> lrx, <span class="keywordtype">double</span> lry)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>   <span class="keywordtype">double</span> theULX, theULY, theLRX, theLRY;</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   getBoundingBox(theULX,theULY,theLRX,theLRY);</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   <span class="keywordflow">return</span>((ulx < theLRX)&&(lrx > theULX)&&(lry < theULY)&&(uly > theLRY));</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span> }</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span> </div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span> <span class="keywordtype">double</span> ImgReaderGdal::getMin(<span class="keywordtype">int</span>& x, <span class="keywordtype">int</span>& y, <span class="keywordtype">int</span> band)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   <span class="keywordtype">double</span> minValue=0;</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   std::vector<double> lineBuffer(nrOfCol());</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   <span class="keywordtype">bool</span> init=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     readData(lineBuffer,GDT_Float64,irow,band);</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       <span class="comment">// bool valid=(find(m_noDataValues.begin(),m_noDataValues.end(),lineBuffer[icol])==m_noDataValues.end());</span></div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       <span class="keywordflow">if</span>(!isNoData(lineBuffer[icol])){</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>         <span class="keywordflow">if</span>(!init){</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>           y=irow;</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>           x=icol;</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>           minValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>           init=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>         }</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(minValue>lineBuffer[icol]){</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>           y=irow;</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>           x=icol;</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>           minValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>         }</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       }</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     }</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>   }</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   <span class="keywordflow">if</span>(init)</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="keywordflow">return</span> minValue;</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     <span class="keywordflow">throw</span>(static_cast<std::string>(<span class="stringliteral">"Warning: not initialized"</span>));</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span> }</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span> </div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span> <span class="keywordtype">double</span> ImgReaderGdal::getMax(<span class="keywordtype">int</span>& x, <span class="keywordtype">int</span>& y, <span class="keywordtype">int</span> band)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>   <span class="keywordtype">double</span> maxValue=0;</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   std::vector<double> lineBuffer(nrOfCol());</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   <span class="keywordtype">bool</span> init=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>     readData(lineBuffer,GDT_Float64,irow,band);</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       <span class="comment">// bool valid=(find(m_noDataValues.begin(),m_noDataValues.end(),lineBuffer[icol])==m_noDataValues.end());</span></div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       <span class="comment">// if(valid){</span></div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       <span class="keywordflow">if</span>(!isNoData(lineBuffer[icol])){</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>         <span class="keywordflow">if</span>(!init){</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>           y=irow;</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>           x=icol;</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>           maxValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>           init=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>         }</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(maxValue<lineBuffer[icol]){</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>           y=irow;</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>           x=icol;</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>           maxValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>         }</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       }</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     }</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>   }</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>   <span class="keywordflow">if</span>(init)</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     <span class="keywordflow">return</span> maxValue;</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     <span class="keywordflow">throw</span>(static_cast<std::string>(<span class="stringliteral">"Warning: not initialized"</span>));</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span> }</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span> </div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span> <span class="keywordtype">void</span> ImgReaderGdal::getMinMax(<span class="keywordtype">int</span> startCol, <span class="keywordtype">int</span> endCol, <span class="keywordtype">int</span> startRow, <span class="keywordtype">int</span> endRow, <span class="keywordtype">int</span> band, <span class="keywordtype">double</span>& minValue, <span class="keywordtype">double</span>& maxValue)<span class="ke [...]
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>   <span class="comment">// GDALRasterBand  *poBand;</span></div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>   <span class="comment">// int             bGotMin, bGotMax;</span></div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   <span class="comment">// double          adfMinMax[2];</span></div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>         </div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="comment">// poBand = m_gds->GetRasterBand(band+1);</span></div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   <span class="comment">// adfMinMax[0] = poBand->GetMinimum( &bGotMin );</span></div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   <span class="comment">// adfMinMax[1] = poBand->GetMaximum( &bGotMax );</span></div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   <span class="comment">// if( ! (bGotMin && bGotMax) )</span></div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   <span class="comment">//   GDALComputeRasterMinMax((GDALRasterBandH)poBand, FALSE, adfMinMax);</span></div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>   <span class="comment">//   // GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);</span></div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>   <span class="comment">// minValue=adfMinMax[0];</span></div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   <span class="comment">// maxValue=adfMinMax[1];</span></div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span> </div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>   std::vector<double> lineBuffer(endCol-startCol+1);</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>   <span class="keywordtype">bool</span> init=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>   assert(endRow<nrOfRow());</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=startCol;irow<endRow+1;++irow){</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>     readData(lineBuffer,GDT_Float64,startCol,endCol,irow,band);</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<lineBuffer.size();++icol){</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       <span class="keywordflow">if</span>(!isNoData(lineBuffer[icol])){</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     <span class="keywordflow">if</span>(!init){</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       minValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       maxValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       init=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>     }</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       <span class="keywordflow">if</span>(minValue>lineBuffer[icol])</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>         minValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       <span class="keywordflow">if</span>(maxValue<lineBuffer[icol])</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>         maxValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     }</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       }</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     }</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>   }</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>   <span class="keywordflow">if</span>(!init)</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     <span class="keywordflow">throw</span>(static_cast<std::string>(<span class="stringliteral">"Warning: not initialized"</span>));</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span> }</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span> </div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span> <span class="keywordtype">void</span> ImgReaderGdal::getMinMax(<span class="keywordtype">double</span>& minValue, <span class="keywordtype">double</span>& maxValue, <span class="keywordtype">int</span> band, <span class="keywordtype">bool</span> exhaustiveSearch)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>   <span class="keywordflow">if</span>(exhaustiveSearch){<span class="comment">//force exhaustive search</span></div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>     std::vector<double> lineBuffer(nrOfCol());</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     <span class="keywordtype">bool</span> init=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       readData(lineBuffer,GDT_Float64,irow,band);</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>         <span class="comment">// bool valid=(find(m_noDataValues.begin(),m_noDataValues.end(),lineBuffer[icol])==m_noDataValues.end());</span></div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>         <span class="comment">// if(valid){</span></div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     <span class="keywordflow">if</span>(!isNoData(lineBuffer[icol])){</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>           <span class="keywordflow">if</span>(!init){</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>             minValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>             maxValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>             init=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>           }</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>             <span class="keywordflow">if</span>(minValue>lineBuffer[icol])</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>               minValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>             <span class="keywordflow">if</span>(maxValue<lineBuffer[icol])</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>               maxValue=lineBuffer[icol];</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>           }</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         }</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       }</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     }</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     <span class="keywordflow">if</span>(!init)</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       <span class="keywordflow">throw</span>(static_cast<std::string>(<span class="stringliteral">"Warning: not initialized"</span>));</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>   }</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     GDALRasterBand  *poBand;</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     <span class="keywordtype">int</span>             bGotMin, bGotMax;</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     <span class="keywordtype">double</span>          adfMinMax[2];</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         </div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     poBand = m_gds->GetRasterBand(band+1);</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     adfMinMax[0] = poBand->GetMinimum( &bGotMin );</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     adfMinMax[1] = poBand->GetMaximum( &bGotMax );</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     <span class="keywordflow">if</span>( ! (bGotMin && bGotMax) )</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       GDALComputeRasterMinMax((GDALRasterBandH)poBand, FALSE, adfMinMax);</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     minValue=adfMinMax[0];</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     maxValue=adfMinMax[1];</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>     <span class="keywordflow">if</span>(m_scale.size()>band){</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       minValue*=m_scale[band];</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       maxValue*=m_scale[band];</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     }</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>     <span class="keywordflow">if</span>(m_offset.size()>band){</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       minValue+=m_offset[band];</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       maxValue+=m_offset[band];</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     }</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>   }</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span> }</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span> </div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span> <span class="keywordtype">double</span> ImgReaderGdal::getHistogram(std::vector<double>& histvector, <span class="keywordtype">double</span>& min, <span class="keywordtype">double</span>& max, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>& nbin, <span class="keywordtype">int</span> theBand, <span class="keywordtype">bool</span> kde){</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   <span class="keywordtype">double</span> minValue=0;</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   <span class="keywordtype">double</span> maxValue=0;</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       </div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="keywordflow">if</span>(min>=max)</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     getMinMax(minValue,maxValue,theBand);</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     minValue=min;</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     maxValue=max;</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>   }</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <span class="keywordflow">if</span>(min<max&&min>minValue)</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     minValue=min;</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>   <span class="keywordflow">if</span>(min<max&&max<maxValue)</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     maxValue=max;</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   min=minValue;</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>   max=maxValue;</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span> </div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>   <span class="keywordtype">double</span> sigma=0;</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>   <span class="keywordflow">if</span>(kde){</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>     <span class="keywordtype">double</span> meanValue=0;</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     <span class="keywordtype">double</span> stdDev=0;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     GDALProgressFunc pfnProgress;</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     rasterBand=getRasterBand(theBand);</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="comment">//rest minvalue and MaxValue as ComputeStatistics does not account for nodata, scale and offset</span></div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     minValue=min;</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     maxValue=max;</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span> </div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     <span class="keywordflow">if</span>(m_scale.size()>theBand){</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       stdDev*=m_scale[theBand];</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     }</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     sigma=1.06*stdDev*pow(getNvalid(theBand),-0.2);</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>   }</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span> </div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>   <span class="keywordtype">double</span> scale=0;</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   <span class="keywordflow">if</span>(maxValue>minValue){</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     <span class="keywordflow">if</span>(nbin==0)</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       nbin=maxValue-minValue+1;</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     scale=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(nbin-1)/(maxValue-minValue);</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>   }</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     nbin=1;</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>   assert(nbin>0);</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>   <span class="keywordflow">if</span>(histvector.size()!=nbin){</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     histvector.resize(nbin);</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;histvector[i++]=0);</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>   }</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>   <span class="keywordtype">double</span> nvalid=0;</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nsample=0;</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ninvalid=0;</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>   std::vector<double> lineBuffer(nrOfCol());</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     readData(lineBuffer,GDT_Float64,irow,theBand);</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="keywordflow">if</span>(isNoData(lineBuffer[icol]))</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>         ++ninvalid;</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lineBuffer[icol]>maxValue)</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>         ++ninvalid;</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lineBuffer[icol]<minValue)</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>         ++ninvalid;</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nbin==1)</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     ++histvector[0];</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>       <span class="keywordflow">else</span>{<span class="comment">//scale to [0:nbin]</span></div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="keywordflow">if</span>(sigma>0){</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       <span class="comment">//todo: calculate real surface below pdf by using gsl_cdf_gaussian_P(x-mean+binsize,sigma)-gsl_cdf_gaussian_P(x-mean,sigma)</span></div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       <span class="comment">//hiero</span></div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin){</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>         <span class="keywordtype">double</span> icenter=minValue+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxValue-minValue)*(ibin+0.5)/nbin;</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         <span class="keywordtype">double</span> thePdf=gsl_ran_gaussian_pdf(lineBuffer[icol]-icenter, sigma);</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>         histvector[ibin]+=thePdf;</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>         nvalid+=thePdf;</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       }</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     }</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       <span class="keywordtype">int</span> theBin=<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span><span class="keyword">></span>(scale*(lineBuffer[icol]-minValue));</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       assert(theBin>=0);</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       assert(theBin<nbin);</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       ++histvector[theBin];</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       ++nvalid;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     }</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="comment">// else if(lineBuffer[icol]==maxValue)</span></div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       <span class="comment">//   ++histvector[nbin-1];</span></div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       <span class="comment">// else</span></div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       <span class="comment">//   ++histvector[static_cast<int>(static_cast<double>(lineBuffer[icol]-minValue)/(maxValue-minValue)*(nbin-1))];</span></div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       }</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     }</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>   }</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>   <span class="comment">// unsigned long int nvalid=nrOfCol()*nrOfRow()-ninvalid;</span></div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>   <span class="keywordflow">return</span> nvalid;</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span> }</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span> </div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span> <span class="keywordtype">void</span> ImgReaderGdal::getRange(std::vector<short>& range, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>   std::vector<short> lineBuffer(nrOfCol());</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>   range.clear();</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     readData(lineBuffer,GDT_Int16,irow,band);</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <span class="keywordflow">if</span>(find(range.begin(),range.end(),lineBuffer[icol])==range.end())</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         range.push_back(lineBuffer[icol]);</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     }</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>   }</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>   sort(range.begin(),range.end());</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span> }</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span> </div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ImgReaderGdal::getNvalid(<span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nvalid=0;</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     std::vector<double> lineBuffer(nrOfCol());</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       readData(lineBuffer,GDT_Float64,irow,band);</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     <span class="keywordflow">if</span>(isNoData(lineBuffer[icol]))</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       ++nvalid;</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       }</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     }</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     <span class="keywordflow">return</span> nvalid;</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   }</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>     <span class="keywordflow">return</span>(nrOfCol()*nrOfRow());</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span> }</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span> </div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span> <span class="keywordtype">int</span> ImgReaderGdal::getNoDataValues(std::vector<double>& noDataValues)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     noDataValues=m_noDataValues;</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordflow">return</span> m_noDataValues.size();</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>   }</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span> }</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span> </div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span> <span class="keywordtype">int</span> ImgReaderGdal::pushNoDataValue(<span class="keywordtype">double</span> noDataValue)</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span> {</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>   <span class="keywordflow">if</span>(find(m_noDataValues.begin(),m_noDataValues.end(),noDataValue)==m_noDataValues.end())</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     m_noDataValues.push_back(noDataValue);</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   <span class="keywordflow">return</span>(m_noDataValues.size());</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span> }</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span> </div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span> <span class="comment">// bool ImgReaderGdal::setNoDataValue(double noDataValue,int band)</span></div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span> <span class="comment">//   GDALRasterBand  *poBand;</span></div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span> <span class="comment">//   poBand = m_gds->GetRasterBand(band+1);</span></div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span> <span class="comment">//   if(poBand->SetNoDataValue(noDataValue)!=CE_None)</span></div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span> <span class="comment">//     return false;</span></div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span> <span class="comment">//   else</span></div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span> <span class="comment">//     return true;</span></div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span> </div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span> <span class="keywordtype">void</span> ImgReaderGdal::getRefPix(<span class="keywordtype">double</span>& refX, <span class="keywordtype">double</span> &refY, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   std::vector<double> lineBuffer(nrOfCol());</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>   <span class="keywordtype">double</span> validCol=0;</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   <span class="keywordtype">double</span> validRow=0;</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>   <span class="keywordtype">int</span> nvalidCol=0;</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   <span class="keywordtype">int</span> nvalidRow=0;</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     readData(lineBuffer,GDT_Float64,irow,band);</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       <span class="comment">// bool valid=(find(m_noDataValues.begin(),m_noDataValues.end(),lineBuffer[icol])==m_noDataValues.end());</span></div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       <span class="comment">// if(valid){</span></div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       <span class="keywordflow">if</span>(!isNoData(lineBuffer[icol])){</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>         validCol+=icol+1;</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>         ++nvalidCol;</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>         validRow+=irow+1;</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>         ++nvalidRow;</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       }</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     }</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>   }</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     <span class="comment">//reference coordinate is lower left corner of pixel in center of gravity</span></div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     <span class="comment">//we need geo coordinates for exactly this location: validCol(Row)/nvalidCol(Row)-0.5</span></div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     <span class="keywordtype">double</span> cgravi=validCol/nvalidCol-0.5;</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     <span class="keywordtype">double</span> cgravj=validRow/nvalidRow-0.5;</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordtype">double</span> refpixeli=floor(cgravi);</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     <span class="keywordtype">double</span> refpixelj=ceil(cgravj-1);</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="comment">//but image2geo provides location at center of pixel (shifted half pixel right down)</span></div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>     image2geo(refpixeli,refpixelj,refX,refY);</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="comment">//refX and refY now refer to center of gravity pixel</span></div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     refX-=0.5*getDeltaX();<span class="comment">//shift to left corner</span></div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     refY-=0.5*getDeltaY();<span class="comment">//shift to lower left corner</span></div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>   }</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     refX=floor(validCol/nvalidCol-0.5);<span class="comment">//left corner</span></div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     refY=floor(validRow/nvalidRow-0.5);<span class="comment">//upper corner</span></div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     <span class="comment">//shift to lower left corner of pixel</span></div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     refY+=1;</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       </div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>   }</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span> }</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span> </div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keywordtype">double</span> scale=0;</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordflow">if</span>(maxValue>minValue){</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     <span class="keywordflow">if</span>(nbin==0)</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>       nbin=maxValue-minValue+1;</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     scale=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(nbin-1)/(maxValue-minValue);</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   }</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     nbin=1;</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   assert(nbin>0);</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="keywordflow">if</span>(histvector.size()!=nbin){</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     histvector.resize(nbin);</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;histvector[i++]=0);</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   }</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="keywordtype">double</span> nvalid=0;</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nsample=0;</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ninvalid=0;</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   std::vector<double> lineBuffer(nrOfCol());</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     readData(lineBuffer,GDT_Float64,irow,theBand);</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>       <span class="keywordflow">if</span>(isNoData(lineBuffer[icol]))</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>         ++ninvalid;</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lineBuffer[icol]>maxValue)</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>         ++ninvalid;</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lineBuffer[icol]<minValue)</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>         ++ninvalid;</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nbin==1)</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     ++histvector[0];</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       <span class="keywordflow">else</span>{<span class="comment">//scale to [0:nbin]</span></div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     <span class="keywordflow">if</span>(sigma>0){</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>       <span class="comment">//todo: calculate real surface below pdf by using gsl_cdf_gaussian_P(x-mean+binsize,sigma)-gsl_cdf_gaussian_P(x-mean,sigma)</span></div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>       <span class="comment">//hiero</span></div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin){</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>         <span class="keywordtype">double</span> icenter=minValue+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxValue-minValue)*(ibin+0.5)/nbin;</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>         <span class="keywordtype">double</span> thePdf=gsl_ran_gaussian_pdf(lineBuffer[icol]-icenter, sigma);</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>         histvector[ibin]+=thePdf;</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>         nvalid+=thePdf;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       }</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     }</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       <span class="keywordtype">int</span> theBin=<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span><span class="keyword">></span>(scale*(lineBuffer[icol]-minValue));</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       assert(theBin>=0);</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       assert(theBin<nbin);</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       ++histvector[theBin];</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       ++nvalid;</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     }</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>       <span class="comment">// else if(lineBuffer[icol]==maxValue)</span></div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       <span class="comment">//   ++histvector[nbin-1];</span></div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>       <span class="comment">// else</span></div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       <span class="comment">//   ++histvector[static_cast<int>(static_cast<double>(lineBuffer[icol]-minValue)/(maxValue-minValue)*(nbin-1))];</span></div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       }</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     }</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   }</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   <span class="comment">// unsigned long int nvalid=nrOfCol()*nrOfRow()-ninvalid;</span></div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   <span class="keywordflow">return</span> nvalid;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span> }</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span> </div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span> <span class="keywordtype">void</span> ImgReaderGdal::getRange(std::vector<short>& range, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   std::vector<short> lineBuffer(nrOfCol());</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   range.clear();</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     readData(lineBuffer,GDT_Int16,irow,band);</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       <span class="keywordflow">if</span>(find(range.begin(),range.end(),lineBuffer[icol])==range.end())</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>         range.push_back(lineBuffer[icol]);</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     }</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   }</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   sort(range.begin(),range.end());</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span> }</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span> </div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ImgReaderGdal::getNvalid(<span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nvalid=0;</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     std::vector<double> lineBuffer(nrOfCol());</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       readData(lineBuffer,GDT_Float64,irow,band);</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     <span class="keywordflow">if</span>(isNoData(lineBuffer[icol]))</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       ++nvalid;</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       }</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     }</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     <span class="keywordflow">return</span> nvalid;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   }</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     <span class="keywordflow">return</span>(nrOfCol()*nrOfRow());</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span> }</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span> </div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span> </div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span> <span class="keywordtype">void</span> ImgReaderGdal::getRefPix(<span class="keywordtype">double</span>& refX, <span class="keywordtype">double</span> &refY, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   std::vector<double> lineBuffer(nrOfCol());</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   <span class="keywordtype">double</span> validCol=0;</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   <span class="keywordtype">double</span> validRow=0;</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keywordtype">int</span> nvalidCol=0;</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   <span class="keywordtype">int</span> nvalidRow=0;</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrOfRow();++irow){</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     readData(lineBuffer,GDT_Float64,irow,band);</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<nrOfCol();++icol){</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       <span class="comment">// bool valid=(find(m_noDataValues.begin(),m_noDataValues.end(),lineBuffer[icol])==m_noDataValues.end());</span></div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       <span class="comment">// if(valid){</span></div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       <span class="keywordflow">if</span>(!isNoData(lineBuffer[icol])){</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>         validCol+=icol+1;</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>         ++nvalidCol;</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>         validRow+=irow+1;</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>         ++nvalidRow;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>       }</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     }</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   }</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="comment">//reference coordinate is lower left corner of pixel in center of gravity</span></div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     <span class="comment">//we need geo coordinates for exactly this location: validCol(Row)/nvalidCol(Row)-0.5</span></div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="keywordtype">double</span> cgravi=validCol/nvalidCol-0.5;</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     <span class="keywordtype">double</span> cgravj=validRow/nvalidRow-0.5;</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="keywordtype">double</span> refpixeli=floor(cgravi);</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     <span class="keywordtype">double</span> refpixelj=ceil(cgravj-1);</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="comment">//but image2geo provides location at center of pixel (shifted half pixel right down)</span></div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     image2geo(refpixeli,refpixelj,refX,refY);</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     <span class="comment">//refX and refY now refer to center of gravity pixel</span></div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     refX-=0.5*getDeltaX();<span class="comment">//shift to left corner</span></div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     refY-=0.5*getDeltaY();<span class="comment">//shift to lower left corner</span></div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   }</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     refX=floor(validCol/nvalidCol-0.5);<span class="comment">//left corner</span></div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     refY=floor(validRow/nvalidRow-0.5);<span class="comment">//upper corner</span></div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="comment">//shift to lower left corner of pixel</span></div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     refY+=1;</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       </div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>   }</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span> }</div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgReaderGdal_8h_source.html b/doc/html/ImgReaderGdal_8h_source.html
index f127a54..e777796 100644
--- a/doc/html/ImgReaderGdal_8h_source.html
+++ b/doc/html/ImgReaderGdal_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,301 +74,247 @@
 <div class="line"><a name="l00020"></a><span class="lineno">   20</span> <span class="preprocessor">#ifndef _IMGREADERGDAL_H_</span></div>
 <div class="line"><a name="l00021"></a><span class="lineno">   21</span> <span class="preprocessor"></span><span class="preprocessor">#define _IMGREADERGDAL_H_</span></div>
 <div class="line"><a name="l00022"></a><span class="lineno">   22</span> <span class="preprocessor"></span></div>
-<div class="line"><a name="l00023"></a><span class="lineno">   23</span> <span class="preprocessor">#include <assert.h></span></div>
-<div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="preprocessor">#include <fstream></span></div>
-<div class="line"><a name="l00025"></a><span class="lineno">   25</span> <span class="preprocessor">#include <string></span></div>
-<div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="preprocessor">#include <sstream></span></div>
-<div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="preprocessor">#include "gdal_priv.h"</span></div>
-<div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="preprocessor">#include "base/Vector2d.h"</span></div>
-<div class="line"><a name="l00029"></a><span class="lineno">   29</span> </div>
-<div class="line"><a name="l00030"></a><span class="lineno">   30</span> <span class="keyword">enum</span> RESAMPLE { NEAR = 0, BILINEAR = 1, BICUBIC = 2 };</div>
-<div class="line"><a name="l00031"></a><span class="lineno">   31</span> </div>
-<div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="comment">//--------------------------------------------------------------------------</span></div>
-<div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="classImgReaderGdal.html">   33</a></span> <span class="keyword">class </span><a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a></div>
-<div class="line"><a name="l00034"></a><span class="lineno">   34</span> {</div>
-<div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="keyword">public</span>:</div>
-<div class="line"><a name="l00036"></a><span class="lineno">   36</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>(<span class="keywordtype">void</span>);</div>
-<div class="line"><a name="l00037"></a><span class="lineno">   37</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>(<span class="keyword">const</span> std::string& filename){open(filename);};</div>
-<div class="line"><a name="l00038"></a><span class="lineno">   38</span>   ~<a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>(<span class="keywordtype">void</span>);</div>
-<div class="line"><a name="l00039"></a><span class="lineno">   39</span>   <span class="keywordtype">void</span> open(<span class="keyword">const</span> std::string& filename);<span class="comment">//, double magicX=1, double magicY=1);</span></div>
-<div class="line"><a name="l00040"></a><span class="lineno">   40</span>   <span class="keywordtype">void</span> close(<span class="keywordtype">void</span>);</div>
-<div class="line"><a name="l00041"></a><span class="lineno">   41</span>   std::string getFileName()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_filename;};</div>
-<div class="line"><a name="l00042"></a><span class="lineno">   42</span>   <span class="keywordtype">int</span> nrOfCol(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_ncol;};</div>
-<div class="line"><a name="l00043"></a><span class="lineno">   43</span>   <span class="keywordtype">int</span> nrOfRow(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_nrow;};</div>
-<div class="line"><a name="l00044"></a><span class="lineno">   44</span>   <span class="keywordtype">int</span> nrOfBand(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_nband;};</div>
-<div class="line"><a name="l00045"></a><span class="lineno">   45</span>   <span class="keywordtype">bool</span> isGeoRef()<span class="keyword"> const </span>{<span class="keywordtype">double</span> gt[6];getGeoTransform(gt);<span class="keywordflow">if</span>(gt[5]<0) <span class="keywordflow">return</span> <span class="keyword">true</span>;<span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;};</div>
-<div class="line"><a name="l00046"></a><span class="lineno">   46</span>   std::string getProjection(<span class="keywordtype">void</span>) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00047"></a><span class="lineno">   47</span>   std::string getProjectionRef(<span class="keywordtype">void</span>) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00048"></a><span class="lineno">   48</span>   std::string getGeoTransform() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00049"></a><span class="lineno">   49</span>   <span class="keywordtype">void</span> getGeoTransform(<span class="keywordtype">double</span>* gt) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00050"></a><span class="lineno">   50</span>   <span class="comment">/* void getGeoTransform(double& ulx, double& uly, double& deltaX, double& deltaY, double& rot1, double& rot2) const; */</span></div>
-<div class="line"><a name="l00051"></a><span class="lineno">   51</span>   std::string getDescription() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00052"></a><span class="lineno">   52</span>   std::string getMetadataItem() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00053"></a><span class="lineno">   53</span>   std::string getImageDescription() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00054"></a><span class="lineno">   54</span>   <span class="keywordtype">bool</span> getBoundingBox (<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00055"></a><span class="lineno">   55</span>   <span class="keywordtype">bool</span> getCenterPos(<span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00056"></a><span class="lineno">   56</span>   <span class="keywordtype">double</span> getUlx()<span class="keyword"> const </span>{<span class="keywordtype">double</span> ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);<span class="keywordflow">return</span>(ulx);};</div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>   <span class="keywordtype">double</span> getUly()<span class="keyword"> const </span>{<span class="keywordtype">double</span> ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);<span class="keywordflow">return</span>(uly);};</div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>   <span class="keywordtype">double</span> getLrx()<span class="keyword"> const </span>{<span class="keywordtype">double</span> ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);<span class="keywordflow">return</span>(lrx);};</div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>   <span class="keywordtype">double</span> getLry()<span class="keyword"> const </span>{<span class="keywordtype">double</span> ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);<span class="keywordflow">return</span>(lry);};</div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span>   <span class="comment">// bool getMagicPixel(double& magicX, double& magicY) const {magicX=m_magic_x;magicY=m_magic_y;};</span></div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="keywordtype">void</span> setScale(<span class="keywordtype">double</span> theScale, <span class="keywordtype">int</span> band=0){</div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>     <span class="comment">/* if(getRasterBand(band)->SetScale(theScale)==CE_Failure){ */</span></div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>     <span class="keywordflow">if</span>(m_scale.size()!=nrOfBand()){<span class="comment">//initialize</span></div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>       m_scale.resize(nrOfBand());</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nrOfBand();++iband)</div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>     m_scale[iband]=1.0;</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>     }</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>     m_scale[band]=theScale;</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>     <span class="comment">/* }; */</span></div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   }</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   <span class="keywordtype">void</span> setOffset(<span class="keywordtype">double</span> theOffset, <span class="keywordtype">int</span> band=0){</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>     <span class="comment">/* if(getRasterBand(band)->SetOffset(theOffset)==CE_Failure){ */</span></div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>     <span class="keywordflow">if</span>(m_offset.size()!=nrOfBand()){</div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>       m_offset.resize(nrOfBand());</div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nrOfBand();++iband)</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>     m_offset[iband]=0.0;</div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>     }</div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>       m_offset[band]=theOffset;</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>     <span class="comment">/* }; */</span></div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   }</div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <span class="keywordtype">int</span> getNoDataValues(std::vector<double>& noDataValues) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <span class="keywordtype">bool</span> isNoData(<span class="keywordtype">double</span> value)<span class="keyword"> const</span>{<span class="keywordflow">if</span>(m_noDataValues.empty()) <span class="keywordflow">return</span> <span class="keyword">false</span>;<span class="keywordflow">else</span> <span class="keywordflow">return</span> find(m_noDataValues.begin(),m_noDataValues.end(),value)!=m_noDataValue [...]
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <span class="keywordtype">int</span> pushNoDataValue(<span class="keywordtype">double</span> noDataValue);</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <span class="keywordtype">int</span> setNoData(<span class="keyword">const</span> std::vector<double> nodata){m_noDataValues=nodata;};</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   CPLErr GDALSetNoDataValue(<span class="keywordtype">double</span> noDataValue, <span class="keywordtype">int</span> band=0) {<span class="keywordflow">return</span> getRasterBand(band)->SetNoDataValue(noDataValue);};</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <span class="keywordtype">bool</span> covers(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <span class="keywordtype">bool</span> covers(<span class="keywordtype">double</span> ulx, <span class="keywordtype">double</span>  uly, <span class="keywordtype">double</span> lrx, <span class="keywordtype">double</span> lry) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <span class="keywordtype">bool</span> geo2image(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y, <span class="keywordtype">double</span>& i, <span class="keywordtype">double</span>& j) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <span class="keywordtype">bool</span> image2geo(<span class="keywordtype">double</span> i, <span class="keywordtype">double</span> j, <span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <span class="keywordtype">double</span> getDeltaX(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordtype">double</span> gt[6];getGeoTransform(gt);<span class="keywordflow">return</span> gt[1];};</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <span class="keywordtype">double</span> getDeltaY(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordtype">double</span> gt[6];getGeoTransform(gt);<span class="keywordflow">return</span> -gt[5];};</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readData(T& value, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> col, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <span [...]
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">double</span> row, <span class="keywordtype">int</span> band=0, RE [...]
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readDataBlock(<a class="code" href="classVector2d.html">Vector2d<T></a>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> minRow, [...]
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readDataBlock(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> minRow, <span class="keywordtype">int</span> maxRo [...]
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">double</span> row, <span class="keywordtype">int</span> band=0, RESAMPLE resample=NEAR) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <span class="keywordtype">void</span> getMinMax(<span class="keywordtype">int</span> startCol, <span class="keywordtype">int</span> endCol, <span class="keywordtype">int</span> startRow, <span class="keywordtype">int</span> endRow, <span class="keywordtype">int</span> band, <span class="keywordtype">double</span>& minValue, <span class="keywordtype">double</span>& maxValue) <span class="keyword">const [...]
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <span class="keywordtype">void</span> getMinMax(<span class="keywordtype">double</span>& minValue, <span class="keywordtype">double</span>& maxValue, <span class="keywordtype">int</span> band=0, <span class="keywordtype">bool</span> exhaustiveSearch=<span class="keyword">true</span>) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <span class="keywordtype">double</span> getMin(<span class="keywordtype">int</span>& col, <span class="keywordtype">int</span>& row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <span class="keywordtype">double</span> getHistogram(std::vector<double>& histvector, <span class="keywordtype">double</span>& min, <span class="keywordtype">double</span>& max,<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>& nbin, <span class="keywordtype">int</span> theBand=0, <span class="keywordtype">bool</span> kde=<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <span class="keywordtype">double</span> getMax(<span class="keywordtype">int</span>& col, <span class="keywordtype">int</span>& row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <span class="keywordtype">void</span> getRefPix(<span class="keywordtype">double</span>& refX, <span class="keywordtype">double</span> &refY, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <span class="keywordtype">void</span> getRange(std::vector<short>& range, <span class="keywordtype">int</span> Band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> getNvalid(<span class="keywordtype">int</span> band) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   GDALDataType getDataType(<span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   GDALRasterBand* getRasterBand(<span class="keywordtype">int</span> band=0);</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   GDALColorTable* getColorTable(<span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   std::string getDriverDescription() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   std::string getImageType()<span class="keyword"> const</span>{<span class="keywordflow">return</span> getDriverDescription();};</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span> <span class="comment">//   std::string getImageType() const{return "GTiff";};</span></div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   std::string getInterleave() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   std::string getCompression() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   GDALDataset* getDataset(){<span class="keywordflow">return</span> m_gds;};</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <span class="keywordtype">char</span>** getMetadata();</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <span class="keywordtype">char</span>** getMetadata() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <span class="keywordtype">void</span> getMetadata(std::list<std::string>& metadata) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span> </div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span> <span class="keyword">protected</span>:</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <span class="keywordtype">void</span> setCodec();<span class="comment">//double magicX, double magicY);</span></div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span> </div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   std::string m_filename;</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   GDALDataset *m_gds;</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <span class="keywordtype">int</span> m_ncol;</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <span class="keywordtype">int</span> m_nrow;</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   <span class="keywordtype">int</span> m_nband;</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <span class="keywordtype">double</span> m_gt[6];</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <span class="comment">/* double m_ulx; */</span></div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <span class="comment">/* double m_uly; */</span></div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <span class="comment">/* double m_delta_x; */</span></div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   <span class="comment">/* double m_delta_y; */</span></div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <span class="comment">/* bool m_isGeoRef; */</span></div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   std::vector<double> m_noDataValues;</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   std::vector<double> m_scale;</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   std::vector<double> m_offset;</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span> };</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span> </div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span> <span class="comment">//     adfGeoTransform[0] /* top left x */</span></div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span> <span class="comment">//     adfGeoTransform[1] /* w-e pixel resolution */</span></div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span> <span class="comment">//     adfGeoTransform[2] /* rotation, 0 if image is "north up" */</span></div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span> <span class="comment">//     adfGeoTransform[3] /* top left y */</span></div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span> <span class="comment">//     adfGeoTransform[4] /* rotation, 0 if image is "north up" */</span></div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span> <span class="comment">//     adfGeoTransform[5] /* n-s pixel resolution */</span></div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span> </div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readData(T& value, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> col, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <span class="comment">//fetch raster band</span></div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   GDALRasterBand  *poBand;</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   assert(band<nrOfBand()+1);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   assert(col<nrOfCol());</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   assert(col>=0);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   assert(row<nrOfRow());</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   assert(row>=0);</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   poBand->RasterIO(GF_Read,col,row,1,1,&value,1,1,dataType,0,0);</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <span class="keywordflow">if</span>(m_scale.size()>band)</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     value=static_cast<double>(value)*m_scale[band];</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <span class="keywordflow">if</span>(m_offset.size()>band)</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     value=static_cast<double>(value)+m_offset[band];</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span> }</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span> </div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> b [...]
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <span class="comment">//fetch raster band</span></div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   GDALRasterBand  *poBand;</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   assert(band<nrOfBand()+1);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   assert(minCol<nrOfCol());</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   assert(minCol>=0);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   assert(maxCol<nrOfCol());</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   assert(minCol<=maxCol);</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   assert(row<nrOfRow());</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   assert(row>=0);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   <span class="keywordflow">if</span>(buffer.size()!=maxCol-minCol+1)</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     buffer.resize(maxCol-minCol+1);</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   poBand->RasterIO(GF_Read,minCol,row,buffer.size(),1,&(buffer[0]),buffer.size(),1,dataType,0,0);</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keywordflow">if</span>(m_scale.size()>band||m_offset.size()>band){</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     <span class="keywordtype">double</span> theScale=1;</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     <span class="keywordtype">double</span> theOffset=0;</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     <span class="keywordflow">if</span>(m_scale.size()>band)</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>       theScale=m_scale[band];</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     <span class="keywordflow">if</span>(m_offset.size()>band)</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>       theOffset=m_offset[band];</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<buffer.size();++index)</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>       buffer[index]=theScale*static_cast<double>(buffer[index])+theOffset;</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   }</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span> }</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span> </div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">double</span> row, <span class="keywordtype">int</spa [...]
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="comment">//todo: make upper and lower row depend on isGeo...</span></div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   std::vector<T> readBuffer_upper;</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   std::vector<T> readBuffer_lower;</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keywordflow">if</span>(buffer.size()!=maxCol-minCol+1)</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     buffer.resize(maxCol-minCol+1);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <span class="keywordtype">double</span> upperRow=row-0.5;</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   upperRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperRow);</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <span class="keywordtype">double</span> lowerRow=row+0.5;</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   lowerRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerRow);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keywordflow">switch</span>(resample){</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     <span class="keywordflow">if</span>(lowerRow>=nrOfRow())</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>       lowerRow=nrOfRow()-1;</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     <span class="keywordflow">if</span>(upperRow<0)</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>       upperRow=0;</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     readData(readBuffer_upper,GDT_Float64,minCol,maxCol,static_cast<int>(upperRow),band);</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     readData(readBuffer_lower,GDT_Float64,minCol,maxCol,static_cast<int>(lowerRow),band);</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="comment">//do interpolation in y</span></div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<maxCol-minCol+1;++icol){</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       buffer[icol]=(lowerRow-row+0.5)*readBuffer_upper[icol]+(1-lowerRow+row-0.5)*readBuffer_lower[icol];</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     }</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     readData(buffer,GDT_Float64,minCol,maxCol,static_cast<int>(row),band);</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   }</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span> }</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span> </div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readDataBlock(<a class="code" href="classVector2d.html">Vector2d<T></a>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</ [...]
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   buffer.resize(maxRow-minRow+1);</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=minRow;irow<=maxRow;++irow){</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     buffer[irow-minRow].resize(maxCol-minCol+1);</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     readData(buffer[irow-minRow],dataType,minCol,maxCol,irow,band);</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   }</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span> }</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   </div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readDataBlock(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> minRow, <span class="keywordtype">int [...]
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   <span class="keywordtype">double</span> theScale=1;</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   <span class="keywordtype">double</span> theOffset=0;</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   <span class="keywordflow">if</span>(m_scale.size()>band)</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     theScale=m_scale[band];</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="keywordflow">if</span>(m_offset.size()>band)</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     theOffset=m_offset[band];</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="comment">//fetch raster band</span></div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   GDALRasterBand  *poBand;</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   assert(band<nrOfBand()+1);</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="keywordflow">if</span>(minCol>=nrOfCol() ||</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>      (minCol<0) ||</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>      (maxCol>=nrOfCol()) ||</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>      (minCol>maxCol) ||</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>      (minRow>=nrOfRow()) ||</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>      (minRow<0) ||</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>      (maxRow>=nrOfRow()) ||</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>      (minRow>maxRow)){</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     std::string errorString=<span class="stringliteral">"block not within image boundaries"</span>;</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   }</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   <span class="comment">/* assert(minCol<nrOfCol()); */</span></div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   <span class="comment">/* assert(minCol>=0); */</span></div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <span class="comment">/* assert(maxCol<nrOfCol()); */</span></div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <span class="comment">/* assert(minCol<=maxCol); */</span></div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   <span class="comment">/* assert(minRow<nrOfRow()); */</span></div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="comment">/* assert(minRow>=0); */</span></div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="comment">/* assert(maxRow<nrOfRow()); */</span></div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="comment">/* assert(minRow<=maxRow); */</span></div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordflow">if</span>(buffer.size()!=(maxRow-minRow+1)*(maxCol-minCol+1))</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     buffer.resize((maxRow-minRow+1)*(maxCol-minCol+1));</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   poBand->RasterIO(GF_Read,minCol,minRow,maxCol-minCol+1,maxRow-minRow+1,&(buffer[0]),(maxCol-minCol+1),(maxRow-minRow+1),dataType,0,0);</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="keywordflow">if</span>(m_scale.size()>band||m_offset.size()>band){</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<buffer.size();++index)</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>       buffer[index]=theScale*buffer[index]+theOffset;</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   }</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span> }</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span> </div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span> <span class="comment">// template<typename T> void ImgReaderGdal::readDataBlock(vector<T>& buffer, const GDALDataType& dataType , int minCol, int maxCol, int minRow, int maxRow, int band) const</span></div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span> <span class="comment">//   assert(band<nrOfBand()+1);</span></div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span> <span class="comment">//   assert(minCol<nrOfCol());</span></div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span> <span class="comment">//   assert(minCol>=0);</span></div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span> <span class="comment">//   assert(maxCol<nrOfCol());</span></div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span> <span class="comment">//   assert(minCol<=maxCol);</span></div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span> <span class="comment">//   assert(minRow<nrOfRow());</span></div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span> <span class="comment">//   assert(minRow>=0);</span></div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span> <span class="comment">//   assert(maxRow<nrOfRow());</span></div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span> <span class="comment">//   assert(minRow<=maxRow);</span></div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span> <span class="comment">//   if(buffer.size()!=(maxRow-minRow+1)*(maxCol-minCol+1))</span></div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span> <span class="comment">//     buffer.resize((maxRow-minRow+1)*(maxCol-minCol+1));</span></div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span> <span class="comment">//   //fetch raster band</span></div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span> <span class="comment">//   GDALRasterBand  *poBand;</span></div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span> <span class="comment">//   assert(band<nrOfBand()+1);</span></div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span> <span class="comment">//   poBand = m_gds->GetRasterBand(band+1);//GDAL uses 1 based index</span></div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span> <span class="comment">//   for(int irow=0;irow<maxRow-minRow+1;++irow)</span></div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span> <span class="comment">//     poBand->RasterIO(GF_Read,minCol,minRow+irow,maxCol-minCol+1,1,&(buffer[irow*(maxCol-minCol+1)]),maxCol-minCol+1,1,dataType,0,0);</span></div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   </div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   readData(buffer,dataType,0,nrOfCol()-1,row,band);</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span> }</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span> </div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">double</span> row, <span class="keywordtype">int</span> band, RESAMPLE resample)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   readData(buffer,dataType,0,nrOfCol()-1,row,band,resample);</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span> }</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span> </div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span> </div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span> <span class="preprocessor">#endif // _IMGREADERGDAL_H_</span></div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span> <span class="preprocessor"></span></div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span> <span class="comment">//       //fetch raster band</span></div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span> <span class="comment">//   GDALRasterBand  *poBand;</span></div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span> <span class="comment">//   assert(band<nrOfBand()+1);</span></div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span> <span class="comment">//   poBand = m_gds->GetRasterBand(band+1);//GDAL uses 1 based index</span></div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span> <span class="comment">//   buffer.resize(maxCol-minCol+1);</span></div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span> <span class="comment">//   assert(minCol<nrOfCol());</span></div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span> <span class="comment">//   assert(row<nrOfRow());</span></div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span> <span class="comment">//   poBand->RasterIO(GF_Read,minCol,row,buffer.size(),1,&(buffer[0]),buffer.size(),1,GDT_Int16,0,0);</span></div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="line"><a name="l00023"></a><span class="lineno">   23</span> <span class="preprocessor">#include "ImgRasterGdal.h"</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="preprocessor">#include <assert.h></span></div>
+<div class="line"><a name="l00025"></a><span class="lineno">   25</span> <span class="preprocessor">#include <fstream></span></div>
+<div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="preprocessor">#include <string></span></div>
+<div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="preprocessor">#include <sstream></span></div>
+<div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="preprocessor">#include "gdal_priv.h"</span></div>
+<div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="preprocessor">#include "base/Vector2d.h"</span></div>
+<div class="line"><a name="l00030"></a><span class="lineno">   30</span> </div>
+<div class="line"><a name="l00031"></a><span class="lineno">   31</span> <span class="comment">//--------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="classImgReaderGdal.html">   32</a></span> <span class="keyword">class </span><a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> : <span class="keyword">public</span> <span class="keyword">virtual</span> <a class="code" href="classImgRasterGdal.html">ImgRasterGdal</a></div>
+<div class="line"><a name="l00033"></a><span class="lineno">   33</span> {</div>
+<div class="line"><a name="l00034"></a><span class="lineno">   34</span> <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00035"></a><span class="lineno">   35</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> GDALAccess& readMode=GA_ReadOnly){open(filename, readMode);};</div>
+<div class="line"><a name="l00037"></a><span class="lineno">   37</span>   ~<a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00038"></a><span class="lineno">   38</span>   <span class="keywordtype">void</span> open(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> GDALAccess& readMode=GA_ReadOnly);</div>
+<div class="line"><a name="l00039"></a><span class="lineno">   39</span>   <span class="keywordtype">void</span> close(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00040"></a><span class="lineno">   40</span> </div>
+<div class="line"><a name="l00041"></a><span class="lineno">   41</span>   <span class="keywordtype">void</span> setScale(<span class="keywordtype">double</span> theScale, <span class="keywordtype">int</span> band=0){</div>
+<div class="line"><a name="l00042"></a><span class="lineno">   42</span>     <span class="comment">/* if(getRasterBand(band)->SetScale(theScale)==CE_Failure){ */</span></div>
+<div class="line"><a name="l00043"></a><span class="lineno">   43</span>     <span class="keywordflow">if</span>(m_scale.size()!=nrOfBand()){<span class="comment">//initialize</span></div>
+<div class="line"><a name="l00044"></a><span class="lineno">   44</span>       m_scale.resize(nrOfBand());</div>
+<div class="line"><a name="l00045"></a><span class="lineno">   45</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nrOfBand();++iband)</div>
+<div class="line"><a name="l00046"></a><span class="lineno">   46</span>     m_scale[iband]=1.0;</div>
+<div class="line"><a name="l00047"></a><span class="lineno">   47</span>     }</div>
+<div class="line"><a name="l00048"></a><span class="lineno">   48</span>     m_scale[band]=theScale;</div>
+<div class="line"><a name="l00049"></a><span class="lineno">   49</span>     <span class="comment">/* }; */</span></div>
+<div class="line"><a name="l00050"></a><span class="lineno">   50</span>   }</div>
+<div class="line"><a name="l00051"></a><span class="lineno">   51</span>   <span class="keywordtype">void</span> setOffset(<span class="keywordtype">double</span> theOffset, <span class="keywordtype">int</span> band=0){</div>
+<div class="line"><a name="l00052"></a><span class="lineno">   52</span>     <span class="comment">/* if(getRasterBand(band)->SetOffset(theOffset)==CE_Failure){ */</span></div>
+<div class="line"><a name="l00053"></a><span class="lineno">   53</span>     <span class="keywordflow">if</span>(m_offset.size()!=nrOfBand()){</div>
+<div class="line"><a name="l00054"></a><span class="lineno">   54</span>       m_offset.resize(nrOfBand());</div>
+<div class="line"><a name="l00055"></a><span class="lineno">   55</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nrOfBand();++iband)</div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>     m_offset[iband]=0.0;</div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span>     }</div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>       m_offset[band]=theOffset;</div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>     <span class="comment">/* }; */</span></div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span>   }</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readData(T& value, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> col, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <span [...]
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">double</span> row, <span class="keywordtype">int</span> band=0, RE [...]
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readDataBlock(<a class="code" href="classVector2d.html">Vector2d<T></a>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> minRow, [...]
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readDataBlock(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> minRow, <span class="keywordtype">int</span> maxRo [...]
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">double</span> row, <span class="keywordtype">int</span> band=0, RESAMPLE resample=NEAR) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   <span class="keywordtype">void</span> getMinMax(<span class="keywordtype">int</span> startCol, <span class="keywordtype">int</span> endCol, <span class="keywordtype">int</span> startRow, <span class="keywordtype">int</span> endRow, <span class="keywordtype">int</span> band, <span class="keywordtype">double</span>& minValue, <span class="keywordtype">double</span>& maxValue) <span class="keyword">const [...]
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   <span class="keywordtype">void</span> getMinMax(<span class="keywordtype">double</span>& minValue, <span class="keywordtype">double</span>& maxValue, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   <span class="keywordtype">double</span> getMin(<span class="keywordtype">int</span>& col, <span class="keywordtype">int</span>& row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   <span class="keywordtype">double</span> getHistogram(std::vector<double>& histvector, <span class="keywordtype">double</span>& min, <span class="keywordtype">double</span>& max,<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>& nbin, <span class="keywordtype">int</span> theBand=0, <span class="keywordtype">bool</span> kde=<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>   <span class="keywordtype">double</span> getMax(<span class="keywordtype">int</span>& col, <span class="keywordtype">int</span>& row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <span class="keywordtype">void</span> getRefPix(<span class="keywordtype">double</span>& refX, <span class="keywordtype">double</span> &refY, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <span class="keywordtype">void</span> getRange(std::vector<short>& range, <span class="keywordtype">int</span> Band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> getNvalid(<span class="keywordtype">int</span> band) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span> </div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <span class="keywordtype">void</span> setCodec(<span class="keyword">const</span> GDALAccess& readMode=GA_ReadOnly);</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span> </div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   std::vector<double> m_scale;</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   std::vector<double> m_offset;</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span> };</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span> </div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span> <span class="comment">//     adfGeoTransform[0] /* top left x */</span></div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span> <span class="comment">//     adfGeoTransform[1] /* w-e pixel resolution */</span></div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span> <span class="comment">//     adfGeoTransform[2] /* rotation, 0 if image is "north up" */</span></div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span> <span class="comment">//     adfGeoTransform[3] /* top left y */</span></div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span> <span class="comment">//     adfGeoTransform[4] /* rotation, 0 if image is "north up" */</span></div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span> <span class="comment">//     adfGeoTransform[5] /* n-s pixel resolution */</span></div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span> </div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readData(T& value, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> col, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <span class="comment">//fetch raster band</span></div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   GDALRasterBand  *poBand;</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   assert(band<nrOfBand()+1);</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   assert(col<nrOfCol());</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   assert(col>=0);</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   assert(row<nrOfRow());</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   assert(row>=0);</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   poBand->RasterIO(GF_Read,col,row,1,1,&value,1,1,dataType,0,0);</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <span class="keywordflow">if</span>(m_scale.size()>band)</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     value=static_cast<double>(value)*m_scale[band];</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <span class="keywordflow">if</span>(m_offset.size()>band)</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>     value=static_cast<double>(value)+m_offset[band];</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span> }</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span> </div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> b [...]
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <span class="comment">//fetch raster band</span></div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   GDALRasterBand  *poBand;</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   assert(band<nrOfBand()+1);</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   assert(minCol<nrOfCol());</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   assert(minCol>=0);</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   assert(maxCol<nrOfCol());</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   assert(minCol<=maxCol);</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   assert(row<nrOfRow());</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   assert(row>=0);</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <span class="keywordflow">if</span>(buffer.size()!=maxCol-minCol+1)</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     buffer.resize(maxCol-minCol+1);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   poBand->RasterIO(GF_Read,minCol,row,buffer.size(),1,&(buffer[0]),buffer.size(),1,dataType,0,0);</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <span class="keywordflow">if</span>(m_scale.size()>band||m_offset.size()>band){</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>     <span class="keywordtype">double</span> theScale=1;</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     <span class="keywordtype">double</span> theOffset=0;</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     <span class="keywordflow">if</span>(m_scale.size()>band)</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>       theScale=m_scale[band];</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>     <span class="keywordflow">if</span>(m_offset.size()>band)</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>       theOffset=m_offset[band];</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<buffer.size();++index)</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>       buffer[index]=theScale*static_cast<double>(buffer[index])+theOffset;</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   }</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span> }</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span> </div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">double</span> row, <span class="keywordtype">int</spa [...]
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <span class="comment">//todo: make upper and lower row depend on isGeo...</span></div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   std::vector<T> readBuffer_upper;</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   std::vector<T> readBuffer_lower;</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <span class="keywordflow">if</span>(buffer.size()!=maxCol-minCol+1)</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     buffer.resize(maxCol-minCol+1);</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <span class="keywordtype">double</span> upperRow=row-0.5;</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   upperRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperRow);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <span class="keywordtype">double</span> lowerRow=row+0.5;</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   lowerRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerRow);</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <span class="keywordflow">switch</span>(resample){</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     <span class="keywordflow">if</span>(lowerRow>=nrOfRow())</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>       lowerRow=nrOfRow()-1;</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     <span class="keywordflow">if</span>(upperRow<0)</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>       upperRow=0;</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     readData(readBuffer_upper,GDT_Float64,minCol,maxCol,static_cast<int>(upperRow),band);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     readData(readBuffer_lower,GDT_Float64,minCol,maxCol,static_cast<int>(lowerRow),band);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     <span class="comment">//do interpolation in y</span></div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<maxCol-minCol+1;++icol){</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>       buffer[icol]=(lowerRow-row+0.5)*readBuffer_upper[icol]+(1-lowerRow+row-0.5)*readBuffer_lower[icol];</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     }</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     readData(buffer,GDT_Float64,minCol,maxCol,static_cast<int>(row),band);</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   }</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span> }</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span> </div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readDataBlock(<a class="code" href="classVector2d.html">Vector2d<T></a>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</ [...]
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   buffer.resize(maxRow-minRow+1);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=minRow;irow<=maxRow;++irow){</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     buffer[irow-minRow].resize(maxCol-minCol+1);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     readData(buffer[irow-minRow],dataType,minCol,maxCol,irow,band);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   }</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span> }</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   </div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readDataBlock(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> minRow, <span class="keywordtype">int [...]
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <span class="keywordtype">double</span> theScale=1;</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="keywordtype">double</span> theOffset=0;</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keywordflow">if</span>(m_scale.size()>band)</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     theScale=m_scale[band];</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <span class="keywordflow">if</span>(m_offset.size()>band)</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     theOffset=m_offset[band];</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="comment">//fetch raster band</span></div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   GDALRasterBand  *poBand;</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   assert(band<nrOfBand()+1);</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   <span class="keywordflow">if</span>(minCol>=nrOfCol() ||</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>      (minCol<0) ||</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>      (maxCol>=nrOfCol()) ||</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>      (minCol>maxCol) ||</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>      (minRow>=nrOfRow()) ||</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>      (minRow<0) ||</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>      (maxRow>=nrOfRow()) ||</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>      (minRow>maxRow)){</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     std::string errorString=<span class="stringliteral">"block not within image boundaries"</span>;</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   }</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <span class="comment">/* assert(minCol<nrOfCol()); */</span></div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <span class="comment">/* assert(minCol>=0); */</span></div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <span class="comment">/* assert(maxCol<nrOfCol()); */</span></div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <span class="comment">/* assert(minCol<=maxCol); */</span></div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="comment">/* assert(minRow<nrOfRow()); */</span></div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <span class="comment">/* assert(minRow>=0); */</span></div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   <span class="comment">/* assert(maxRow<nrOfRow()); */</span></div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   <span class="comment">/* assert(minRow<=maxRow); */</span></div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   <span class="keywordflow">if</span>(buffer.size()!=(maxRow-minRow+1)*(maxCol-minCol+1))</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     buffer.resize((maxRow-minRow+1)*(maxCol-minCol+1));</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   poBand->RasterIO(GF_Read,minCol,minRow,maxCol-minCol+1,maxRow-minRow+1,&(buffer[0]),(maxCol-minCol+1),(maxRow-minRow+1),dataType,0,0);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   <span class="keywordflow">if</span>(m_scale.size()>band||m_offset.size()>band){</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<buffer.size();++index)</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>       buffer[index]=theScale*buffer[index]+theOffset;</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   }</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span> }</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span> </div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span> <span class="comment">// template<typename T> void ImgReaderGdal::readDataBlock(vector<T>& buffer, const GDALDataType& dataType , int minCol, int maxCol, int minRow, int maxRow, int band) const</span></div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span> <span class="comment">//   assert(band<nrOfBand()+1);</span></div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span> <span class="comment">//   assert(minCol<nrOfCol());</span></div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span> <span class="comment">//   assert(minCol>=0);</span></div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span> <span class="comment">//   assert(maxCol<nrOfCol());</span></div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span> <span class="comment">//   assert(minCol<=maxCol);</span></div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span> <span class="comment">//   assert(minRow<nrOfRow());</span></div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span> <span class="comment">//   assert(minRow>=0);</span></div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span> <span class="comment">//   assert(maxRow<nrOfRow());</span></div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span> <span class="comment">//   assert(minRow<=maxRow);</span></div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span> <span class="comment">//   if(buffer.size()!=(maxRow-minRow+1)*(maxCol-minCol+1))</span></div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span> <span class="comment">//     buffer.resize((maxRow-minRow+1)*(maxCol-minCol+1));</span></div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span> <span class="comment">//   //fetch raster band</span></div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span> <span class="comment">//   GDALRasterBand  *poBand;</span></div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span> <span class="comment">//   assert(band<nrOfBand()+1);</span></div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span> <span class="comment">//   poBand = m_gds->GetRasterBand(band+1);//GDAL uses 1 based index</span></div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span> <span class="comment">//   for(int irow=0;irow<maxRow-minRow+1;++irow)</span></div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span> <span class="comment">//     poBand->RasterIO(GF_Read,minCol,minRow+irow,maxCol-minCol+1,1,&(buffer[irow*(maxCol-minCol+1)]),maxCol-minCol+1,1,dataType,0,0);</span></div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   </div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   readData(buffer,dataType,0,nrOfCol()-1,row,band);</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span> }</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span> </div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> ImgReaderGdal::readData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">double</span> row, <span class="keywordtype">int</span> band, RESAMPLE resample)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   readData(buffer,dataType,0,nrOfCol()-1,row,band,resample);</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span> }</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span> </div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span> </div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span> <span class="preprocessor">#endif // _IMGREADERGDAL_H_</span></div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span> <span class="preprocessor"></span></div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span> <span class="comment">//       //fetch raster band</span></div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span> <span class="comment">//   GDALRasterBand  *poBand;</span></div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span> <span class="comment">//   assert(band<nrOfBand()+1);</span></div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span> <span class="comment">//   poBand = m_gds->GetRasterBand(band+1);//GDAL uses 1 based index</span></div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span> <span class="comment">//   buffer.resize(maxCol-minCol+1);</span></div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span> <span class="comment">//   assert(minCol<nrOfCol());</span></div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span> <span class="comment">//   assert(row<nrOfRow());</span></div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span> <span class="comment">//   poBand->RasterIO(GF_Read,minCol,row,buffer.size(),1,&(buffer[0]),buffer.size(),1,GDT_Int16,0,0);</span></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
+<div class="ttc" id="classImgRasterGdal_html"><div class="ttname"><a href="classImgRasterGdal.html">ImgRasterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgRasterGdal_8h_source.html#l00035">ImgRasterGdal.h:35</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgReaderOgr_8cc_source.html b/doc/html/ImgReaderOgr_8cc_source.html
index 0229fb2..7497692 100644
--- a/doc/html/ImgReaderOgr_8cc_source.html
+++ b/doc/html/ImgReaderOgr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -102,374 +102,398 @@
 <div class="line"><a name="l00048"></a><span class="lineno">   48</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
 <div class="line"><a name="l00049"></a><span class="lineno">   49</span> <span class="keywordtype">void</span> ImgReaderOgr::close(<span class="keywordtype">void</span>)</div>
 <div class="line"><a name="l00050"></a><span class="lineno">   50</span> {</div>
-<div class="line"><a name="l00051"></a><span class="lineno">   51</span>   OGRDataSource::DestroyDataSource(m_datasource);</div>
-<div class="line"><a name="l00052"></a><span class="lineno">   52</span> }</div>
-<div class="line"><a name="l00053"></a><span class="lineno">   53</span> </div>
-<div class="line"><a name="l00054"></a><span class="lineno">   54</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
-<div class="line"><a name="l00055"></a><span class="lineno">   55</span> <span class="keywordtype">void</span> ImgReaderOgr::setCodec(<span class="keywordtype">void</span>){</div>
-<div class="line"><a name="l00056"></a><span class="lineno">   56</span>   <span class="comment">//register the drivers</span></div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>   OGRRegisterAll();</div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>   <span class="comment">//open the input OGR datasource. Datasources can be files, RDBMSes, directories full of files, or even remote web services depending on the driver being used. However, the datasource name is always a single string.</span></div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>   m_datasource = OGRSFDriverRegistrar::Open(m_filename.c_str(), FALSE);<span class="comment">//FAlSE: do not update</span></div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span>   <span class="keywordflow">if</span>( m_datasource == NULL ){</div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>     std::string errorString=<span class="stringliteral">"Open failed"</span>;</div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>   }</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span> }</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span> </div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span> <span class="keywordtype">bool</span> ImgReaderOgr::getExtent(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry, <span class="keywordtype">int</span> layer)</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span> {</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   OGREnvelope oExt;</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   <span class="keywordflow">if</span>(getLayer(layer)->GetExtent(&oExt,TRUE)==OGRERR_NONE){</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>     ulx=oExt.MinX;</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>     uly=oExt.MaxY;</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>     lrx=oExt.MaxX;</div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>     lry=oExt.MinY;</div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   }</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span> }</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span> </div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span> <span class="keywordtype">bool</span> ImgReaderOgr::getExtent(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry)</div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span> {</div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <span class="keywordtype">bool</span> success=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   OGREnvelope oExt;</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<getLayerCount();++ilayer){</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>     <span class="keywordflow">if</span>(getLayer(ilayer)->GetExtent(&oExt,TRUE)==OGRERR_NONE){</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>       <span class="keywordflow">if</span>(!ilayer){</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>     ulx=oExt.MinX;</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>     uly=oExt.MaxY;</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>     lrx=oExt.MaxX;</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>     lry=oExt.MinY;</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>       }</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>     <span class="keywordflow">if</span>(ulx>oExt.MinX)</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>       ulx=oExt.MinX;</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>     <span class="keywordflow">if</span>(uly<oExt.MaxY)</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>       uly=oExt.MaxY;</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>     <span class="keywordflow">if</span>(lrx<oExt.MaxX)</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>       lrx=oExt.MaxX;</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>     <span class="keywordflow">if</span>(lry>oExt.MinY)</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>       lry=oExt.MinY;</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>       }</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>       success=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     }</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>       success=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   }</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <span class="keywordflow">return</span> success;</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span> }</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span> </div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ImgReaderOgr::getFeatureCount(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <span class="keywordflow">return</span>(m_datasource->GetLayer(layer)->GetFeatureCount());</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span> }</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span> </div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span> <span class="keywordtype">int</span> ImgReaderOgr::getFieldCount(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <span class="keywordflow">if</span>(layer<0)</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     layer=m_datasource->GetLayerCount()-1;</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   }</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <span class="keywordflow">return</span>(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span> }</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span> </div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span> <span class="keywordtype">int</span> ImgReaderOgr::getFields(std::vector<std::string>& fields, <span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <span class="keywordflow">if</span>(layer<0)</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     layer=m_datasource->GetLayerCount()-1;</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   }</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   fields.clear();</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   fields.resize(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     fields[iField]=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   }</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <span class="keywordflow">return</span>(fields.size());</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span> }</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span> </div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span> <span class="keywordtype">int</span> ImgReaderOgr::getFields(std::vector<OGRFieldDefn*>& fields, <span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <span class="keywordflow">if</span>(layer<0)</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     layer=m_datasource->GetLayerCount()-1;</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   }</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   fields.clear();</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   fields.resize(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     fields[iField]=poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   }</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   assert(fields.size()==getFieldCount(layer));</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <span class="keywordflow">return</span>(fields.size());</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span> }</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span> </div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span> std::string ImgReaderOgr::getProjection(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <span class="keywordflow">if</span>(m_datasource->GetLayer(layer)->GetSpatialRef()){</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     <span class="keywordtype">char</span>* ppszResult;</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     m_datasource->GetLayer(layer)->GetSpatialRef()->exportToWkt(&ppszResult);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     <span class="keywordflow">return</span>(ppszResult);</div>
+<div class="line"><a name="l00051"></a><span class="lineno">   51</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00052"></a><span class="lineno">   52</span> <span class="preprocessor"></span>  OGRDataSource::DestroyDataSource(m_datasource);</div>
+<div class="line"><a name="l00053"></a><span class="lineno">   53</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00054"></a><span class="lineno">   54</span> <span class="preprocessor"></span>  GDALClose(m_datasource);</div>
+<div class="line"><a name="l00055"></a><span class="lineno">   55</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span> <span class="preprocessor"></span>}</div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span> </div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span> <span class="keywordtype">void</span> ImgReaderOgr::setCodec(<span class="keywordtype">void</span>){</div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span> <span class="preprocessor"></span>  <span class="comment">//register the drivers</span></div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>   OGRRegisterAll();</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>   <span class="comment">//open the input OGR datasource. Datasources can be files, RDBMSes, directories full of files, or even remote web services depending on the driver being used. However, the datasource name is always a single string.</span></div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>   m_datasource = OGRSFDriverRegistrar::Open(m_filename.c_str(), FALSE);<span class="comment">//FAlSE: do not update</span></div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span> <span class="preprocessor"></span>  <span class="comment">//register the drivers</span></div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>   GDALAllRegister();</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   <span class="comment">//open the input OGR datasource. Datasources can be files, RDBMSes, directories full of files, or even remote web services depending on the driver being used. However, the datasource name is always a single string.</span></div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   m_datasource = (GDALDataset*) GDALOpenEx(m_filename.c_str(), GDAL_OF_READONLY, NULL, NULL, NULL);</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span> <span class="preprocessor"></span>  <span class="keywordflow">if</span>( m_datasource == NULL ){</div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>     std::string errorString=<span class="stringliteral">"Open failed"</span>;</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   }</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span> }</div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span> </div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="keywordtype">bool</span> ImgReaderOgr::getExtent(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry, <span class="keywordtype">int</span> layer)</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span> {</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   OGREnvelope oExt;</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <span class="keywordflow">if</span>(getLayer(layer)->GetExtent(&oExt,TRUE)==OGRERR_NONE){</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>     ulx=oExt.MinX;</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>     uly=oExt.MaxY;</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>     lrx=oExt.MaxX;</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>     lry=oExt.MinY;</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   }</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span> }</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span> </div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span> <span class="keywordtype">bool</span> ImgReaderOgr::getExtent(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry)</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span> {</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <span class="keywordtype">bool</span> success=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   OGREnvelope oExt;</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<getLayerCount();++ilayer){</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>     <span class="keywordflow">if</span>(getLayer(ilayer)->GetExtent(&oExt,TRUE)==OGRERR_NONE){</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>       <span class="keywordflow">if</span>(!ilayer){</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>     ulx=oExt.MinX;</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>     uly=oExt.MaxY;</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>     lrx=oExt.MaxX;</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>     lry=oExt.MinY;</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>       }</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     <span class="keywordflow">if</span>(ulx>oExt.MinX)</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>       ulx=oExt.MinX;</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>     <span class="keywordflow">if</span>(uly<oExt.MaxY)</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>       uly=oExt.MaxY;</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>     <span class="keywordflow">if</span>(lrx<oExt.MaxX)</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>       lrx=oExt.MaxX;</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>     <span class="keywordflow">if</span>(lry>oExt.MinY)</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>       lry=oExt.MinY;</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>       }</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>       success=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>     }</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>       success=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   }</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <span class="keywordflow">return</span> success;</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span> }</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span> </div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ImgReaderOgr::getFeatureCount(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <span class="keywordflow">return</span>(m_datasource->GetLayer(layer)->GetFeatureCount());</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span> }</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span> </div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span> <span class="keywordtype">int</span> ImgReaderOgr::getFieldCount(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <span class="keywordflow">if</span>(layer<0)</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     layer=m_datasource->GetLayerCount()-1;</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   }</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <span class="keywordflow">return</span>(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span> }</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span> </div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span> <span class="keywordtype">int</span> ImgReaderOgr::getFields(std::vector<std::string>& fields, <span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <span class="keywordflow">if</span>(layer<0)</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     layer=m_datasource->GetLayerCount()-1;</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   }</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   fields.clear();</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   fields.resize(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     fields[iField]=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   }</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <span class="keywordflow">return</span>(fields.size());</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span> }</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span> </div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span> <span class="keywordtype">int</span> ImgReaderOgr::getFields(std::vector<OGRFieldDefn*>& fields, <span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <span class="keywordflow">if</span>(layer<0)</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     layer=m_datasource->GetLayerCount()-1;</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   }</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   fields.clear();</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   fields.resize(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     fields[iField]=poFDefn->GetFieldDefn(iField);</div>
 <div class="line"><a name="l00176"></a><span class="lineno">  176</span>   }</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   assert(fields.size()==getFieldCount(layer));</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keywordflow">return</span>(fields.size());</div>
 <div class="line"><a name="l00179"></a><span class="lineno">  179</span> }</div>
 <div class="line"><a name="l00180"></a><span class="lineno">  180</span> </div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span> OGRwkbGeometryType ImgReaderOgr::getGeometryType(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span> std::string ImgReaderOgr::getProjection(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
 <div class="line"><a name="l00182"></a><span class="lineno">  182</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="keywordflow">return</span> m_datasource->GetLayer(layer)->GetLayerDefn()->GetGeomType();</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span> }</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span> </div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span> std::ostream& operator<<(std::ostream& theOstream, <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a>& theImageReader){</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <span class="comment">//An OGRDataSource can potentially have many layers associated with it. The number of layers available can be queried with OGRDataSource::GetLayerCount() and individual layers fetched by index using OGRDataSource::GetLayer(). However, we wil just fetch the layer by name.</span></div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="comment">//todo: try to open and catch if failure...</span></div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="comment">// ofstream fpoints(filename.c_str(),ios::out);</span></div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span> </div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <span class="keywordtype">int</span> nlayerRead=theImageReader.getDataSource()->GetLayerCount();</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>       </div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nlayerRead;++ilayer){</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     OGRLayer *readLayer=theImageReader.getLayer(ilayer);</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     OGRFeatureDefn *poFDefn = readLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="keywordflow">if</span>(m_datasource->GetLayer(layer)->GetSpatialRef()){</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     <span class="keywordtype">char</span>* ppszResult;</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     m_datasource->GetLayer(layer)->GetSpatialRef()->exportToWkt(&ppszResult);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     <span class="keywordflow">return</span>(ppszResult);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   }</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span> }</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span> </div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span> OGRwkbGeometryType ImgReaderOgr::getGeometryType(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   <span class="keywordflow">return</span> m_datasource->GetLayer(layer)->GetLayerDefn()->GetGeomType();</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span> }</div>
 <div class="line"><a name="l00196"></a><span class="lineno">  196</span> </div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     theOstream << <span class="stringliteral">"#"</span>;</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     <span class="keywordtype">int</span> iField=0;</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>       OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>       std::string fieldname=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>       theOstream << fieldname << theImageReader.getFieldSeparator();</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     }</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     theOstream << std::endl;</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span> </div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     readLayer->ResetReading();</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   </div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     <span class="comment">//start reading features from the layer</span></div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     OGRFeature *poFeature;</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     <span class="keywordflow">while</span>( (poFeature = readLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>       OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>       poGeometry = poFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>       assert(poGeometry != NULL);</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>       <span class="keywordtype">double</span> x,y;</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>       <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     x=poPoint->getX();</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     y=poPoint->getY();</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>       }</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>       std::vector<std::string> vfields(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       std::string featurename;</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       std::vector<std::string>::iterator fit=vfields.begin();</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     *(fit++)=poFeature->GetFieldAsString(iField);</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>       }</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>       theOstream.precision(12);</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint)</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     theOstream << x << theImageReader.getFieldSeparator() << y;</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>       <span class="keywordflow">for</span>(fit=vfields.begin();fit!=vfields.end();++fit)</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     theOstream << theImageReader.getFieldSeparator() << *fit;</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       theOstream << std::endl;</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>       ++ifeature;</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     }</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   }</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="keywordflow">return</span>(theOstream);</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span> }</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span> </div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span> <span class="comment">// OGRLayer * ImgReaderOgr::executeSql(const std::string& output, const std::string& sqlStatement, OGRGeometry* spatialFilter)</span></div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span> <span class="comment">//   OGRLayer *poResultSet;</span></div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span> <span class="comment">//   poResultSet = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL );</span></div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span> </div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span> <span class="comment">//   if( poResultSet != NULL ){</span></div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span> <span class="comment">//     ImgWriterOgr imgWriter;</span></div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span> <span class="comment">//     imgWriter.open(output);</span></div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span> <span class="comment">//     imgWriter.copyLayer(poResultSet,output);</span></div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span> <span class="comment">//     m_datasource->ReleaseResultSet( poResultSet );</span></div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span> <span class="comment">//     imgWriter.close();</span></div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span> </div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ImgReaderOgr::readDataImageOgr(std::map<std::string,<a class="code" href="classVector2d.html">Vector2d<float></a> > &mapPixels, <span class="comment">//[classNr][pixelNr][bandNr],</span></div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>                         std::vector<std::string>& fields,</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>                         <span class="keyword">const</span> std::vector<unsigned short>& bands,</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>                         <span class="keyword">const</span> std::string& label,</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>                         <span class="keyword">const</span> std::vector<std::string>& layers,</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>                         <span class="keywordtype">int</span> verbose)</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span> {</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   mapPixels.clear();</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keywordtype">int</span> nsample=0;</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordtype">int</span> totalSamples=0;  </div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     std::cout << <span class="stringliteral">"reading OGR dataset "</span> << m_filename  << std::endl;</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<getLayerCount();++ilayer){</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     std::string currentLayername=getLayer(ilayer)->GetName();</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     <span class="keywordflow">if</span>(layers.size())</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>       <span class="keywordflow">if</span>(find(layers.begin(),layers.end(),currentLayername)==layers.end())</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>       <span class="comment">//only retain bands in fields</span></div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       getFields(fields,ilayer);</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>       std::vector<std::string>::iterator fit=fields.begin();</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>       <span class="keywordflow">if</span>(verbose>1)</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     std::cout << <span class="stringliteral">"reading fields: "</span>;</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>       <span class="keywordflow">while</span>(fit!=fields.end()){</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>       std::cout << *fit << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       <span class="comment">// size_t pos=(*fit).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ");</span></div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     <span class="keywordflow">if</span>((*fit).substr(0,1)==<span class="stringliteral">"B"</span>||(*fit).substr(0,1)==<span class="stringliteral">"b"</span>){</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>       <span class="keywordflow">if</span>((*fit).substr(1).find_first_not_of(<span class="stringliteral">"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ "</span>)!=std::string::npos){</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>         <span class="keywordtype">int</span> theBand=atoi((*fit).substr(1).c_str());</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>         <span class="keywordflow">if</span>(bands.size()){</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>           <span class="keywordtype">bool</span> validBand=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<bands.size();++iband){</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>         <span class="keywordflow">if</span>(theBand==bands[iband])</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>           validBand=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>           }</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>           <span class="keywordflow">if</span>(validBand)</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>         ++fit;</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>         fields.erase(fit);</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>         }</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>           ++fit;</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>       }</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>((*fit)==<span class="stringliteral">"B"</span> || (*fit)==<span class="stringliteral">"b"</span> || (*fit)==<span class="stringliteral">"Band"</span>)<span class="comment">//B is only band</span></div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>         ++fit;</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     }</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       fields.erase(fit);</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       }</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     std::cout << std::endl;</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     std::cout << <span class="stringliteral">"fields:"</span>;</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       <span class="keywordflow">for</span>(std::vector<std::string>::iterator fit=fields.begin();fit!=fields.end();++fit)</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     std::cout << <span class="stringliteral">" "</span> << *fit;</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       std::cout << std::endl;</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>       }</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       <span class="keywordflow">if</span>(!nband){</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>       std::cout << <span class="stringliteral">"reading data"</span> << std::endl;</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     nband=readData(mapPixels,OFTReal,fields,label,ilayer,<span class="keyword">true</span>,verbose==2);</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       }</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,<span class="keyword">true</span>,<span class="keyword">false</span>));</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>       }</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       nsample=getFeatureCount(ilayer);</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>       totalSamples+=nsample;</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span> std::ostream& operator<<(std::ostream& theOstream, <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a>& theImageReader){</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <span class="comment">//An OGRDataSource can potentially have many layers associated with it. The number of layers available can be queried with OGRDataSource::GetLayerCount() and individual layers fetched by index using OGRDataSource::GetLayer(). However, we wil just fetch the layer by name.</span></div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <span class="comment">//todo: try to open and catch if failure...</span></div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <span class="comment">// ofstream fpoints(filename.c_str(),ios::out);</span></div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span> </div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <span class="keywordtype">int</span> nlayerRead=theImageReader.getDataSource()->GetLayerCount();</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>       </div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nlayerRead;++ilayer){</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     OGRLayer *readLayer=theImageReader.getLayer(ilayer);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     OGRFeatureDefn *poFDefn = readLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span> </div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     theOstream << <span class="stringliteral">"#"</span>;</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="keywordtype">int</span> iField=0;</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>       std::string fieldname=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>       theOstream << fieldname << theImageReader.getFieldSeparator();</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     }</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     theOstream << std::endl;</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span> </div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     readLayer->ResetReading();</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   </div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     <span class="comment">//start reading features from the layer</span></div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     OGRFeature *poFeature;</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     <span class="keywordflow">while</span>( (poFeature = readLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       poGeometry = poFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>       assert(poGeometry != NULL);</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>       <span class="keywordtype">double</span> x,y;</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>       <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     x=poPoint->getX();</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     y=poPoint->getY();</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>       }</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       std::vector<std::string> vfields(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>       std::string featurename;</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>       std::vector<std::string>::iterator fit=vfields.begin();</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     *(fit++)=poFeature->GetFieldAsString(iField);</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>       }</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>       theOstream.precision(12);</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>       <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint)</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     theOstream << x << theImageReader.getFieldSeparator() << y;</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>       <span class="keywordflow">for</span>(fit=vfields.begin();fit!=vfields.end();++fit)</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     theOstream << theImageReader.getFieldSeparator() << *fit;</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>       theOstream << std::endl;</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>       ++ifeature;</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     }</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   }</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <span class="keywordflow">return</span>(theOstream);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span> }</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span> </div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span> <span class="comment">// OGRLayer * ImgReaderOgr::executeSql(const std::string& output, const std::string& sqlStatement, OGRGeometry* spatialFilter)</span></div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span> <span class="comment">//   OGRLayer *poResultSet;</span></div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span> <span class="comment">//   poResultSet = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL );</span></div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span> </div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span> <span class="comment">//   if( poResultSet != NULL ){</span></div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span> <span class="comment">//     ImgWriterOgr imgWriter;</span></div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span> <span class="comment">//     imgWriter.open(output);</span></div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span> <span class="comment">//     imgWriter.copyLayer(poResultSet,output);</span></div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span> <span class="comment">//     m_datasource->ReleaseResultSet( poResultSet );</span></div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span> <span class="comment">//     imgWriter.close();</span></div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span> </div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ImgReaderOgr::readDataImageOgr(std::map<std::string,<a class="code" href="classVector2d.html">Vector2d<float></a> > &mapPixels, <span class="comment">//[classNr][pixelNr][bandNr],</span></div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>                         std::vector<std::string>& fields,</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>                         <span class="keyword">const</span> std::vector<unsigned short>& bands,</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>                         <span class="keyword">const</span> std::string& label,</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>                         <span class="keyword">const</span> std::vector<std::string>& layers,</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>                         <span class="keywordtype">int</span> verbose)</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span> {</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   mapPixels.clear();</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <span class="keywordtype">int</span> nsample=0;</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <span class="keywordtype">int</span> totalSamples=0;  </div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     std::cout << <span class="stringliteral">"reading OGR dataset "</span> << m_filename  << std::endl;</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<getLayerCount();++ilayer){</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     std::string currentLayername=getLayer(ilayer)->GetName();</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     <span class="keywordflow">if</span>(layers.size())</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       <span class="keywordflow">if</span>(find(layers.begin(),layers.end(),currentLayername)==layers.end())</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       <span class="comment">//only retain bands in fields</span></div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>       getFields(fields,ilayer);</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       std::vector<std::string>::iterator fit=fields.begin();</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       <span class="keywordflow">if</span>(verbose>1)</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     std::cout << <span class="stringliteral">"reading fields: "</span>;</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       <span class="keywordflow">while</span>(fit!=fields.end()){</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>       std::cout << *fit << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>       <span class="comment">// size_t pos=(*fit).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ");</span></div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     <span class="keywordflow">if</span>((*fit).substr(0,1)==<span class="stringliteral">"B"</span>||(*fit).substr(0,1)==<span class="stringliteral">"b"</span>){</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>       <span class="comment">// if((*fit).substr(1).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){</span></div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>       std::size_t digits=(*fit).substr(1,1).find_first_of(<span class="stringliteral">"0123456789"</span>);</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>       std::size_t digite=(*fit).substr(1).find_first_not_of(<span class="stringliteral">"0123456789"</span>);</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>       <span class="keywordflow">if</span>((*fit)==<span class="stringliteral">"B"</span> || (*fit)==<span class="stringliteral">"b"</span> || (*fit)==<span class="stringliteral">"Band"</span>)<span class="comment">//B is only band</span></div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>         ++fit;</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(digits!=std::string::npos&&digite==std::string::npos){</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>         std::string digitString=(*fit).substr(digits);</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>         <span class="comment">// int theBand=atoi((*fit).substr(1).c_str());</span></div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>         <span class="keywordtype">int</span> theBand=atoi(digitString.c_str());</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>         <span class="keywordflow">if</span>(bands.size()){</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>           <span class="keywordtype">bool</span> validBand=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<bands.size();++iband){</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>         <span class="keywordflow">if</span>(theBand==bands[iband])</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>           validBand=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>           }</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>           <span class="keywordflow">if</span>(validBand)</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         ++fit;</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>         fields.erase(fit);</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>         }</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>           ++fit;</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       }</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>         fields.erase(fit);</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     }</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       fields.erase(fit);</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>       }</div>
 <div class="line"><a name="l00322"></a><span class="lineno">  322</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     std::cout << <span class="stringliteral">": "</span> << nsample << <span class="stringliteral">" samples read with "</span> << nband << <span class="stringliteral">" bands"</span> << std::endl;</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     }</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>       std::ostringstream estr;</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       estr << e << <span class="stringliteral">" "</span> << m_filename;</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       <span class="keywordflow">throw</span>(estr.str());</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     }</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   }</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     std::cout << <span class="stringliteral">"total number of samples read "</span> << totalSamples << std::endl;</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>   <span class="keywordflow">return</span> totalSamples;</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span> }</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span> </div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ImgReaderOgr::readDataImageOgr(std::map<std::string,<a class="code" href="classVector2d.html">Vector2d<float></a> > &mapPixels, <span class="comment">//[classNr][pixelNr][bandNr],</span></div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>                         std::vector<std::string>& fields,</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>                         <span class="keywordtype">double</span> start,</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>                         <span class="keywordtype">double</span> end,</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>                         <span class="keyword">const</span> std::string& label,</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>                         <span class="keyword">const</span> std::vector<std::string>& layers,</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>                         <span class="keywordtype">int</span> verbose)</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span> {</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   mapPixels.clear();</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>   <span class="keywordtype">int</span> nsample=0;</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   <span class="keywordtype">int</span> totalSamples=0;  </div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     std::cout << <span class="stringliteral">"reading OGR dataset file "</span> << m_filename  << std::endl;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<getLayerCount();++ilayer){</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     std::string currentLayername=getLayer(ilayer)->GetName();</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     <span class="keywordflow">if</span>(layers.size())</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       <span class="keywordflow">if</span>(find(layers.begin(),layers.end(),currentLayername)==layers.end())</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>       <span class="comment">//only retain bands in fields</span></div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>       getFields(fields,ilayer);</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       std::vector<std::string>::iterator fit=fields.begin();</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     std::cout << <span class="stringliteral">"reading fields: "</span>;</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       <span class="keywordflow">while</span>(fit!=fields.end()){</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       std::cout << *fit << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="comment">// size_t pos=(*fit).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ");</span></div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="keywordflow">if</span>((*fit).substr(0,1)==<span class="stringliteral">"B"</span>||(*fit).substr(0,1)==<span class="stringliteral">"b"</span>){</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       <span class="keywordflow">if</span>((*fit).substr(1).find_first_not_of(<span class="stringliteral">"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ "</span>)!=std::string::npos){</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>         <span class="keywordtype">int</span> iband=atoi((*fit).substr(1).c_str());</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>         <span class="keywordflow">if</span>((start||end)&&(iband<start||iband>end))</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>           fields.erase(fit);</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>           ++fit;</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>       }</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*fit==<span class="stringliteral">"B"</span> || *fit==<span class="stringliteral">"b"</span>|| *fit==<span class="stringliteral">"Band"</span>)</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>         ++fit;</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     }</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       fields.erase(fit);</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       }</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     std::cout << std::endl;</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     std::cout << <span class="stringliteral">"fields:"</span>;</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     <span class="keywordflow">for</span>(std::vector<std::string>::iterator fit=fields.begin();fit!=fields.end();++fit)</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       std::cout << <span class="stringliteral">" "</span> << *fit;</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     std::cout << std::endl;</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       }</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       <span class="keywordflow">if</span>(!nband){</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       std::cout << <span class="stringliteral">"reading data"</span> << std::endl;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     nband=readData(mapPixels,OFTReal,fields,label,ilayer,<span class="keyword">true</span>,verbose==2);</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       }</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,<span class="keyword">true</span>,<span class="keyword">false</span>));</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       }</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       nsample=getFeatureCount(ilayer);</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       totalSamples+=nsample;</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>     std::cout << <span class="stringliteral">": "</span> << nsample << <span class="stringliteral">" samples read with "</span> << nband << <span class="stringliteral">" bands"</span> << std::endl;</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     std::cout << std::endl;</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>       <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     std::cout << <span class="stringliteral">"fields:"</span>;</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>       <span class="keywordflow">for</span>(std::vector<std::string>::iterator fit=fields.begin();fit!=fields.end();++fit)</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     std::cout << <span class="stringliteral">" "</span> << *fit;</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       std::cout << std::endl;</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       }</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       <span class="keywordflow">if</span>(!nband){</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>       std::cout << <span class="stringliteral">"reading data"</span> << std::endl;</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     nband=readData(mapPixels,OFTReal,fields,label,ilayer,<span class="keyword">true</span>,verbose==2);</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       }</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,<span class="keyword">true</span>,<span class="keyword">false</span>));</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>       }</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>       nsample=getFeatureCount(ilayer);</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       totalSamples+=nsample;</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     std::cout << <span class="stringliteral">": "</span> << nsample << <span class="stringliteral">" samples read with "</span> << nband << <span class="stringliteral">" bands"</span> << std::endl;</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     }</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       std::ostringstream estr;</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       estr << e << <span class="stringliteral">" "</span> << m_filename;</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       <span class="keywordflow">throw</span>(estr.str());</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     }</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   }</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     std::cout << <span class="stringliteral">"total number of samples read "</span> << totalSamples << std::endl;</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   <span class="keywordflow">return</span> totalSamples;</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span> }</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span> </div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ImgReaderOgr::readDataImageOgr(std::map<std::string,<a class="code" href="classVector2d.html">Vector2d<float></a> > &mapPixels, <span class="comment">//[classNr][pixelNr][bandNr],</span></div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>                         std::vector<std::string>& fields,</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>                         <span class="keywordtype">double</span> start,</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>                         <span class="keywordtype">double</span> end,</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>                         <span class="keyword">const</span> std::string& label,</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>                         <span class="keyword">const</span> std::vector<std::string>& layers,</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>                         <span class="keywordtype">int</span> verbose)</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span> {</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>   mapPixels.clear();</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   <span class="keywordtype">int</span> nsample=0;</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   <span class="keywordtype">int</span> totalSamples=0;  </div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     std::cout << <span class="stringliteral">"reading OGR dataset file "</span> << m_filename  << std::endl;</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<getLayerCount();++ilayer){</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     std::string currentLayername=getLayer(ilayer)->GetName();</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     <span class="keywordflow">if</span>(layers.size())</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       <span class="keywordflow">if</span>(find(layers.begin(),layers.end(),currentLayername)==layers.end())</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       <span class="comment">//only retain bands in fields</span></div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       getFields(fields,ilayer);</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       std::vector<std::string>::iterator fit=fields.begin();</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     std::cout << <span class="stringliteral">"reading fields: "</span>;</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       <span class="keywordflow">while</span>(fit!=fields.end()){</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       std::cout << *fit << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordflow">if</span>((*fit).substr(0,1)==<span class="stringliteral">"B"</span>||(*fit).substr(0,1)==<span class="stringliteral">"b"</span>){</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       <span class="comment">// if((*fit).substr(1).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){</span></div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       std::size_t digits=(*fit).substr(1,1).find_first_of(<span class="stringliteral">"0123456789"</span>);</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       std::size_t digite=(*fit).substr(1).find_first_not_of(<span class="stringliteral">"0123456789"</span>);</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       <span class="keywordflow">if</span>(*fit==<span class="stringliteral">"B"</span> || *fit==<span class="stringliteral">"b"</span>|| *fit==<span class="stringliteral">"Band"</span>)</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>         ++fit;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(digits!=std::string::npos&&digite==std::string::npos){</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>         std::string digitString=(*fit).substr(digits);</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>         <span class="keywordtype">int</span> iband=atoi(digitString.c_str());</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>         <span class="comment">// int iband=atoi((*fit).substr(1).c_str());</span></div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>         <span class="keywordflow">if</span>((start||end)&&(iband<start||iband>end))</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>           fields.erase(fit);</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>           ++fit;</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       }</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>         fields.erase(fit);</div>
 <div class="line"><a name="l00399"></a><span class="lineno">  399</span>     }</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       std::ostringstream estr;</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       estr << e << <span class="stringliteral">" "</span> << m_filename;</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       <span class="keywordflow">throw</span>(estr.str());</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     }</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       std::cout << <span class="stringliteral">": "</span> << nsample << <span class="stringliteral">" samples read with "</span> << nband << <span class="stringliteral">" bands"</span> << std::endl;</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>   }</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     std::cout << <span class="stringliteral">"total number of samples read "</span> << totalSamples << std::endl;</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   <span class="keywordflow">return</span> totalSamples;</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span> }</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       fields.erase(fit);</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       }</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     std::cout << std::endl;</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     std::cout << <span class="stringliteral">"fields:"</span>;</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     <span class="keywordflow">for</span>(std::vector<std::string>::iterator fit=fields.begin();fit!=fields.end();++fit)</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       std::cout << <span class="stringliteral">" "</span> << *fit;</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     std::cout << std::endl;</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       }</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       <span class="keywordflow">if</span>(!nband){</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       std::cout << <span class="stringliteral">"reading data"</span> << std::endl;</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     nband=readData(mapPixels,OFTReal,fields,label,ilayer,<span class="keyword">true</span>,verbose==2);</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       }</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     assert(nband==readData(mapPixels,OFTReal,fields,label,ilayer,<span class="keyword">true</span>,<span class="keyword">false</span>));</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       }</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       nsample=getFeatureCount(ilayer);</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       totalSamples+=nsample;</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     std::cout << <span class="stringliteral">": "</span> << nsample << <span class="stringliteral">" samples read with "</span> << nband << <span class="stringliteral">" bands"</span> << std::endl;</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     }</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       std::ostringstream estr;</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       estr << e << <span class="stringliteral">" "</span> << m_filename;</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       <span class="keywordflow">throw</span>(estr.str());</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     }</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       std::cout << <span class="stringliteral">": "</span> << nsample << <span class="stringliteral">" samples read with "</span> << nband << <span class="stringliteral">" bands"</span> << std::endl;</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   }</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     std::cout << <span class="stringliteral">"total number of samples read "</span> << totalSamples << std::endl;</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   <span class="keywordflow">return</span> totalSamples;</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span> }</div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgReaderOgr_8h_source.html b/doc/html/ImgReaderOgr_8h_source.html
index fcc48ee..fab87ac 100644
--- a/doc/html/ImgReaderOgr_8h_source.html
+++ b/doc/html/ImgReaderOgr_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -127,890 +127,899 @@
 <div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <span class="comment">//  int getLayer(int layer=0) const;</span></div>
 <div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <span class="keywordtype">int</span> getFields(std::vector<std::string>& fields, <span class="keywordtype">int</span> layer=0) <span class="keyword">const</span>;</div>
 <div class="line"><a name="l00075"></a><span class="lineno">   75</span>   <span class="keywordtype">int</span> getFields(std::vector<OGRFieldDefn*>& fields, <span class="keywordtype">int</span> layer=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   OGRDataSource* getDataSource(<span class="keywordtype">void</span>) {<span class="keywordflow">return</span> m_datasource;};</div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   OGRSFDriver* getDriver(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_datasource->GetDriver();};</div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <span class="keywordtype">int</span> getLayerCount(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_datasource->GetLayerCount();};</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span> <span class="comment">//   OGRLayer *executeSql(const std::string& output,const std::string& sqlStatement, OGRGeometry* spatialFilter=NULL);</span></div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">int</span> readSql(<a class="code" href="classVector2d.html">Vector2d<T></a>& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</span> std::string& sqlStatement, OGRGeometry* spatialFilter=NULL,  [...]
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">int</span> readSql(std::map<<span class="keywordtype">int</span>,<a class="code" href="classVector2d.html">Vector2d<T></a> >& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</span> std::strin [...]
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <span class="keywordtype">bool</span> getExtent(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry, <span class="keywordtype">int</span> layer);</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <span class="keywordtype">bool</span> getExtent(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry);</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span> </div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <span class="keywordtype">void</span> setFieldSeparator(<span class="keyword">const</span> <span class="keywordtype">char</span> fs){ m_fs=fs;};</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <span class="keywordtype">char</span> getFieldSeparator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_fs;};</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <span class="keyword">friend</span> std::ostream& operator<<(std::ostream& theOstream, <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a>& theImageReader);</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   </div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span> <span class="keyword">protected</span>:</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <span class="keywordtype">void</span> setCodec(<span class="keywordtype">void</span>);</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span> </div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   std::string m_filename;</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   OGRDataSource *m_datasource;</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <span class="keywordtype">char</span> m_fs;</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span> };</div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="preprocessor"></span>  OGRDataSource* getDataSource(<span class="keywordtype">void</span>) {<span class="keywordflow">return</span> m_datasource;};</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   OGRSFDriver* getDriver(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_datasource->GetDriver();};</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span> <span class="preprocessor"></span>  GDALDataset* getDataSource(<span class="keywordtype">void</span>) {<span class="keywordflow">return</span> m_datasource;};</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   GDALDriver* getDriver(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_datasource->GetDriver();};</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span> <span class="preprocessor"></span>  <span class="keywordtype">int</span> getLayerCount(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_datasource->GetLayerCount();};</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span> <span class="comment">//   OGRLayer *executeSql(const std::string& output,const std::string& sqlStatement, OGRGeometry* spatialFilter=NULL);</span></div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">int</span> readSql(<a class="code" href="classVector2d.html">Vector2d<T></a>& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</span> std::string& sqlStatement, OGRGeometry* spatialFilter=NULL,  [...]
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">int</span> readSql(std::map<<span class="keywordtype">int</span>,<a class="code" href="classVector2d.html">Vector2d<T></a> >& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</span> std::strin [...]
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <span class="keywordtype">bool</span> getExtent(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry, <span class="keywordtype">int</span> layer);</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <span class="keywordtype">bool</span> getExtent(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry);</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span> </div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <span class="keywordtype">void</span> setFieldSeparator(<span class="keyword">const</span> <span class="keywordtype">char</span> fs){ m_fs=fs;};</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <span class="keywordtype">char</span> getFieldSeparator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_fs;};</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <span class="keyword">friend</span> std::ostream& operator<<(std::ostream& theOstream, <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a>& theImageReader);</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   </div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <span class="keywordtype">void</span> setCodec(<span class="keywordtype">void</span>);</div>
 <div class="line"><a name="l00096"></a><span class="lineno">   96</span> </div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span> <span class="comment">//read data from all features in a map, organized by classes</span></div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readData(std::map<<span class="keywordtype">int</span>,<a class="code" href="classVector2d.html">Vector2d<T></a> >& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</sp [...]
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span> {</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   poLayer = m_datasource->GetLayer(layer);</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <span class="keywordflow">if</span>(poLayer!=NULL){</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>     OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>     <span class="keywordflow">if</span>(fields.empty()){</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>       fields.resize(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>     }</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>     <span class="comment">//start reading features from the layer</span></div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>     OGRFeature *poFeature;</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>       std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>     poLayer->ResetReading();</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     <span class="keywordtype">int</span> posOffset=(pos)?2:0;</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>       std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     <span class="keywordtype">int</span> theClass=0;</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>       std::vector<T> theFeature;<span class="comment">//(fields.size()+posOffset);//x,y+selectedfields</span></div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>         std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>       OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>       poGeometry = poFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>       <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>         <span class="keywordflow">if</span>(poGeometry == NULL)</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>           std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>           std::cerr << <span class="stringliteral">"Warning: poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>       }</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>       assert(poGeometry != NULL );</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>              <span class="comment">// && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>       <span class="keywordflow">if</span>(pos){</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>         <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>           OGRPoint *poPoint;</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>           poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>           theFeature.push_back(poPoint->getX());</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>           theFeature.push_back(poPoint->getY());</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>         }</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>           OGRPoint thePoint;</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>           OGRPolygon * poPolygon = (OGRPolygon *) poGeometry;</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>           poPolygon->Centroid(&thePoint);</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>           theFeature.push_back(thePoint.getX());</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>           theFeature.push_back(thePoint.getY());</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>         }        </div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>           <span class="comment">//Centroid for non polygon geometry not supported until OGR 1.8.0, comment out if version < 1.8.0 is installed...";</span></div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>           OGRPoint thePoint;</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>           poGeometry->Centroid(&thePoint);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>           theFeature.push_back(thePoint.getX());</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>           theFeature.push_back(thePoint.getY());</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>         }       </div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>       }</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>       <span class="comment">// OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</span></div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>       std::string featurename;</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>         OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>         std::string fieldname=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>         <span class="keywordflow">if</span>(fieldname==label)</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>           theClass=poFeature->GetFieldAsInteger(iField);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>           <span class="keywordflow">switch</span>(fieldType){</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>           <span class="keywordflow">case</span>(OFTReal):</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>             }</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>               fields[iField]=fieldname;</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>             }</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>           <span class="keywordflow">case</span>(OFTInteger):</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>             }</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>               fields[iField]=fieldname;</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>             }</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>             {</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>               std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>               <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>             }</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>           }</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>         }</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>       }</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>       data[theClass].push_back(theFeature);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>       ++ifeature;</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>       ++ifeature;</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     }</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>       std::cout << <span class="stringliteral">"number of features read: "</span> << ifeature << std::endl << std::flush;</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     <span class="keyword">typename</span> std::map<int,Vector2d<T> >::const_iterator mit=data.begin();</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>       std::cout << <span class="stringliteral">"read classes: "</span> << std::flush;</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     <span class="keywordflow">while</span>(mit!=data.end()){</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>         std::cout << mit->first << <span class="stringliteral">" "</span> << std::flush;</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>       <span class="keywordflow">if</span>(!nband)</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>         nband=fields.size();</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       <span class="keywordflow">if</span>(pos)</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>         assert((mit->second)[0].size()==nband+2);</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>         assert((mit->second)[0].size()==nband);</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>       ++mit;</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     }</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>       std::cout << std::endl << std::flush;</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     <span class="keywordflow">return</span>(nband);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   }</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     std::ostringstream ess;</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   }</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span> }</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span> </div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span> <span class="comment">//read data from all features in a map, organized by class names</span></div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readData(std::map<std::string,<a class="code" href="classVector2d.html">Vector2d<T></a> >& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</span> std::string& labe [...]
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span> {</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   poLayer = m_datasource->GetLayer(layer);</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="keywordflow">if</span>(poLayer!=NULL){</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     assert(poFDefn!=NULL);</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span> </div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     <span class="keywordflow">if</span>(fields.empty()){</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>       fields.resize(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>         std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     }</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span> </div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     <span class="comment">//start reading features from the layer</span></div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     OGRFeature *poFeature;</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>       std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     poLayer->ResetReading();</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     <span class="keywordtype">int</span> posOffset=(pos)?2:0;</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>       std::cout << <span class="stringliteral">"going through features to fill in string map"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     std::string theClass;</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>       std::vector<T> theFeature;<span class="comment">//(fields.size()+posOffset);//x,y+selectedfields</span></div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>         std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>       OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>       poGeometry = poFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>       <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>         <span class="keywordflow">if</span>(poGeometry == NULL)</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>           std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>           std::cerr << <span class="stringliteral">"Warning: poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>       }</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>       assert(poGeometry != NULL );</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>              <span class="comment">// && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>       <span class="keywordflow">if</span>(pos){</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>         <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>           OGRPoint *poPoint;</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>           poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>           theFeature.push_back(poPoint->getX());</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>           theFeature.push_back(poPoint->getY());</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>         }</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>           OGRPoint thePoint;</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>           poGeometry->Centroid(&thePoint);</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>           theFeature.push_back(thePoint.getX());</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>           theFeature.push_back(thePoint.getY());</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>         }        </div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>           <span class="comment">//Centroid for non polygon geometry not supported until OGR 1.8.0, comment out if version < 1.8.0 is installed...";</span></div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>           OGRPoint thePoint;</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>           poGeometry->Centroid(&thePoint);</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>           theFeature.push_back(thePoint.getX());</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>           theFeature.push_back(thePoint.getY());</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>         }       </div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>       }</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>       <span class="comment">// OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();//got LayerDefn already...</span></div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>       std::string featurename;</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>         OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>         std::string fieldname=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>         <span class="keywordflow">if</span>(fieldname==label){</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>           theClass=poFeature->GetFieldAsString(iField);</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>           <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>             std::cout << <span class="stringliteral">"read feature for "</span> << theClass << std::endl;</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>         }</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>           <span class="keywordflow">switch</span>(fieldType){</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>           <span class="keywordflow">case</span>(OFTReal):</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>             }</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>               fields[iField]=fieldname;</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>             }</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>           <span class="keywordflow">case</span>(OFTInteger):</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>             }</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>               fields[iField]=fieldname;</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>             }</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>             {</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>               std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>               <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>             }</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>           }</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>         }</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>         assert(poFDefn!=NULL);</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>       }</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>       data[theClass].push_back(theFeature);</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       ++ifeature;</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     }</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>       std::cout << <span class="stringliteral">"number of features read: "</span> << ifeature << std::endl << std::flush;</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     <span class="keyword">typename</span> std::map<std::string,Vector2d<T> >::const_iterator mit=data.begin();</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       std::cout << <span class="stringliteral">"read classes: "</span> << std::flush;</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     <span class="keywordflow">while</span>(mit!=data.end()){</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>         std::cout << mit->first << <span class="stringliteral">" "</span> << std::flush;</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       <span class="keywordflow">if</span>(!nband)</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>         nband=fields.size();</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       <span class="keywordflow">if</span>(pos)</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>         assert((mit->second)[0].size()==nband+2);</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>         assert((mit->second)[0].size()==nband);</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       ++mit;</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     }</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       std::cout << std::endl << std::flush;</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>     <span class="keywordflow">return</span>(nband);</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   }</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     std::ostringstream ess;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   }</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span> }</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span> </div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span> <span class="comment">//read x positions</span></div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readXY(std::vector<T>& xVector, std::vector<T>& yVector, <span class="keywordtype">int</span> layer, <span class="keywordtype">bool</span> verbose){</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   poLayer = m_datasource->GetLayer(layer);</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   <span class="comment">//start reading features from the layer</span></div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>   OGRFeature *poFeature;</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   poLayer->ResetReading();</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     poGeometry = poFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       <span class="keywordflow">if</span>(poGeometry == NULL)</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>         std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       <span class="keywordflow">else</span><span class="comment">// if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</span></div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>         std::cout << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     }</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="comment">// assert(poGeometry != NULL </span></div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="comment">//        && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     xVector.push_back(poPoint->getX());</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     yVector.push_back(poPoint->getY());</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     ++ifeature;</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>   }</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   assert(xVector.size()==yVector.size());</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   <span class="keywordflow">if</span>(xVector.size()){</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="keywordflow">return</span> xVector.size();</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   }</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     std::ostringstream ess;</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   std::string m_filename;</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span> <span class="preprocessor"></span>  OGRDataSource *m_datasource;</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span> <span class="preprocessor"></span>  GDALDataset *m_datasource;</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span> <span class="preprocessor"></span>  <span class="keywordtype">char</span> m_fs;</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span> };</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span> </div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span> <span class="comment">//read data from all features in a map, organized by classes</span></div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readData(std::map<<span class="keywordtype">int</span>,<a class="code" href="classVector2d.html">Vector2d<T></a> >& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</sp [...]
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span> {</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   poLayer = m_datasource->GetLayer(layer);</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <span class="keywordflow">if</span>(poLayer!=NULL){</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>     OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>     <span class="keywordflow">if</span>(fields.empty()){</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>       fields.resize(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>         std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     }</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     <span class="comment">//start reading features from the layer</span></div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     OGRFeature *poFeature;</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>       std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     poLayer->ResetReading();</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     <span class="keywordtype">int</span> posOffset=(pos)?2:0;</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>       std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     <span class="keywordtype">int</span> theClass=0;</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>       std::vector<T> theFeature;<span class="comment">//(fields.size()+posOffset);//x,y+selectedfields</span></div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>         std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>       OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>       poGeometry = poFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>       <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>         <span class="keywordflow">if</span>(poGeometry == NULL)</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>           std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>           std::cerr << <span class="stringliteral">"Warning: poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>       }</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>       assert(poGeometry != NULL );</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>              <span class="comment">// && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>       <span class="keywordflow">if</span>(pos){</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>         <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>           OGRPoint *poPoint;</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>           poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>           theFeature.push_back(poPoint->getX());</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>           theFeature.push_back(poPoint->getY());</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>         }</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>           OGRPoint thePoint;</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>           OGRPolygon * poPolygon = (OGRPolygon *) poGeometry;</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>           poPolygon->Centroid(&thePoint);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>           theFeature.push_back(thePoint.getX());</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>           theFeature.push_back(thePoint.getY());</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>         }        </div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>           <span class="comment">//Centroid for non polygon geometry not supported until OGR 1.8.0, comment out if version < 1.8.0 is installed...";</span></div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>           OGRPoint thePoint;</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>           poGeometry->Centroid(&thePoint);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>           theFeature.push_back(thePoint.getX());</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>           theFeature.push_back(thePoint.getY());</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>         }       </div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>       }</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>       <span class="comment">// OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</span></div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>       std::string featurename;</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>         OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>         std::string fieldname=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>         <span class="keywordflow">if</span>(fieldname==label)</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>           theClass=poFeature->GetFieldAsInteger(iField);</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>           <span class="keywordflow">switch</span>(fieldType){</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>           <span class="keywordflow">case</span>(OFTReal):</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>             }</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>               fields[iField]=fieldname;</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>             }</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>           <span class="keywordflow">case</span>(OFTInteger):</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>             }</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>               fields[iField]=fieldname;</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>             }</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>             {</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>               std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>               <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>             }</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>           }</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>         }</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>       }</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>       data[theClass].push_back(theFeature);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>       ++ifeature;</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>       ++ifeature;</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     }</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>       std::cout << <span class="stringliteral">"number of features read: "</span> << ifeature << std::endl << std::flush;</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     <span class="keyword">typename</span> std::map<int,Vector2d<T> >::const_iterator mit=data.begin();</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>       std::cout << <span class="stringliteral">"read classes: "</span> << std::flush;</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     <span class="keywordflow">while</span>(mit!=data.end()){</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>         std::cout << mit->first << <span class="stringliteral">" "</span> << std::flush;</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>       <span class="keywordflow">if</span>(!nband)</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>         nband=fields.size();</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>       <span class="keywordflow">if</span>(pos)</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>         assert((mit->second)[0].size()==nband+2);</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>         assert((mit->second)[0].size()==nband);</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       ++mit;</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     }</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>       std::cout << std::endl << std::flush;</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     <span class="keywordflow">return</span>(nband);</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   }</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     std::ostringstream ess;</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   }</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span> }</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span> </div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span> <span class="comment">//read data from all features in a map, organized by class names</span></div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readData(std::map<std::string,<a class="code" href="classVector2d.html">Vector2d<T></a> >& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</span> std::string& labe [...]
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span> {</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   poLayer = m_datasource->GetLayer(layer);</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordflow">if</span>(poLayer!=NULL){</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     assert(poFDefn!=NULL);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span> </div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordflow">if</span>(fields.empty()){</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>       fields.resize(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>         std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     }</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span> </div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     <span class="comment">//start reading features from the layer</span></div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     OGRFeature *poFeature;</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>       std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     poLayer->ResetReading();</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     <span class="keywordtype">int</span> posOffset=(pos)?2:0;</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>       std::cout << <span class="stringliteral">"going through features to fill in string map"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     std::string theClass;</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>       std::vector<T> theFeature;<span class="comment">//(fields.size()+posOffset);//x,y+selectedfields</span></div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>         std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>       OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>       poGeometry = poFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>       <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>         <span class="keywordflow">if</span>(poGeometry == NULL)</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>           std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>           std::cerr << <span class="stringliteral">"Warning: poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       }</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>       assert(poGeometry != NULL );</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>              <span class="comment">// && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>       <span class="keywordflow">if</span>(pos){</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>         <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>           OGRPoint *poPoint;</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>           poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>           theFeature.push_back(poPoint->getX());</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>           theFeature.push_back(poPoint->getY());</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>         }</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>           OGRPoint thePoint;</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>           poGeometry->Centroid(&thePoint);</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>           theFeature.push_back(thePoint.getX());</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>           theFeature.push_back(thePoint.getY());</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>         }        </div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>           <span class="comment">//Centroid for non polygon geometry not supported until OGR 1.8.0, comment out if version < 1.8.0 is installed...";</span></div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>           OGRPoint thePoint;</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>           poGeometry->Centroid(&thePoint);</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>           theFeature.push_back(thePoint.getX());</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>           theFeature.push_back(thePoint.getY());</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>         }       </div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>       }</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       <span class="comment">// OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();//got LayerDefn already...</span></div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       std::string featurename;</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>         OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>         std::string fieldname=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>         <span class="keywordflow">if</span>(fieldname==label){</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>           theClass=poFeature->GetFieldAsString(iField);</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>           <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>             std::cout << <span class="stringliteral">"read feature for "</span> << theClass << std::endl;</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         }</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>           <span class="keywordflow">switch</span>(fieldType){</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>           <span class="keywordflow">case</span>(OFTReal):</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>             }</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>               fields[iField]=fieldname;</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>             }</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>           <span class="keywordflow">case</span>(OFTInteger):</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>             }</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>               fields[iField]=fieldname;</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>             }</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>             {</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>               std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>               <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>             }</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>           }</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>         }</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>         assert(poFDefn!=NULL);</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       }</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       data[theClass].push_back(theFeature);</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       ++ifeature;</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     }</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       std::cout << <span class="stringliteral">"number of features read: "</span> << ifeature << std::endl << std::flush;</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     <span class="keyword">typename</span> std::map<std::string,Vector2d<T> >::const_iterator mit=data.begin();</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       std::cout << <span class="stringliteral">"read classes: "</span> << std::flush;</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     <span class="keywordflow">while</span>(mit!=data.end()){</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>         std::cout << mit->first << <span class="stringliteral">" "</span> << std::flush;</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       <span class="keywordflow">if</span>(!nband)</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>         nband=fields.size();</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>       <span class="keywordflow">if</span>(pos)</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>         assert((mit->second)[0].size()==nband+2);</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>         assert((mit->second)[0].size()==nband);</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       ++mit;</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     }</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       std::cout << std::endl << std::flush;</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="keywordflow">return</span>(nband);</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   }</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     std::ostringstream ess;</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   }</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span> }</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span> </div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span> <span class="comment">//read x positions</span></div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readXY(std::vector<T>& xVector, std::vector<T>& yVector, <span class="keywordtype">int</span> layer, <span class="keywordtype">bool</span> verbose){</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   poLayer = m_datasource->GetLayer(layer);</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>   <span class="comment">//start reading features from the layer</span></div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   OGRFeature *poFeature;</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>   poLayer->ResetReading();</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>   <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     poGeometry = poFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       <span class="keywordflow">if</span>(poGeometry == NULL)</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>         std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       <span class="keywordflow">else</span><span class="comment">// if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</span></div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>         std::cout << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl;</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     }</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="comment">// assert(poGeometry != NULL </span></div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>     <span class="comment">//        && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     xVector.push_back(poPoint->getX());</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     yVector.push_back(poPoint->getY());</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     ++ifeature;</div>
 <div class="line"><a name="l00406"></a><span class="lineno">  406</span>   }</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span> }</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span> </div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span> <span class="comment">//read data from a single feature</span></div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readData(std::vector<T>& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, OGRFeature *poFeature, <span class="keywordtype">int</span> layer, <span class="keywordtype">bool</span> pos, <span class="keywo [...]
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span> {</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>   poLayer = m_datasource->GetLayer(layer);</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>   <span class="keywordflow">if</span>(fields.empty()){</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     fields.resize(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>   }</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>   OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>   poGeometry = poFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>   <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     <span class="keywordflow">if</span>(poGeometry == NULL)</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       std::cerr << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   }</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   assert(poGeometry != NULL);</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>          <span class="comment">// && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   <span class="keywordflow">if</span>(pos){</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>     <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>       OGRPoint *poPoint;</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>       poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       data.push_back(poPoint->getX());</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       data.push_back(poPoint->getY());</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     }</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       OGRPoint thePoint;</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       poGeometry->Centroid(&thePoint);</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       data.push_back(thePoint.getX());</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       data.push_back(thePoint.getY());</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     }        </div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="comment">//Centroid for non polygon geometry not supported until OGR 1.8.0, comment out if version < 1.8.0 is installed...";</span></div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       OGRPoint thePoint;</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       poGeometry->Centroid(&thePoint);</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       data.push_back(thePoint.getX());</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       data.push_back(thePoint.getY());</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     }       </div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span> </div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>   }</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>   std::string featurename;</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>     std::string fieldname=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     <span class="keywordflow">switch</span>(fieldType){</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     <span class="keywordflow">case</span>(OFTReal):</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>       <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>         <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>           data.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       }</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>         fields[iField]=fieldname;</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         data.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       }</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">case</span>(OFTInteger):</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>         <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>           data.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       }</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         fields[iField]=fieldname;</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>         data.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       }</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       {</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>         <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       }</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     }</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>   }</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>   <span class="comment">//   assert(data.size()==ifeature);</span></div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>   <span class="keywordflow">if</span>(data.size()){</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     <span class="keywordflow">if</span>(pos)</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       assert(data.size()==fields.size()+2);</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       assert(data.size()==fields.size());</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     <span class="keywordflow">return</span> fields.size();</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>   }</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     std::ostringstream ess;</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>   }</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span> }</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span> </div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span> <span class="comment">//read one field from all features</span></div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keyword">inline</span> <span class="keywordtype">int</span> ImgReaderOgr::readData(std::vector<T>& data, <span class="keyword">const</span> OGRFieldType& fieldType, <span class="keyword">const</span> std::string& theField, <span class="keywordtype">int</span> layer, <span class="keywordtype">bool [...]
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span> {</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   poLayer = m_datasource->GetLayer(layer);</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   <span class="keywordtype">int</span> nfield=(theField!=<span class="stringliteral">""</span>)? poFDefn->GetFieldCount() : 1;</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>   <span class="keywordflow">if</span>(theField==<span class="stringliteral">""</span>){</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     <span class="comment">//read first field available </span></div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       std::cout << <span class="stringliteral">"read first field from total of "</span> << nfield << std::endl;</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   }</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span> </div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="comment">//start reading features from the layer</span></div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   OGRFeature *poFeature;</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   poLayer->ResetReading();</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>   <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     <span class="comment">// std::vector<T> theFeature;//(fields.size()+posOffset);//x,y+selectedfields</span></div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     T theFeature;</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     poGeometry = poFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>     <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       <span class="keywordflow">if</span>(poGeometry == NULL)</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordflow">else</span><span class="comment">// if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</span></div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>         std::cout << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl;</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     }</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     <span class="comment">// assert(poGeometry != NULL </span></div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     <span class="comment">//        && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span> </div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<nfield;++iField){</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       std::string fieldname=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       <span class="keywordflow">if</span>(fieldname!=theField)</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordflow">switch</span>(fieldType){</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       <span class="keywordflow">case</span>(OFTInteger):</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       <span class="keywordflow">case</span>(OFTReal):</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>         theFeature=poFeature->GetFieldAsDouble(iField);</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>         {</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>           std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>           <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>         }</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       }</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     }</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     data.push_back(theFeature);</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       std::cout << <span class="stringliteral">"feature is: "</span> << theFeature << std::endl;</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     ++ifeature;</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   }</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   <span class="keywordflow">if</span>(data.size()){</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     <span class="keywordflow">return</span> data.size();</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>   }</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     std::ostringstream ess;</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   }</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span> }</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span> </div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span> <span class="comment">//specialization for string: read one field from all features</span></div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span> <span class="keyword">template</span> <> <span class="keyword">inline</span> <span class="keywordtype">int</span> ImgReaderOgr::readData(std::vector<std::string>& data, <span class="keyword">const</span> OGRFieldType& fieldType, <span class="keyword">const</span> std::string& theField, <span class="keywordtype">int</span> layer, <span class="keywordtype">bool</span> verbose)</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span> {</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>   poLayer = m_datasource->GetLayer(layer);</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   <span class="keywordtype">int</span> nfield=(theField!=<span class="stringliteral">""</span>)? poFDefn->GetFieldCount() : 1;</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>   <span class="keywordflow">if</span>(theField==<span class="stringliteral">""</span>){</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     <span class="comment">//read first field available </span></div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       std::cout << <span class="stringliteral">"read first field from total of "</span> << nfield << std::endl;</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   }</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span> </div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   <span class="comment">//start reading features from the layer</span></div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   OGRFeature *poFeature;</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>     std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>   poLayer->ResetReading();</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>     std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>   <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     std::string theFeature;</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     poGeometry = poFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="keywordflow">if</span>(poGeometry == NULL)</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>         std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordflow">else</span><span class="comment">// if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</span></div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         std::cout << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl;</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     }</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     <span class="comment">// assert(poGeometry != NULL </span></div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     <span class="comment">//        && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span> </div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<nfield;++iField){</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       std::string fieldname=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       <span class="keywordflow">if</span>(fieldname!=theField)</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       <span class="keywordflow">switch</span>(fieldType){</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       <span class="keywordflow">case</span>(OFTInteger):</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       <span class="keywordflow">case</span>(OFTReal):</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       <span class="keywordflow">case</span>(OFTString):</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>         theFeature=poFeature->GetFieldAsString(iField);</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>         {</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>           std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>           <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         }</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       }</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     }</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     data.push_back(theFeature);</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       std::cout << <span class="stringliteral">"feature is: "</span> << theFeature << std::endl;</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     ++ifeature;</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   }</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   <span class="keywordflow">if</span>(data.size()){</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>     <span class="keywordflow">return</span> data.size();</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>   }</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     std::ostringstream ess;</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   }</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span> }</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span> </div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span> <span class="comment">//read data from all features  </span></div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readData(<a class="code" href="classVector2d.html">Vector2d<T></a>& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keywordtype">int</span> layer, <span class="keywordtype">bool</span> pos [...]
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span> {</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>   poLayer = m_datasource->GetLayer(layer);</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   <span class="keywordflow">if</span>(fields.empty()){</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     fields.resize(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>       std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   }</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   <span class="comment">//start reading features from the layer</span></div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   OGRFeature *poFeature;</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   poLayer->ResetReading();</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>   <span class="keywordtype">int</span> posOffset=(pos)?2:0;</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     std::vector<T> theFeature;<span class="comment">//(fields.size()+posOffset);//x,y+selectedfields</span></div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     poGeometry = poFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>       <span class="keywordflow">if</span>(poGeometry == NULL)</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>         std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>         std::cerr << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     }</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     assert(poGeometry != NULL </div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>            && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     <span class="keywordflow">if</span>(pos){</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       theFeature.push_back(poPoint->getX());</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       theFeature.push_back(poPoint->getY());</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     }</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     std::string featurename;</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       std::string fieldname=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       <span class="keywordflow">switch</span>(fieldType){</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       <span class="keywordflow">case</span>(OFTReal):</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>         <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>           <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>             theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>         }</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>           fields[iField]=fieldname;</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>           theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>         }</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       <span class="keywordflow">case</span>(OFTInteger):</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>         <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>           <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>             theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>         }</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>           fields[iField]=fieldname;</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>           theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>         }</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>         {</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>           std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>           <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>         }</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>       }</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>     }</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     data.push_back(theFeature);</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     ++ifeature;</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>   }</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span> <span class="comment">//   assert(data.size()==ifeature);</span></div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>   <span class="keywordflow">if</span>(data.size()){</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="keywordflow">if</span>(pos)</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       assert(data[0].size()==fields.size()+2);</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       assert(data[0].size()==fields.size());</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     <span class="keywordflow">return</span> fields.size();</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>   }</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>     std::ostringstream ess;</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>   }</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span> }</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span> </div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readSql(std::map<<span class="keywordtype">int</span>, <a class="code" href="classVector2d.html">Vector2d<T></a> >& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</spa [...]
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span> {</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>   OGRLayer *poLayer;</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>   poLayer = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL );</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>   <span class="keywordflow">if</span>(poLayer!=NULL){</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>     <span class="keywordflow">if</span>(fields.empty()){</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       fields.resize(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>         std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>     }</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     <span class="comment">//start reading features from the layer</span></div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>     OGRFeature *poFeature;</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>       std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>     poLayer->ResetReading();</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>     <span class="keywordtype">int</span> posOffset=(pos)?2:0;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     <span class="keywordtype">int</span> theClass=0;</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>       std::vector<T> theFeature;<span class="comment">//(fields.size()+posOffset);//x,y+selectedfields</span></div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>         std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       poGeometry = poFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>         <span class="keywordflow">if</span>(poGeometry == NULL)</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>           std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>           std::cerr << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       }</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       assert(poGeometry != NULL </div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>              && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       <span class="keywordflow">if</span>(pos){</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>         theFeature.push_back(poPoint->getX());</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>         theFeature.push_back(poPoint->getY());</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       }</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>       std::string featurename;</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>         OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>         std::string fieldname=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>         <span class="keywordflow">if</span>(fieldname==label)</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>           theClass=poFeature->GetFieldAsInteger(iField);</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>           <span class="keywordflow">switch</span>(fieldType){</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>           <span class="keywordflow">case</span>(OFTReal):</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>             }</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>               fields[iField]=fieldname;</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>             }</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>           <span class="keywordflow">case</span>(OFTInteger):</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>             }</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>               fields[iField]=fieldname;</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>             }</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>             {</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>               std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>               <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>             }</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>           }</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         }</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       }</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       data[theClass].push_back(theFeature);</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>       ++ifeature;</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     }</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       std::cout << <span class="stringliteral">"number of features read: "</span> << ifeature << std::endl << std::flush;</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     <span class="keyword">typename</span> std::map<int,Vector2d<T> >::const_iterator mit=data.begin();</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>     <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       std::cout << <span class="stringliteral">"read classes: "</span> << std::flush;</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>     <span class="keywordflow">while</span>(mit!=data.end()){</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>         std::cout << mit->first << <span class="stringliteral">" "</span> << std::flush;</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>       <span class="keywordflow">if</span>(!nband)</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>         nband=fields.size();</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>       <span class="keywordflow">if</span>(pos)</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>         assert((mit->second)[0].size()==nband+2);</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         assert((mit->second)[0].size()==nband);</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>       ++mit;</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     }</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       std::cout << std::endl << std::flush;</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     <span class="keywordflow">return</span>(nband);</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>   }</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     std::ostringstream ess;</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>   }</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span> }</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span> </div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readSql(<a class="code" href="classVector2d.html">Vector2d<T></a>& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</span> std::string& sqlStatement, OGRGeometry* spatialF [...]
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span> {</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>   OGRLayer *poLayer;</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>   poLayer = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL );</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>   <span class="keywordflow">if</span>(poLayer!=NULL){</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>     OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>     <span class="keywordflow">if</span>(fields.empty()){</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       fields.resize(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>         std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>     }</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>     <span class="comment">//start reading features from the layer</span></div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>     OGRFeature *poFeature;</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>     poLayer->ResetReading();</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     <span class="keywordtype">int</span> posOffset=(pos)?2:0;</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>     <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>       std::vector<T> theFeature;<span class="comment">//(fields.size()+posOffset);//x,y+selectedfields</span></div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>         std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>       poGeometry = poFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>         <span class="keywordflow">if</span>(poGeometry == NULL)</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>           std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>           std::cerr << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>       }</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       assert(poGeometry != NULL </div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>              && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>       <span class="keywordflow">if</span>(pos){</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>         theFeature.push_back(poPoint->getX());</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>         theFeature.push_back(poPoint->getY());</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>       }</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>       OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>       std::string featurename;</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>         OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>         std::string fieldname=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>         <span class="keywordflow">switch</span>(fieldType){</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>         <span class="keywordflow">case</span>(OFTReal):</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>           <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>             <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>           }</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>             fields[iField]=fieldname;</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>             theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>           }</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>         <span class="keywordflow">case</span>(OFTInteger):</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>           <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>             <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>           }</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>             fields[iField]=fieldname;</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>             theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>           }</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>           {</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>             std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>             <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>           }</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>         }</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       }</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       data.push_back(theFeature);</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       ++ifeature;</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     }</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>     m_datasource->ReleaseResultSet( poLayer );</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     <span class="comment">//   assert(data.size()==ifeature);</span></div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>     <span class="keywordflow">if</span>(data.size()){</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       <span class="keywordflow">if</span>(pos)</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>         assert(data[0].size()==fields.size()+2);</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>         assert(data[0].size()==fields.size());</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       <span class="keywordflow">return</span> fields.size();</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>   assert(xVector.size()==yVector.size());</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>   <span class="keywordflow">if</span>(xVector.size()){</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     <span class="keywordflow">return</span> xVector.size();</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   }</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     std::ostringstream ess;</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>   }</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span> }</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span> </div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span> <span class="comment">//read data from a single feature</span></div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readData(std::vector<T>& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, OGRFeature *poFeature, <span class="keywordtype">int</span> layer, <span class="keywordtype">bool</span> pos, <span class="keywo [...]
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span> {</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>   poLayer = m_datasource->GetLayer(layer);</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>   <span class="keywordflow">if</span>(fields.empty()){</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     fields.resize(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   }</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   poGeometry = poFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>     <span class="keywordflow">if</span>(poGeometry == NULL)</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>       std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       std::cerr << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   }</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>   assert(poGeometry != NULL);</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>          <span class="comment">// && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>   OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>   <span class="keywordflow">if</span>(pos){</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint){</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       OGRPoint *poPoint;</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       data.push_back(poPoint->getX());</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       data.push_back(poPoint->getY());</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     }</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       OGRPoint thePoint;</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       poGeometry->Centroid(&thePoint);</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       data.push_back(thePoint.getX());</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       data.push_back(thePoint.getY());</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     }        </div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       <span class="comment">//Centroid for non polygon geometry not supported until OGR 1.8.0, comment out if version < 1.8.0 is installed...";</span></div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       OGRPoint thePoint;</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       poGeometry->Centroid(&thePoint);</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       data.push_back(thePoint.getX());</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       data.push_back(thePoint.getY());</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     }       </div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span> </div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>   }</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>   std::string featurename;</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>     OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>     std::string fieldname=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>     <span class="keywordflow">switch</span>(fieldType){</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     <span class="keywordflow">case</span>(OFTReal):</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>         <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>           data.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       }</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         fields[iField]=fieldname;</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         data.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       }</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     <span class="keywordflow">case</span>(OFTInteger):</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>           data.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       }</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         fields[iField]=fieldname;</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         data.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       }</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       {</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>         std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       }</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     }</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>   }</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>   <span class="comment">//   assert(data.size()==ifeature);</span></div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>   <span class="keywordflow">if</span>(data.size()){</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     <span class="keywordflow">if</span>(pos)</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       assert(data.size()==fields.size()+2);</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       assert(data.size()==fields.size());</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     <span class="keywordflow">return</span> fields.size();</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>   }</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>     std::ostringstream ess;</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   }</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span> }</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span> </div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span> <span class="comment">//read one field from all features</span></div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keyword">inline</span> <span class="keywordtype">int</span> ImgReaderOgr::readData(std::vector<T>& data, <span class="keyword">const</span> OGRFieldType& fieldType, <span class="keyword">const</span> std::string& theField, <span class="keywordtype">int</span> layer, <span class="keywordtype">bool [...]
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span> {</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   poLayer = m_datasource->GetLayer(layer);</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <span class="keywordtype">int</span> nfield=(theField!=<span class="stringliteral">""</span>)? poFDefn->GetFieldCount() : 1;</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   <span class="keywordflow">if</span>(theField==<span class="stringliteral">""</span>){</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     <span class="comment">//read first field available </span></div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       std::cout << <span class="stringliteral">"read first field from total of "</span> << nfield << std::endl;</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   }</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span> </div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>   <span class="comment">//start reading features from the layer</span></div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>   OGRFeature *poFeature;</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>   poLayer->ResetReading();</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>     std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>   <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     <span class="comment">// std::vector<T> theFeature;//(fields.size()+posOffset);//x,y+selectedfields</span></div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     T theFeature;</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     poGeometry = poFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       <span class="keywordflow">if</span>(poGeometry == NULL)</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>         std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       <span class="keywordflow">else</span><span class="comment">// if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</span></div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         std::cout << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl;</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     }</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     <span class="comment">// assert(poGeometry != NULL </span></div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     <span class="comment">//        && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span> </div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<nfield;++iField){</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       std::string fieldname=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="keywordflow">if</span>(fieldname!=theField)</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       <span class="keywordflow">switch</span>(fieldType){</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="keywordflow">case</span>(OFTInteger):</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="keywordflow">case</span>(OFTReal):</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         theFeature=poFeature->GetFieldAsDouble(iField);</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>         {</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>           std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>           <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>         }</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       }</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     }</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     data.push_back(theFeature);</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       std::cout << <span class="stringliteral">"feature is: "</span> << theFeature << std::endl;</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     ++ifeature;</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   }</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>   <span class="keywordflow">if</span>(data.size()){</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     <span class="keywordflow">return</span> data.size();</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   }</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     std::ostringstream ess;</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   }</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span> }</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span> </div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span> <span class="comment">//specialization for string: read one field from all features</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span> <span class="keyword">template</span> <> <span class="keyword">inline</span> <span class="keywordtype">int</span> ImgReaderOgr::readData(std::vector<std::string>& data, <span class="keyword">const</span> OGRFieldType& fieldType, <span class="keyword">const</span> std::string& theField, <span class="keywordtype">int</span> layer, <span class="keywordtype">bool</span> verbose)</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span> {</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   poLayer = m_datasource->GetLayer(layer);</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   <span class="keywordtype">int</span> nfield=(theField!=<span class="stringliteral">""</span>)? poFDefn->GetFieldCount() : 1;</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>   <span class="keywordflow">if</span>(theField==<span class="stringliteral">""</span>){</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     <span class="comment">//read first field available </span></div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       std::cout << <span class="stringliteral">"read first field from total of "</span> << nfield << std::endl;</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>   }</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span> </div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>   <span class="comment">//start reading features from the layer</span></div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>   OGRFeature *poFeature;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>   poLayer->ResetReading();</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>   <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     std::string theFeature;</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     poGeometry = poFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       <span class="keywordflow">if</span>(poGeometry == NULL)</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>         std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       <span class="keywordflow">else</span><span class="comment">// if(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</span></div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>         std::cout << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl;</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     }</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     <span class="comment">// assert(poGeometry != NULL </span></div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     <span class="comment">//        && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</span></div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span> </div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<nfield;++iField){</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       std::string fieldname=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       <span class="keywordflow">if</span>(fieldname!=theField)</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       <span class="keywordflow">switch</span>(fieldType){</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       <span class="keywordflow">case</span>(OFTInteger):</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       <span class="keywordflow">case</span>(OFTReal):</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       <span class="keywordflow">case</span>(OFTString):</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         theFeature=poFeature->GetFieldAsString(iField);</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>         {</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>           std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>           <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>         }</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>       }</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     }</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     data.push_back(theFeature);</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       std::cout << <span class="stringliteral">"feature is: "</span> << theFeature << std::endl;</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     ++ifeature;</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>   }</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>   <span class="keywordflow">if</span>(data.size()){</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     <span class="keywordflow">return</span> data.size();</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>   }</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     std::ostringstream ess;</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>   }</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span> }</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span> </div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span> <span class="comment">//read data from all features  </span></div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readData(<a class="code" href="classVector2d.html">Vector2d<T></a>& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keywordtype">int</span> layer, <span class="keywordtype">bool</span> pos [...]
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span> {</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   poLayer = m_datasource->GetLayer(layer);</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   <span class="keywordflow">if</span>(fields.empty()){</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     fields.resize(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   }</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   <span class="comment">//start reading features from the layer</span></div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>   OGRFeature *poFeature;</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   poLayer->ResetReading();</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>   <span class="keywordtype">int</span> posOffset=(pos)?2:0;</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>   <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     std::vector<T> theFeature;<span class="comment">//(fields.size()+posOffset);//x,y+selectedfields</span></div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     poGeometry = poFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       <span class="keywordflow">if</span>(poGeometry == NULL)</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>         std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>         std::cerr << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     }</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     assert(poGeometry != NULL </div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>            && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     <span class="keywordflow">if</span>(pos){</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       theFeature.push_back(poPoint->getX());</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       theFeature.push_back(poPoint->getY());</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     }</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     std::string featurename;</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       std::string fieldname=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       <span class="keywordflow">switch</span>(fieldType){</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       <span class="keywordflow">case</span>(OFTReal):</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>         <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>           <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>             theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>         }</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>           fields[iField]=fieldname;</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>           theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>         }</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>       <span class="keywordflow">case</span>(OFTInteger):</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>         <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>           <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>             theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>         }</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>           fields[iField]=fieldname;</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>           theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>         }</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>       <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>         {</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>           std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>           <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>         }</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       }</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     }</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     data.push_back(theFeature);</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>     ++ifeature;</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>   }</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span> <span class="comment">//   assert(data.size()==ifeature);</span></div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>   <span class="keywordflow">if</span>(data.size()){</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     <span class="keywordflow">if</span>(pos)</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>       assert(data[0].size()==fields.size()+2);</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       assert(data[0].size()==fields.size());</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     <span class="keywordflow">return</span> fields.size();</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>   }</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     std::ostringstream ess;</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>   }</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span> }</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span> </div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readSql(std::map<<span class="keywordtype">int</span>, <a class="code" href="classVector2d.html">Vector2d<T></a> >& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</spa [...]
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span> {</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>   OGRLayer *poLayer;</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>   poLayer = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL );</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>   <span class="keywordflow">if</span>(poLayer!=NULL){</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>     <span class="keywordflow">if</span>(fields.empty()){</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       fields.resize(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>         std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>     }</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     <span class="comment">//start reading features from the layer</span></div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     OGRFeature *poFeature;</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>     poLayer->ResetReading();</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>     <span class="keywordtype">int</span> posOffset=(pos)?2:0;</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>       std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     <span class="keywordtype">int</span> theClass=0;</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>       std::vector<T> theFeature;<span class="comment">//(fields.size()+posOffset);//x,y+selectedfields</span></div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>         std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       poGeometry = poFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>         <span class="keywordflow">if</span>(poGeometry == NULL)</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>           std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>           std::cerr << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>       }</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       assert(poGeometry != NULL </div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>              && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>       OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       <span class="keywordflow">if</span>(pos){</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>         theFeature.push_back(poPoint->getX());</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>         theFeature.push_back(poPoint->getY());</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       }</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       std::string featurename;</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>         OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         std::string fieldname=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>         <span class="keywordflow">if</span>(fieldname==label)</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>           theClass=poFeature->GetFieldAsInteger(iField);</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>           <span class="keywordflow">switch</span>(fieldType){</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>           <span class="keywordflow">case</span>(OFTReal):</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>             }</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>               fields[iField]=fieldname;</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>             }</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>           <span class="keywordflow">case</span>(OFTInteger):</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>             <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>               <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>                 theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>             }</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>               fields[iField]=fieldname;</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>             }</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>             {</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>               std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>               <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>             }</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>           }</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>         }</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       }</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       data[theClass].push_back(theFeature);</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       ++ifeature;</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     }</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>       std::cout << <span class="stringliteral">"number of features read: "</span> << ifeature << std::endl << std::flush;</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     <span class="keyword">typename</span> std::map<int,Vector2d<T> >::const_iterator mit=data.begin();</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>     <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>       std::cout << <span class="stringliteral">"read classes: "</span> << std::flush;</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="keywordflow">while</span>(mit!=data.end()){</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>         std::cout << mit->first << <span class="stringliteral">" "</span> << std::flush;</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       <span class="keywordflow">if</span>(!nband)</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>         nband=fields.size();</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>       <span class="keywordflow">if</span>(pos)</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>         assert((mit->second)[0].size()==nband+2);</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>         assert((mit->second)[0].size()==nband);</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>       ++mit;</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     }</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>       std::cout << std::endl << std::flush;</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>     <span class="keywordflow">return</span>(nband);</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>   }</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     std::ostringstream ess;</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>   }</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span> }</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span> </div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">int</span> ImgReaderOgr::readSql(<a class="code" href="classVector2d.html">Vector2d<T></a>& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</span> std::string& sqlStatement, OGRGeometry* spatialF [...]
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span> {</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>   OGRLayer *poLayer;</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>   poLayer = m_datasource->ExecuteSQL(sqlStatement.c_str(), spatialFilter,NULL );</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>   <span class="keywordflow">if</span>(poLayer!=NULL){</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>     OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>     <span class="keywordflow">if</span>(fields.empty()){</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       fields.resize(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>         std::cout << <span class="stringliteral">"resized fields to "</span> << fields.size() << std::endl;</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>     }</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>     <span class="comment">//start reading features from the layer</span></div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     OGRFeature *poFeature;</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>     poLayer->ResetReading();</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>     <span class="keywordtype">int</span> posOffset=(pos)?2:0;</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       std::cout << <span class="stringliteral">"going through features"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       std::vector<T> theFeature;<span class="comment">//(fields.size()+posOffset);//x,y+selectedfields</span></div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>         std::cout << <span class="stringliteral">"reading feature "</span> << ifeature << std::endl << std::flush;</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>       OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       poGeometry = poFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>       <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>         <span class="keywordflow">if</span>(poGeometry == NULL)</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>           std::cerr << <span class="stringliteral">"no geometry defined"</span> << std::endl << std::flush;</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) != wkbPoint)</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>           std::cerr << <span class="stringliteral">"poGeometry type: "</span> << wkbFlatten(poGeometry->getGeometryType()) << std::endl << std::flush;</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>       }</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>       assert(poGeometry != NULL </div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>              && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>       <span class="keywordflow">if</span>(pos){</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>         theFeature.push_back(poPoint->getX());</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>         theFeature.push_back(poPoint->getY());</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>       }</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>       std::string featurename;</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>         OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>         std::string fieldname=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>         <span class="keywordflow">switch</span>(fieldType){</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>         <span class="keywordflow">case</span>(OFTReal):</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>           <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>             <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>           }</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>             fields[iField]=fieldname;</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>             theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>           }</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>         <span class="keywordflow">case</span>(OFTInteger):</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>           <span class="keywordflow">if</span>(fields.size()<poFDefn->GetFieldCount()){</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>             <span class="keywordflow">if</span>(find(fields.begin(),fields.end(),fieldname)!=fields.end())</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>               theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>           }</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>             fields[iField]=fieldname;</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>             theFeature.push_back(poFeature->GetFieldAsDouble(iField));</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>           }</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>           {</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>             std::string errorstring=<span class="stringliteral">"field type not supported in ImgReaderOgr::ReadData"</span>;</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>             <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>           }</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>         }</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       }</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       data.push_back(theFeature);</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       ++ifeature;</div>
 <div class="line"><a name="l00941"></a><span class="lineno">  941</span>     }</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       <span class="keywordflow">return</span>(0);</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>   }</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>     std::ostringstream ess;</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>     <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>   }</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span> }</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span> </div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span> <span class="preprocessor">#endif // _IMGREADEROGR_H_</span></div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     m_datasource->ReleaseResultSet( poLayer );</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>     <span class="comment">//   assert(data.size()==ifeature);</span></div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     <span class="keywordflow">if</span>(data.size()){</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       <span class="keywordflow">if</span>(pos)</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>         assert(data[0].size()==fields.size()+2);</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>         assert(data[0].size()==fields.size());</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="keywordflow">return</span> fields.size();</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     }</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       <span class="keywordflow">return</span>(0);</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>   }</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>     std::ostringstream ess;</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>     ess << <span class="stringliteral">"no layer in "</span> << m_filename;</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>   }</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span> }</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span> </div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span> <span class="preprocessor">#endif // _IMGREADEROGR_H_</span></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgRegression_8cc_source.html b/doc/html/ImgRegression_8cc_source.html
index 2914049..e4fa02b 100644
--- a/doc/html/ImgRegression_8cc_source.html
+++ b/doc/html/ImgRegression_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -446,13 +446,13 @@
 <div class="line"><a name="l00392"></a><span class="lineno">  392</span>     std::cout << <span class="stringliteral">"orthogonal regression based on "</span> << buffer1.size() << <span class="stringliteral">" points: "</span> << c0 << <span class="stringliteral">"+"</span> << c1 << <span class="stringliteral">" * x "</span> << <span class="stringliteral">" with r^2: "</span> << r [...]
 <div class="line"><a name="l00393"></a><span class="lineno">  393</span>   <span class="keywordflow">return</span> r*r;</div>
 <div class="line"><a name="l00394"></a><span class="lineno">  394</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgRegression_8h_source.html b/doc/html/ImgRegression_8h_source.html
index a308496..02de8b4 100644
--- a/doc/html/ImgRegression_8h_source.html
+++ b/doc/html/ImgRegression_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -101,12 +101,12 @@
 <div class="line"><a name="l00047"></a><span class="lineno">   47</span> }</div>
 <div class="line"><a name="l00048"></a><span class="lineno">   48</span> <span class="preprocessor">#endif //_IMGREGRESSION_H_</span></div>
 <div class="ttc" id="classimgregression_1_1ImgRegression_html"><div class="ttname"><a href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgRegression_8h_source.html#l00030">ImgRegression.h:30</a></div></div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop__gui_2main_8cc_source.html b/doc/html/ImgUpdaterGdal_8cc_source.html
similarity index 65%
copy from doc/html/pkcrop__gui_2main_8cc_source.html
copy to doc/html/ImgUpdaterGdal_8cc_source.html
index edb9643..247dbb9 100644
--- a/doc/html/pkcrop__gui_2main_8cc_source.html
+++ b/doc/html/ImgUpdaterGdal_8cc_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qt/pkcrop_gui/main.cc Source File</title>
+<title>pktools: /home/kempenep/pktools/src/imageclasses/ImgUpdaterGdal.cc Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,17 +44,17 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_0f63d6441a2c250919e1e8723011eb2f.html">qt</a></li><li class="navelem"><a class="el" href="dir_35acdce8930fac877097c845a64519e5.html">pkcrop_gui</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html">imageclasses</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">main.cc</div>  </div>
+<div class="title">ImgUpdaterGdal.cc</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span> <span class="comment">/**********************************************************************</span></div>
-<div class="line"><a name="l00002"></a><span class="lineno">    2</span> <span class="comment">main.cc: GUI for pktools</span></div>
-<div class="line"><a name="l00003"></a><span class="lineno">    3</span> <span class="comment">Copyright (C) 2008-2014 Pieter Kempeneers</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno">    2</span> <span class="comment">ImgUpdaterGdal.cc: class to read raster files using GDAL API library</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno">    3</span> <span class="comment">Copyright (C) 2008-2012 Pieter Kempeneers</span></div>
 <div class="line"><a name="l00004"></a><span class="lineno">    4</span> <span class="comment"></span></div>
 <div class="line"><a name="l00005"></a><span class="lineno">    5</span> <span class="comment">This file is part of pktools</span></div>
 <div class="line"><a name="l00006"></a><span class="lineno">    6</span> <span class="comment"></span></div>
@@ -71,24 +71,37 @@
 <div class="line"><a name="l00017"></a><span class="lineno">   17</span> <span class="comment">You should have received a copy of the GNU General Public License</span></div>
 <div class="line"><a name="l00018"></a><span class="lineno">   18</span> <span class="comment">along with pktools.  If not, see <http://www.gnu.org/licenses/>.</span></div>
 <div class="line"><a name="l00019"></a><span class="lineno">   19</span> <span class="comment">***********************************************************************/</span></div>
-<div class="line"><a name="l00020"></a><span class="lineno">   20</span> </div>
-<div class="line"><a name="l00021"></a><span class="lineno">   21</span> <span class="preprocessor">#include "mainwindow.h"</span></div>
-<div class="line"><a name="l00022"></a><span class="lineno">   22</span> <span class="preprocessor">#include <QApplication></span></div>
-<div class="line"><a name="l00023"></a><span class="lineno">   23</span> </div>
-<div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
-<div class="line"><a name="l00025"></a><span class="lineno">   25</span> {</div>
-<div class="line"><a name="l00026"></a><span class="lineno">   26</span>     QApplication a(argc, argv);</div>
-<div class="line"><a name="l00027"></a><span class="lineno">   27</span>     <a class="code" href="classMainWindow.html">MainWindow</a> w;</div>
-<div class="line"><a name="l00028"></a><span class="lineno">   28</span>     w.show();</div>
-<div class="line"><a name="l00029"></a><span class="lineno">   29</span>     </div>
-<div class="line"><a name="l00030"></a><span class="lineno">   30</span>     <span class="keywordflow">return</span> a.exec();</div>
-<div class="line"><a name="l00031"></a><span class="lineno">   31</span> }</div>
-<div class="ttc" id="classMainWindow_html"><div class="ttname"><a href="classMainWindow.html">MainWindow</a></div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite__gui_2mainwindow_8h_source.html#l00031">mainwindow.h:31</a></div></div>
+<div class="line"><a name="l00020"></a><span class="lineno">   20</span> <span class="preprocessor">#include <iostream></span></div>
+<div class="line"><a name="l00021"></a><span class="lineno">   21</span> <span class="preprocessor">#include "ImgUpdaterGdal.h"</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno">   22</span> </div>
+<div class="line"><a name="l00023"></a><span class="lineno">   23</span> ImgUpdaterGdal::ImgUpdaterGdal(<span class="keywordtype">void</span>){};</div>
+<div class="line"><a name="l00024"></a><span class="lineno">   24</span> </div>
+<div class="line"><a name="l00025"></a><span class="lineno">   25</span> ImgUpdaterGdal::ImgUpdaterGdal(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> GDALAccess& readMode){</div>
+<div class="line"><a name="l00026"></a><span class="lineno">   26</span>   open(filename,readMode);</div>
+<div class="line"><a name="l00027"></a><span class="lineno">   27</span> }</div>
+<div class="line"><a name="l00028"></a><span class="lineno">   28</span> </div>
+<div class="line"><a name="l00029"></a><span class="lineno">   29</span> ImgUpdaterGdal::~ImgUpdaterGdal(<span class="keywordtype">void</span>)</div>
+<div class="line"><a name="l00030"></a><span class="lineno">   30</span> {</div>
+<div class="line"><a name="l00031"></a><span class="lineno">   31</span>   <span class="comment">// delete m_gds;</span></div>
+<div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="comment">//   GDALDumpOpenDatasets(stderr);</span></div>
+<div class="line"><a name="l00033"></a><span class="lineno">   33</span> <span class="comment">//   GDALDestroyDriverManager();//could be used by other objects...</span></div>
+<div class="line"><a name="l00034"></a><span class="lineno">   34</span> }</div>
+<div class="line"><a name="l00035"></a><span class="lineno">   35</span> </div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="comment">//--------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00037"></a><span class="lineno">   37</span> </div>
+<div class="line"><a name="l00038"></a><span class="lineno">   38</span> <span class="keywordtype">void</span> ImgUpdaterGdal::open(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> GDALAccess& readMode)</div>
+<div class="line"><a name="l00039"></a><span class="lineno">   39</span> {</div>
+<div class="line"><a name="l00040"></a><span class="lineno">   40</span>   ImgReaderGdal::open(filename,readMode);</div>
+<div class="line"><a name="l00041"></a><span class="lineno">   41</span> }</div>
+<div class="line"><a name="l00042"></a><span class="lineno">   42</span> <span class="keywordtype">void</span> ImgUpdaterGdal::close(<span class="keywordtype">void</span>)</div>
+<div class="line"><a name="l00043"></a><span class="lineno">   43</span> {</div>
+<div class="line"><a name="l00044"></a><span class="lineno">   44</span>   ImgRasterGdal::close();</div>
+<div class="line"><a name="l00045"></a><span class="lineno">   45</span> }</div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfsann_8h_source.html b/doc/html/ImgUpdaterGdal_8h_source.html
similarity index 61%
copy from doc/html/pkfsann_8h_source.html
copy to doc/html/ImgUpdaterGdal_8h_source.html
index f9befaf..8154b48 100644
--- a/doc/html/pkfsann_8h_source.html
+++ b/doc/html/ImgUpdaterGdal_8h_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/src/apps/pkfsann.h Source File</title>
+<title>pktools: /home/kempenep/pktools/src/imageclasses/ImgUpdaterGdal.h Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,17 +44,17 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html">imageclasses</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">pkfsann.h</div>  </div>
+<div class="title">ImgUpdaterGdal.h</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span> <span class="comment">/**********************************************************************</span></div>
-<div class="line"><a name="l00002"></a><span class="lineno">    2</span> <span class="comment">pkfsann.h: feature selection for ann classifier</span></div>
-<div class="line"><a name="l00003"></a><span class="lineno">    3</span> <span class="comment">Copyright (C) 2008-2014 Pieter Kempeneers</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno">    2</span> <span class="comment">ImgUpdaterGdal.h: class to read raster files using GDAL API library</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno">    3</span> <span class="comment">Copyright (C) 2008-2012 Pieter Kempeneers</span></div>
 <div class="line"><a name="l00004"></a><span class="lineno">    4</span> <span class="comment"></span></div>
 <div class="line"><a name="l00005"></a><span class="lineno">    5</span> <span class="comment">This file is part of pktools</span></div>
 <div class="line"><a name="l00006"></a><span class="lineno">    6</span> <span class="comment"></span></div>
@@ -71,41 +71,34 @@
 <div class="line"><a name="l00017"></a><span class="lineno">   17</span> <span class="comment">You should have received a copy of the GNU General Public License</span></div>
 <div class="line"><a name="l00018"></a><span class="lineno">   18</span> <span class="comment">along with pktools.  If not, see <http://www.gnu.org/licenses/>.</span></div>
 <div class="line"><a name="l00019"></a><span class="lineno">   19</span> <span class="comment">***********************************************************************/</span></div>
-<div class="line"><a name="l00020"></a><span class="lineno">   20</span> <span class="preprocessor">#include <string></span></div>
-<div class="line"><a name="l00021"></a><span class="lineno">   21</span> <span class="preprocessor">#include <vector></span></div>
-<div class="line"><a name="l00022"></a><span class="lineno">   22</span> <span class="preprocessor">#include "base/Vector2d.h"</span></div>
-<div class="line"><a name="l00023"></a><span class="lineno">   23</span> </div>
-<div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="preprocessor">#ifndef _PKFSANNH_H_</span></div>
-<div class="line"><a name="l00025"></a><span class="lineno">   25</span> <span class="preprocessor"></span><span class="preprocessor">#define _PKFSANNH_H_</span></div>
-<div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="preprocessor"></span></div>
-<div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="keyword">enum</span> SelectorValue  { NA=0, SFFS=1, SFS=2, SBS=3, BFS=4};</div>
-<div class="line"><a name="l00028"></a><span class="lineno">   28</span> </div>
-<div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="classCostFactoryANN.html">   29</a></span> <span class="keyword">class </span><a class="code" href="classCostFactoryANN.html">CostFactoryANN</a> : <span class="keyword">public</span> <a class="code" href="classCostFactory.html">CostFactory</a></div>
-<div class="line"><a name="l00030"></a><span class="lineno">   30</span> {</div>
-<div class="line"><a name="l00031"></a><span class="lineno">   31</span>  <span class="keyword">public</span>:</div>
-<div class="line"><a name="l00032"></a><span class="lineno">   32</span>   <a class="code" href="classCostFactoryANN.html">CostFactoryANN</a>();</div>
-<div class="line"><a name="l00033"></a><span class="lineno">   33</span>   <a class="code" href="classCostFactoryANN.html">CostFactoryANN</a>(<span class="keyword">const</span> std::vector<unsigned int>& nneuron, <span class="keywordtype">float</span> connection, <span class="keyword">const</span> std::vector<float> weights, <span class="keywordtype">float</span> learning, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxit, <span cla [...]
-<div class="line"><a name="l00034"></a><span class="lineno">   34</span>   ~<a class="code" href="classCostFactoryANN.html">CostFactoryANN</a>();</div>
-<div class="line"><a name="l00035"></a><span class="lineno">   35</span>   <span class="keywordtype">double</span> getCost(<span class="keyword">const</span> std::vector<<a class="code" href="classVector2d.html">Vector2d<float></a> > &trainingFeatures);</div>
-<div class="line"><a name="l00036"></a><span class="lineno">   36</span>   </div>
-<div class="line"><a name="l00037"></a><span class="lineno">   37</span>  <span class="keyword">private</span>:</div>
-<div class="line"><a name="l00038"></a><span class="lineno">   38</span>   std::vector<unsigned int> m_nneuron;</div>
-<div class="line"><a name="l00039"></a><span class="lineno">   39</span>   <span class="keywordtype">float</span> m_connection;</div>
-<div class="line"><a name="l00040"></a><span class="lineno">   40</span>   <span class="keyword">const</span> std::vector<float> m_weights;</div>
-<div class="line"><a name="l00041"></a><span class="lineno">   41</span>   <span class="keywordtype">float</span> m_learning;</div>
-<div class="line"><a name="l00042"></a><span class="lineno">   42</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_maxit;</div>
-<div class="line"><a name="l00043"></a><span class="lineno">   43</span> };</div>
-<div class="line"><a name="l00044"></a><span class="lineno">   44</span> </div>
-<div class="line"><a name="l00045"></a><span class="lineno">   45</span> </div>
-<div class="line"><a name="l00046"></a><span class="lineno">   46</span> <span class="preprocessor">#endif</span></div>
-<div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
-<div class="ttc" id="classCostFactoryANN_html"><div class="ttname"><a href="classCostFactoryANN.html">CostFactoryANN</a></div><div class="ttdef"><b>Definition:</b> <a href="pkfsann_8h_source.html#l00029">pkfsann.h:29</a></div></div>
-<div class="ttc" id="classCostFactory_html"><div class="ttname"><a href="classCostFactory.html">CostFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="CostFactory_8h_source.html#l00030">CostFactory.h:30</a></div></div>
+<div class="line"><a name="l00020"></a><span class="lineno">   20</span> <span class="preprocessor">#ifndef _IMGUPDATERGDAL_H_</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno">   21</span> <span class="preprocessor"></span><span class="preprocessor">#define _IMGUPDATERGDAL_H_</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno">   22</span> <span class="preprocessor"></span></div>
+<div class="line"><a name="l00023"></a><span class="lineno">   23</span> <span class="preprocessor">#include "ImgReaderGdal.h"</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="preprocessor">#include "ImgWriterGdal.h"</span></div>
+<div class="line"><a name="l00025"></a><span class="lineno">   25</span> </div>
+<div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="comment">//--------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="keyword">class </span><a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a> : <span class="keyword">public</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>, <span class="keyword">public</span> <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a></div>
+<div class="line"><a name="l00028"></a><span class="lineno">   28</span> {</div>
+<div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00030"></a><span class="lineno">   30</span>   <a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00031"></a><span class="lineno">   31</span>   <a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> GDALAccess& readMode=GA_Update);</div>
+<div class="line"><a name="l00032"></a><span class="lineno">   32</span>   ~<a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00033"></a><span class="lineno">   33</span>   <span class="keywordtype">void</span> open(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> GDALAccess& readMode=GA_Update);</div>
+<div class="line"><a name="l00034"></a><span class="lineno">   34</span>   <span class="keywordtype">void</span> close(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00035"></a><span class="lineno">   35</span> </div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a name="l00037"></a><span class="lineno">   37</span> };</div>
+<div class="line"><a name="l00038"></a><span class="lineno">   38</span> </div>
+<div class="line"><a name="l00039"></a><span class="lineno">   39</span> <span class="preprocessor">#endif // _IMGUPDATERGDAL_H_</span></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
+<div class="ttc" id="classImgUpdaterGdal_html"><div class="ttname"><a href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgGdal_8h_source.html#l00027">ImgGdal.h:27</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgWriterGdal_8cc_source.html b/doc/html/ImgWriterGdal_8cc_source.html
index 2cc2900..ddf19fe 100644
--- a/doc/html/ImgWriterGdal_8cc_source.html
+++ b/doc/html/ImgWriterGdal_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -86,76 +86,76 @@
 <div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l00033"></a><span class="lineno">   33</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00034"></a><span class="lineno">   34</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
-<div class="line"><a name="l00035"></a><span class="lineno">   35</span> ImgWriterGdal::ImgWriterGdal(<span class="keywordtype">void</span>)</div>
-<div class="line"><a name="l00036"></a><span class="lineno">   36</span>   : m_gds(NULL), m_ncol(0), m_nrow(0), m_nband(0)</div>
-<div class="line"><a name="l00037"></a><span class="lineno">   37</span> {}</div>
-<div class="line"><a name="l00038"></a><span class="lineno">   38</span> </div>
-<div class="line"><a name="l00039"></a><span class="lineno">   39</span> <span class="comment">// ImgWriterGdal::ImgWriterGdal(void)</span></div>
-<div class="line"><a name="l00040"></a><span class="lineno">   40</span> <span class="comment">//   : m_gds(NULL), m_magic_x(1), m_magic_y(1), m_isGeoRef(false), m_ncol(0), m_nrow(0), m_nband(0), m_interleave("BAND"), m_compression("LZW")</span></div>
-<div class="line"><a name="l00041"></a><span class="lineno">   41</span> <span class="comment">// {}</span></div>
-<div class="line"><a name="l00042"></a><span class="lineno">   42</span> </div>
-<div class="line"><a name="l00043"></a><span class="lineno">   43</span> ImgWriterGdal::~ImgWriterGdal(<span class="keywordtype">void</span>)</div>
-<div class="line"><a name="l00044"></a><span class="lineno">   44</span> {</div>
-<div class="line"><a name="l00045"></a><span class="lineno">   45</span>   <span class="comment">// delete m_gds;</span></div>
-<div class="line"><a name="l00046"></a><span class="lineno">   46</span> <span class="comment">//   GDALDumpOpenDatasets(stderr);</span></div>
-<div class="line"><a name="l00047"></a><span class="lineno">   47</span> <span class="comment">//   GDALDestroyDriverManager();//could still be be used by other objects</span></div>
-<div class="line"><a name="l00048"></a><span class="lineno">   48</span> }</div>
-<div class="line"><a name="l00049"></a><span class="lineno">   49</span> </div>
-<div class="line"><a name="l00050"></a><span class="lineno">   50</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
-<div class="line"><a name="l00051"></a><span class="lineno">   51</span> <span class="keywordtype">void</span> ImgWriterGdal::open(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& imgSrc, <span class="keyword">const</span> std::vector<std::string>& options)</div>
-<div class="line"><a name="l00052"></a><span class="lineno">   52</span> {</div>
-<div class="line"><a name="l00053"></a><span class="lineno">   53</span>   <span class="comment">// m_isGeoRef=imgSrc.isGeoRef();</span></div>
-<div class="line"><a name="l00054"></a><span class="lineno">   54</span>   m_filename=filename;</div>
-<div class="line"><a name="l00055"></a><span class="lineno">   55</span>   m_ncol=imgSrc.nrOfCol();</div>
-<div class="line"><a name="l00056"></a><span class="lineno">   56</span>   m_nrow=imgSrc.nrOfRow();</div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>   m_nband=imgSrc.nrOfBand();</div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>   m_type=imgSrc.getDataType();</div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>   m_options=options;</div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span>   <span class="comment">// m_interleave=imgSrc.getInterleave();</span></div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="comment">// m_compression=imgSrc.getCompression();</span></div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>   <span class="comment">// imgSrc.getMagicPixel(m_magic_x,m_magic_y);</span></div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>   setCodec(imgSrc);</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span> }</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span> </div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span> <span class="comment">// void ImgWriterGdal::open(const std::string& filename, int ncol, int nrow, int nband, const GDALDataType& dataType, const std::string& imageType, const std::string& interleave, const std::string& compression, int magicX, int magicY)</span></div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span> <span class="comment">//   m_isGeoRef=false;</span></div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span> <span class="comment">//   m_filename = filename;</span></div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span> <span class="comment">//   m_ncol = ncol;</span></div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span> <span class="comment">//   m_nrow = nrow;</span></div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="comment">//   m_nband = nband;</span></div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span> <span class="comment">//   m_type=dataType;</span></div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span> <span class="comment">//   m_interleave = interleave;</span></div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span> <span class="comment">//   m_compression=compression;</span></div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="comment">//   m_magic_x=magicX;</span></div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="comment">//   m_magic_y=magicY;</span></div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span> <span class="comment">//   setCodec(imageType);</span></div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span> </div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span> <span class="keywordtype">void</span> ImgWriterGdal::open(<span class="keyword">const</span> std::string& filename, <span class="keywordtype">int</span> ncol, <span class="keywordtype">int</span> nrow, <span class="keywordtype">int</span> nband, <span class="keyword">const</span> GDALDataType& dataType, <span class="keyword">const</span> std::string& imageType, <span class="keyword">const</span> std [...]
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span> {</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <span class="comment">// m_isGeoRef=false;</span></div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   m_filename = filename;</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   m_ncol = ncol;</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   m_nrow = nrow;</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   m_nband = nband;</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   m_type=dataType;</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <span class="comment">// m_interleave = interleave;</span></div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <span class="comment">// m_compression=compression;</span></div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   m_options=options;</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <span class="comment">// m_magic_x=magicX;</span></div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <span class="comment">// m_magic_y=magicY;</span></div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   setCodec(imageType);</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span> }</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span> </div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span> <span class="keywordtype">void</span> ImgWriterGdal::close(<span class="keywordtype">void</span>)</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span> {</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   GDALClose(m_gds);</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <span class="keywordtype">char</span> **papszOptions=NULL;</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <span class="keywordflow">for</span>(std::vector<std::string>::const_iterator optionIt=m_options.begin();optionIt!=m_options.end();++optionIt)</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     papszOptions=CSLAddString(papszOptions,optionIt->c_str());</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   CSLDestroy(papszOptions);</div>
+<div class="line"><a name="l00035"></a><span class="lineno">   35</span> </div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="comment">// ImgWriterGdal::ImgWriterGdal(void)</span></div>
+<div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="comment">//   : m_gds(NULL), m_magic_x(1), m_magic_y(1), m_isGeoRef(false), m_ncol(0), m_nrow(0), m_nband(0), m_interleave("BAND"), m_compression("LZW")</span></div>
+<div class="line"><a name="l00038"></a><span class="lineno">   38</span> <span class="comment">// {}</span></div>
+<div class="line"><a name="l00039"></a><span class="lineno">   39</span> </div>
+<div class="line"><a name="l00040"></a><span class="lineno">   40</span> ImgWriterGdal::ImgWriterGdal(<span class="keywordtype">void</span>){};</div>
+<div class="line"><a name="l00041"></a><span class="lineno">   41</span> </div>
+<div class="line"><a name="l00042"></a><span class="lineno">   42</span> ImgWriterGdal::~ImgWriterGdal(<span class="keywordtype">void</span>)</div>
+<div class="line"><a name="l00043"></a><span class="lineno">   43</span> {</div>
+<div class="line"><a name="l00044"></a><span class="lineno">   44</span>   <span class="comment">// delete m_gds;</span></div>
+<div class="line"><a name="l00045"></a><span class="lineno">   45</span> <span class="comment">//   GDALDumpOpenDatasets(stderr);</span></div>
+<div class="line"><a name="l00046"></a><span class="lineno">   46</span> <span class="comment">//   GDALDestroyDriverManager();//could still be be used by other objects</span></div>
+<div class="line"><a name="l00047"></a><span class="lineno">   47</span> }</div>
+<div class="line"><a name="l00048"></a><span class="lineno">   48</span> </div>
+<div class="line"><a name="l00049"></a><span class="lineno">   49</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00050"></a><span class="lineno">   50</span> <span class="keywordtype">void</span> ImgWriterGdal::open(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& imgSrc, <span class="keyword">const</span> std::vector<std::string>& options)</div>
+<div class="line"><a name="l00051"></a><span class="lineno">   51</span> {</div>
+<div class="line"><a name="l00052"></a><span class="lineno">   52</span>   <span class="comment">// m_isGeoRef=imgSrc.isGeoRef();</span></div>
+<div class="line"><a name="l00053"></a><span class="lineno">   53</span>   m_filename=filename;</div>
+<div class="line"><a name="l00054"></a><span class="lineno">   54</span>   m_ncol=imgSrc.nrOfCol();</div>
+<div class="line"><a name="l00055"></a><span class="lineno">   55</span>   m_nrow=imgSrc.nrOfRow();</div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>   m_nband=imgSrc.nrOfBand();</div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span>   <span class="comment">// m_type=imgSrc.getDataType();</span></div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>   m_options=options;</div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>   <span class="comment">// m_interleave=imgSrc.getInterleave();</span></div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span>   <span class="comment">// m_compression=imgSrc.getCompression();</span></div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="comment">// imgSrc.getMagicPixel(m_magic_x,m_magic_y);</span></div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>   setCodec(imgSrc);</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span> }</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span> </div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span> <span class="comment">// void ImgWriterGdal::open(const std::string& filename, int ncol, int nrow, int nband, const GDALDataType& dataType, const std::string& imageType, const std::string& interleave, const std::string& compression, int magicX, int magicY)</span></div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span> <span class="comment">//   m_isGeoRef=false;</span></div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span> <span class="comment">//   m_filename = filename;</span></div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span> <span class="comment">//   m_ncol = ncol;</span></div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span> <span class="comment">//   m_nrow = nrow;</span></div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span> <span class="comment">//   m_nband = nband;</span></div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="comment">//   m_type=dataType;</span></div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span> <span class="comment">//   m_interleave = interleave;</span></div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span> <span class="comment">//   m_compression=compression;</span></div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span> <span class="comment">//   m_magic_x=magicX;</span></div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="comment">//   m_magic_y=magicY;</span></div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="comment">//   setCodec(imageType);</span></div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span> </div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span> <span class="keywordtype">void</span> ImgWriterGdal::open(<span class="keyword">const</span> std::string& filename, <span class="keywordtype">int</span> ncol, <span class="keywordtype">int</span> nrow, <span class="keywordtype">int</span> nband, <span class="keyword">const</span> GDALDataType& dataType, <span class="keyword">const</span> std::string& imageType, <span class="keyword">const</span> std [...]
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span> {</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <span class="comment">// m_isGeoRef=false;</span></div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   m_filename = filename;</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   m_ncol = ncol;</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   m_nrow = nrow;</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   m_nband = nband;</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <span class="comment">// m_type=dataType;</span></div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <span class="comment">// m_interleave = interleave;</span></div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <span class="comment">// m_compression=compression;</span></div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   m_options=options;</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <span class="comment">// m_magic_x=magicX;</span></div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <span class="comment">// m_magic_y=magicY;</span></div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   setCodec(dataType,imageType);</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span> }</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span> </div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span> <span class="keywordtype">void</span> ImgWriterGdal::close(<span class="keywordtype">void</span>)</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span> {</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   ImgRasterGdal::close();</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <span class="keywordtype">char</span> **papszOptions=NULL;</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <span class="keywordflow">for</span>(std::vector<std::string>::const_iterator optionIt=m_options.begin();optionIt!=m_options.end();++optionIt)</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>     papszOptions=CSLAddString(papszOptions,optionIt->c_str());</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <span class="keywordflow">if</span>(papszOptions)</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     CSLDestroy(papszOptions);</div>
 <div class="line"><a name="l00105"></a><span class="lineno">  105</span> }</div>
 <div class="line"><a name="l00106"></a><span class="lineno">  106</span> </div>
 <div class="line"><a name="l00107"></a><span class="lineno">  107</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
@@ -181,7 +181,7 @@
 <div class="line"><a name="l00127"></a><span class="lineno">  127</span>   <span class="comment">// std::ostringstream interleaveList;</span></div>
 <div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <span class="comment">// interleaveList << "INTERLEAVE=" << m_interleave;</span></div>
 <div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <span class="comment">// papszOptions = CSLAddString(papszOptions,(interleaveList.str()).c_str());</span></div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   m_gds=poDriver->Create(m_filename.c_str(),m_ncol,m_nrow,m_nband,m_type,papszOptions);</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   m_gds=poDriver->Create(m_filename.c_str(),m_ncol,m_nrow,m_nband,imgSrc.getDataType(),papszOptions);</div>
 <div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <span class="comment">// if(imgSrc.isGeoRef()){</span></div>
 <div class="line"><a name="l00132"></a><span class="lineno">  132</span>     setProjection(imgSrc.getProjection());</div>
 <div class="line"><a name="l00133"></a><span class="lineno">  133</span>     <span class="keywordtype">double</span> gt[6];</div>
@@ -236,7 +236,7 @@
 <div class="line"><a name="l00182"></a><span class="lineno">  182</span>     setColorTable(imgSrc.getColorTable());</div>
 <div class="line"><a name="l00183"></a><span class="lineno">  183</span> }</div>
 <div class="line"><a name="l00184"></a><span class="lineno">  184</span> </div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span> <span class="keywordtype">void</span> ImgWriterGdal::setCodec(<span class="keyword">const</span> std::string& imageType)</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span> <span class="keywordtype">void</span> ImgWriterGdal::setCodec(<span class="keyword">const</span> GDALDataType& dataType, <span class="keyword">const</span> std::string& imageType)</div>
 <div class="line"><a name="l00186"></a><span class="lineno">  186</span> {</div>
 <div class="line"><a name="l00187"></a><span class="lineno">  187</span>   GDALAllRegister();</div>
 <div class="line"><a name="l00188"></a><span class="lineno">  188</span>   GDALDriver *poDriver;</div>
@@ -259,7 +259,7 @@
 <div class="line"><a name="l00205"></a><span class="lineno">  205</span>   <span class="comment">// std::ostringstream interleaveList;</span></div>
 <div class="line"><a name="l00206"></a><span class="lineno">  206</span>   <span class="comment">// interleaveList << "INTERLEAVE=" << m_interleave;</span></div>
 <div class="line"><a name="l00207"></a><span class="lineno">  207</span>   <span class="comment">// papszOptions = CSLAddString(papszOptions,(interleaveList.str()).c_str());</span></div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   m_gds=poDriver->Create(m_filename.c_str(),m_ncol,m_nrow,m_nband,m_type,papszOptions);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   m_gds=poDriver->Create(m_filename.c_str(),m_ncol,m_nrow,m_nband,dataType,papszOptions);</div>
 <div class="line"><a name="l00209"></a><span class="lineno">  209</span> </div>
 <div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <span class="comment">// m_gds->SetMetadataItem( "INTERLEAVE", m_interleave.c_str(), "IMAGE_STRUCTURE" );</span></div>
 <div class="line"><a name="l00211"></a><span class="lineno">  211</span>   <span class="comment">// m_gds->SetMetadataItem( "COMPRESSION", m_compression.c_str(), "IMAGE_STRUCTURE" );</span></div>
@@ -306,412 +306,203 @@
 <div class="line"><a name="l00252"></a><span class="lineno">  252</span>   m_gds->SetMetadata(metadata); </div>
 <div class="line"><a name="l00253"></a><span class="lineno">  253</span> }</div>
 <div class="line"><a name="l00254"></a><span class="lineno">  254</span> </div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span> std::string ImgWriterGdal::getProjection(<span class="keywordtype">void</span>)<span class="keyword"> const </span></div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   assert(m_gds);</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   std::string theProjection=m_gds->GetProjectionRef();</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="comment">//due to error in Gdal? AUTHORITY fields do not seem to work!</span></div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="comment">// size_t startpos,endpos;</span></div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="comment">// while((startpos=theProjection.find(",AUTHORITY"))!=string::npos){</span></div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="comment">//   endpos=theProjection.find("]",startpos+1,1)+1;</span></div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="comment">//   theProjection.erase(startpos,endpos-startpos);</span></div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordflow">return</span> theProjection;</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span> <span class="keywordtype">void</span> ImgWriterGdal::setGeoTransform(<span class="keywordtype">double</span>* gt){</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="comment">// m_isGeoRef=true;</span></div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   m_gt[0]=gt[0];</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   m_gt[1]=gt[1];</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   m_gt[2]=gt[2];</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   m_gt[3]=gt[3];</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   m_gt[4]=gt[4];</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   m_gt[5]=gt[5];</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="keywordflow">if</span>(m_gds)</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     m_gds->SetGeoTransform(m_gt);</div>
 <div class="line"><a name="l00266"></a><span class="lineno">  266</span> }</div>
 <div class="line"><a name="l00267"></a><span class="lineno">  267</span> </div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span> <span class="keywordtype">void</span> ImgWriterGdal::setGeoTransform(<span class="keywordtype">double</span>* gt){</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="comment">// m_isGeoRef=true;</span></div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   m_gt[0]=gt[0];</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   m_gt[1]=gt[1];</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   m_gt[2]=gt[2];</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   m_gt[3]=gt[3];</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   m_gt[4]=gt[4];</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   m_gt[5]=gt[5];</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="keywordflow">if</span>(m_gds)</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     m_gds->SetGeoTransform(m_gt);</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span> }</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span> </div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span> <span class="comment">// void ImgWriterGdal::setGeoTransform(double ulx, double uly, double deltaX, double deltaY, double rot1, double rot2)</span></div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span> <span class="comment">//   m_isGeoRef=true;</span></div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span> <span class="comment">//   m_ulx=ulx;</span></div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span> <span class="comment">//   m_uly=uly;</span></div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span> <span class="comment">//   m_delta_x=deltaX;</span></div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span> <span class="comment">//   m_delta_y=deltaY;</span></div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span> <span class="comment">//   double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span> <span class="comment">//   adfGeoTransform[0]=ulx;</span></div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span> <span class="comment">//   adfGeoTransform[1]=deltaX;</span></div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span> <span class="comment">//   adfGeoTransform[2]=rot1;</span></div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span> <span class="comment">//   adfGeoTransform[3]=uly;</span></div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span> <span class="comment">//   adfGeoTransform[4]=rot2;</span></div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span> <span class="comment">//   adfGeoTransform[5]=-deltaY;//convention of GDAL!</span></div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span> <span class="comment">//   if(m_gds)</span></div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span> <span class="comment">//     m_gds->SetGeoTransform(adfGeoTransform);</span></div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span> </div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span> <span class="keywordtype">void</span> ImgWriterGdal::copyGeoTransform(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& imgSrc)</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span> {</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   setProjection(imgSrc.getProjection());</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   imgSrc.getGeoTransform(gt);</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   setGeoTransform(gt);</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>   <span class="comment">// imgSrc.getGeoTransform(ulx,uly,deltaX,deltaY,rot1,rot2);</span></div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   <span class="comment">// setGeoTransform(ulx,uly,deltaX,deltaY,rot1,rot2);</span></div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span> }</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span> <span class="comment">// void ImgWriterGdal::setGeoTransform(double ulx, double uly, double deltaX, double deltaY, double rot1, double rot2)</span></div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span> <span class="comment">//   m_isGeoRef=true;</span></div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span> <span class="comment">//   m_ulx=ulx;</span></div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span> <span class="comment">//   m_uly=uly;</span></div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span> <span class="comment">//   m_delta_x=deltaX;</span></div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span> <span class="comment">//   m_delta_y=deltaY;</span></div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span> <span class="comment">//   double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span> <span class="comment">//   adfGeoTransform[0]=ulx;</span></div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span> <span class="comment">//   adfGeoTransform[1]=deltaX;</span></div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span> <span class="comment">//   adfGeoTransform[2]=rot1;</span></div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span> <span class="comment">//   adfGeoTransform[3]=uly;</span></div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span> <span class="comment">//   adfGeoTransform[4]=rot2;</span></div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span> <span class="comment">//   adfGeoTransform[5]=-deltaY;//convention of GDAL!</span></div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span> <span class="comment">//   if(m_gds)</span></div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span> <span class="comment">//     m_gds->SetGeoTransform(adfGeoTransform);</span></div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span> </div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span> <span class="keywordtype">void</span> ImgWriterGdal::copyGeoTransform(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& imgSrc)</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span> {</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   setProjection(imgSrc.getProjection());</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   imgSrc.getGeoTransform(gt);</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   setGeoTransform(gt);</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="comment">// imgSrc.getGeoTransform(ulx,uly,deltaX,deltaY,rot1,rot2);</span></div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="comment">// setGeoTransform(ulx,uly,deltaX,deltaY,rot1,rot2);</span></div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span> }</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span> </div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span> std::string ImgWriterGdal::setProjectionProj4(<span class="keyword">const</span> std::string& projection)</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span> {</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="comment">// if(!m_isGeoRef)</span></div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="comment">//   m_isGeoRef=true;</span></div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span> </div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   OGRSpatialReference theRef;</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   theRef.SetFromUserInput(projection.c_str());</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="keywordtype">char</span> *wktString;</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   theRef.exportToWkt(&wktString);</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>   assert(m_gds);</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   m_gds->SetProjection(wktString);</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   <span class="keywordflow">return</span>(wktString);</div>
 <div class="line"><a name="l00308"></a><span class="lineno">  308</span> </div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span> std::string ImgWriterGdal::setProjectionProj4(<span class="keyword">const</span> std::string& projection)</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span> {</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   <span class="comment">// if(!m_isGeoRef)</span></div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="comment">//   m_isGeoRef=true;</span></div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span> </div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   OGRSpatialReference theRef;</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   theRef.SetFromUserInput(projection.c_str());</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   <span class="keywordtype">char</span> *wktString;</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   theRef.exportToWkt(&wktString);</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   assert(m_gds);</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   m_gds->SetProjection(wktString);</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="keywordflow">return</span>(wktString);</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span> </div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     <span class="comment">// OGRSpatialReferenceH hSRS;  </span></div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     <span class="comment">// char *pszResult = NULL;  </span></div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   </div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="comment">// CPLErrorReset();  </span></div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>       </div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="comment">// hSRS = OSRNewSpatialReference( NULL );  </span></div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="comment">// if( OSRSetFromUserInput( hSRS, projection.c_str() ) == OGRERR_NONE )  </span></div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     <span class="comment">//     OSRExportToWkt( hSRS, &pszResult );  </span></div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     <span class="comment">// else  </span></div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="comment">// {  </span></div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     <span class="comment">//     std::ostringstream s;</span></div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="comment">//     s << "Error in set projection " << projection;</span></div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     <span class="comment">//     throw(s.str());</span></div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     <span class="comment">// }  </span></div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     <span class="comment">// std::string theProjection=pszResult;</span></div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     <span class="comment">// assert(m_gds);</span></div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     <span class="comment">// m_gds->SetProjection(theProjection.c_str());</span></div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     <span class="comment">// OSRDestroySpatialReference( hSRS );  </span></div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   </div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     <span class="comment">// return theProjection;  </span></div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span> }</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span> </div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span> <span class="keywordtype">void</span> ImgWriterGdal::setProjection(<span class="keyword">const</span> std::string& projection)</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span> {</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   <span class="comment">// if(!m_isGeoRef)</span></div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   <span class="comment">//   m_isGeoRef=true;</span></div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   OGRSpatialReference oSRS;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   <span class="keywordtype">char</span> *pszSRS_WKT = NULL;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   assert(m_gds);</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   m_gds->SetProjection(projection.c_str());</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   CPLFree(pszSRS_WKT);</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span> }</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span> </div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span> <span class="comment">//default projection: ETSR-LAEA</span></div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span> std::string ImgWriterGdal::setProjection(<span class="keywordtype">void</span>)</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span> {</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   std::string theProjection;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   OGRSpatialReference oSRS;</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keywordtype">char</span> *pszSRS_WKT = NULL;</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>   oSRS.SetGeogCS(<span class="stringliteral">"ETRS89"</span>,<span class="stringliteral">"European_Terrestrial_Reference_System_1989"</span>,<span class="stringliteral">"GRS 1980"</span>,6378137,298.2572221010042,<span class="stringliteral">"Greenwich"</span>,0,<span class="stringliteral">"degree"</span>,0.0174532925199433);</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   <span class="comment">// cout << setprecision(16) << "major axis: " << oSRS.GetSemiMajor(NULL) << endl;//notice that major axis can be set to a different value than the default to the well known standard corresponding to the name (European_Terrestrial_Reference_System_1989), but that new value, while recognized by GetSemiMajor, will not be written in the geotiff tag!</span></div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   oSRS.SetProjCS( <span class="stringliteral">"ETRS89 / ETRS-LAEA"</span> );</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   oSRS.SetLAEA(52,10,4321000,3210000);</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   oSRS.exportToWkt( &pszSRS_WKT );</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>   theProjection=pszSRS_WKT;</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   CPLFree( pszSRS_WKT );</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   assert(m_gds);</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   m_gds->SetProjection(theProjection.c_str());</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   <span class="keywordflow">return</span>(theProjection);</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span> }</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span> </div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span> <span class="keywordtype">bool</span> ImgWriterGdal::getBoundingBox(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span> </div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   <span class="comment">//assuming</span></div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span> </div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   ulx=gt[0];</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   uly=gt[3];</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>   lrx=gt[0]+nrOfCol()*gt[1]+nrOfRow()*gt[2];</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   lry=gt[3]+nrOfCol()*gt[4]+nrOfRow()*gt[5];</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="comment">// ulx=m_ulx;</span></div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     <span class="comment">// uly=m_uly;</span></div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="comment">// lrx=ulx+nrOfCol()*m_delta_x;</span></div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     <span class="comment">// lry=uly-nrOfRow()*m_delta_y;</span></div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     <span class="comment">// OGRSpatialReferenceH hSRS;  </span></div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     <span class="comment">// char *pszResult = NULL;  </span></div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   </div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="comment">// CPLErrorReset();  </span></div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       </div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     <span class="comment">// hSRS = OSRNewSpatialReference( NULL );  </span></div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     <span class="comment">// if( OSRSetFromUserInput( hSRS, projection.c_str() ) == OGRERR_NONE )  </span></div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     <span class="comment">//     OSRExportToWkt( hSRS, &pszResult );  </span></div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     <span class="comment">// else  </span></div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="comment">// {  </span></div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="comment">//     std::ostringstream s;</span></div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     <span class="comment">//     s << "Error in set projection " << projection;</span></div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     <span class="comment">//     throw(s.str());</span></div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     <span class="comment">// }  </span></div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     <span class="comment">// std::string theProjection=pszResult;</span></div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="comment">// assert(m_gds);</span></div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="comment">// m_gds->SetProjection(theProjection.c_str());</span></div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="comment">// OSRDestroySpatialReference( hSRS );  </span></div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>   </div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="comment">// return theProjection;  </span></div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span> }</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span> </div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span> <span class="keywordtype">void</span> ImgWriterGdal::setProjection(<span class="keyword">const</span> std::string& projection)</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span> {</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>   <span class="comment">// if(!m_isGeoRef)</span></div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>   <span class="comment">//   m_isGeoRef=true;</span></div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   OGRSpatialReference oSRS;</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <span class="keywordtype">char</span> *pszSRS_WKT = NULL;</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   assert(m_gds);</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>   m_gds->SetProjection(projection.c_str());</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   CPLFree(pszSRS_WKT);</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span> }</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span> </div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span> <span class="comment">//default projection: ETSR-LAEA</span></div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span> <span class="comment">// std::string ImgWriterGdal::setProjection(void)</span></div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span> <span class="comment">//   std::string theProjection;</span></div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span> <span class="comment">//   OGRSpatialReference oSRS;</span></div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span> <span class="comment">//   char *pszSRS_WKT = NULL;</span></div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span> <span class="comment">//   //// oSRS.importFromEPSG(3035);</span></div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span> <span class="comment">//   oSRS.SetGeogCS("ETRS89","European_Terrestrial_Reference_System_1989","GRS 1980",6378137,298.2572221010042,"Greenwich",0,"degree",0.0174532925199433);</span></div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span> <span class="comment">//   // cout << setprecision(16) << "major axis: " << oSRS.GetSemiMajor(NULL) << endl;//notice that major axis can be set to a different value than the default to the well known standard corresponding to the name (European_Terrestrial_Reference_System_1989), but that new value, while recognized by GetSemiMajor, will not be written in the geotiff tag!</span></div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span> <span class="comment">//   oSRS.SetProjCS( "ETRS89 / ETRS-LAEA" );</span></div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span> <span class="comment">//   oSRS.SetLAEA(52,10,4321000,3210000);</span></div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span> <span class="comment">//   oSRS.exportToWkt( &pszSRS_WKT );</span></div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span> <span class="comment">//   theProjection=pszSRS_WKT;</span></div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span> <span class="comment">//   CPLFree( pszSRS_WKT );</span></div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span> <span class="comment">//   assert(m_gds);</span></div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span> <span class="comment">//   m_gds->SetProjection(theProjection.c_str());</span></div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span> <span class="comment">//   return(theProjection);</span></div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span> </div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span> <span class="comment">//filename is ascii file containing 5 columns: index R G B ALFA (0:transparent, 255:solid)</span></div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span> <span class="keywordtype">void</span> ImgWriterGdal::setColorTable(<span class="keyword">const</span> std::string& filename, <span class="keywordtype">int</span> band)</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span> {</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   <span class="comment">//todo: fool proof table in file (no checking currently done...)</span></div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   std::ifstream ftable(filename.c_str(),std::ios::in);</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   std::string line;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span> <span class="comment">//   poCT=new GDALColorTable();</span></div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   GDALColorTable colorTable;</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   <span class="keywordtype">short</span> nline=0;</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   <span class="keywordflow">while</span>(getline(ftable,line)){</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     ++nline;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     std::istringstream ist(line);</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     GDALColorEntry sEntry;</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     <span class="keywordtype">short</span> id;</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     ist >> <span class="keywordtype">id</span> >> sEntry.c1 >> sEntry.c2 >> sEntry.c3 >> sEntry.c4;</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span> <span class="comment">//     poCT->SetColorEntry(id,&sEntry);</span></div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     colorTable.SetColorEntry(<span class="keywordtype">id</span>,&sEntry);</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   }</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   <span class="comment">// assert(nline==colorTable.GetColorEntryCount());</span></div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span> <span class="comment">//   (m_gds->GetRasterBand(band+1))->SetColorTable(poCT);</span></div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>   (m_gds->GetRasterBand(band+1))->SetColorTable(&colorTable);</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span> }</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span> </div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span> <span class="keywordtype">void</span> ImgWriterGdal::setColorTable(GDALColorTable* colorTable, <span class="keywordtype">int</span> band)</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span> {</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   (m_gds->GetRasterBand(band+1))->SetColorTable(colorTable);</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span> }</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span> </div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span> <span class="comment">//write an entire image from memory to file</span></div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span> <span class="keywordtype">bool</span> ImgWriterGdal::writeData(<span class="keywordtype">void</span>* pdata, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> band)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <span class="comment">//fetch raster band</span></div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   GDALRasterBand  *poBand;</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>   <span class="keywordflow">if</span>(band>=nrOfBand()+1){</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     s << <span class="stringliteral">"band ("</span> << band << <span class="stringliteral">") exceeds nrOfBand ("</span> << nrOfBand() << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">throw</span>(s.str());</div>
 <div class="line"><a name="l00397"></a><span class="lineno">  397</span>   }</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     <span class="comment">// ulx=0;</span></div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="comment">// uly=nrOfRow()-1;</span></div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>     <span class="comment">// lrx=nrOfCol()-1;</span></div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     <span class="comment">// lry=0;</span></div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   }</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span> }</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span> </div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span> <span class="keywordtype">bool</span> ImgWriterGdal::getCentrePos(<span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span> </div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>   <span class="comment">//assuming</span></div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>   x=gt[0]+(nrOfCol()/2.0)*gt[1]+(nrOfRow()/2.0)*gt[2];</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>   y=gt[3]+(nrOfCol()/2.0)*gt[4]+(nrOfRow()/2.0)*gt[5];</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     <span class="comment">// x=m_ulx+nrOfCol()/2.0*m_delta_x;</span></div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     <span class="comment">// y=m_uly-nrOfRow()/2.0*m_delta_y;</span></div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>   }</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span> }</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span> </div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span> <span class="keywordtype">bool</span> ImgWriterGdal::geo2image(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y, <span class="keywordtype">double</span>& i, <span class="keywordtype">double</span>& j)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="comment">//double values are returned, caller is responsible for interpolation step</span></div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   <span class="comment">//double values are returned, caller is responsible for interpolation step</span></div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   <span class="comment">//assuming</span></div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>   <span class="keywordtype">double</span> denom=(gt[1]-gt[2]*gt[4]/gt[5]);</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>   <span class="keywordtype">double</span> eps=0.00001;</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>   <span class="keywordflow">if</span>(fabs(denom)>eps){</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     i=(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom;</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     j=(y-gt[3]-gt[4]*(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom)/gt[5];</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>   }</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>     <span class="comment">// double ulx=m_ulx;</span></div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     <span class="comment">// double uly=m_uly;</span></div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>     <span class="comment">// i=(x-ulx)/m_delta_x;</span></div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     <span class="comment">// j=(uly-y)/m_delta_y;</span></div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>   }</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     <span class="comment">// i=x;</span></div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     <span class="comment">// j=nrOfRow()-y;</span></div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>   }</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span> }</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span> </div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span> <span class="comment">//centre of pixel is always returned (regardless of magic pixel reference)!</span></div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span> <span class="keywordtype">bool</span> ImgWriterGdal::image2geo(<span class="keywordtype">double</span> i, <span class="keywordtype">double</span> j, <span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>   m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span> </div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>   <span class="comment">//assuming</span></div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>   <span class="comment">//adfGeotransform[0]: ULX (upper left X coordinate)</span></div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>   <span class="comment">//adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>   <span class="comment">//adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$</span></div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>   <span class="comment">//adfGeotransform[3]: ULY (upper left Y coordinate)</span></div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>   <span class="comment">//adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>   <span class="comment">//adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$</span></div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span> </div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>   x=gt[0]+(0.5+i)*gt[1]+(0.5+j)*gt[2];</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>   y=gt[3]+(0.5+i)*gt[4]+(0.5+j)*gt[5];</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span> </div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>   <span class="keywordflow">if</span>(isGeoRef()){</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     <span class="comment">// x=m_ulx+(0.5+i)*m_delta_x;</span></div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     <span class="comment">// y=m_uly-(0.5+j)*m_delta_y;</span></div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>   }</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span> }</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span> </div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span> <span class="keywordtype">bool</span> ImgWriterGdal::covers(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span>  y)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>   <span class="keywordtype">double</span> theULX, theULY, theLRX, theLRY;</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>   getBoundingBox(theULX,theULY,theLRX,theLRY);</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>   <span class="keywordflow">return</span>((x > theULX)&&</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>      (x < theLRX)&&</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>      (y < theULY)&&</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>      (y >theLRY));</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span> }</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span> </div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span> <span class="keywordtype">bool</span> ImgWriterGdal::covers(<span class="keywordtype">double</span> ulx, <span class="keywordtype">double</span>  uly, <span class="keywordtype">double</span> lrx, <span class="keywordtype">double</span> lry)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>   <span class="keywordtype">double</span> theULX, theULY, theLRX, theLRY;</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>   getBoundingBox(theULX,theULY,theLRX,theLRY);</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   <span class="keywordflow">return</span>((ulx < theLRX)&&(lrx > theULX)&&(lry < theULY)&&(uly > theLRY));</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span> }</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span> </div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span> std::string ImgWriterGdal::getGeoTransform()<span class="keyword"> const</span></div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>   <span class="keywordflow">if</span>(m_gds)</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>     m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="keywordflow">else</span>{<span class="comment">//virtual writer</span></div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     gt[0]=m_gt[0];</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     gt[1]=m_gt[1];</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     gt[2]=m_gt[2];</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     gt[3]=m_gt[3];</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     gt[4]=m_gt[4];</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     gt[5]=m_gt[5];</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   }</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   std::ostringstream s;</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   s << <span class="stringliteral">"["</span> << gt[0] << <span class="stringliteral">","</span> << gt[1] << <span class="stringliteral">","</span> << gt[2] << <span class="stringliteral">","</span> << gt[3] << <span class="stringliteral">","</span> << gt[4] << <span class="stringliteral">",& [...]
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="keywordflow">return</span>(s.str());</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span> }</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span> </div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span> <span class="keywordtype">void</span> ImgWriterGdal::getGeoTransform(<span class="keywordtype">double</span>* gt)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   <span class="keywordflow">if</span>(m_gds)</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     m_gds->GetGeoTransform(gt);</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <span class="keywordflow">else</span>{<span class="comment">//virtual writer</span></div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     gt[0]=m_gt[0];</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     gt[1]=m_gt[1];</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     gt[2]=m_gt[2];</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     gt[3]=m_gt[3];</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     gt[4]=m_gt[4];</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     gt[5]=m_gt[5];</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>   }</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span> }</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span> </div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span> <span class="comment">// void ImgWriterGdal::getGeoTransform(double& ulx, double& uly, double& deltaX, double& deltaY, double& rot1, double& rot2) const</span></div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span> <span class="comment">//   if(m_gds){</span></div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span> <span class="comment">//     double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span> <span class="comment">//     m_gds->GetGeoTransform(adfGeoTransform);</span></div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span> <span class="comment">//     ulx=adfGeoTransform[0];</span></div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span> <span class="comment">//     deltaX=adfGeoTransform[1];</span></div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span> <span class="comment">//     rot1=adfGeoTransform[2];</span></div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span> <span class="comment">//     uly=adfGeoTransform[3];</span></div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span> <span class="comment">//     rot2=adfGeoTransform[4];</span></div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span> <span class="comment">//     deltaY=-adfGeoTransform[5];//convention of GDAL!</span></div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span> <span class="comment">//   else{//virtual writer</span></div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span> <span class="comment">//     ulx=m_ulx;</span></div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span> <span class="comment">//     uly=m_uly;</span></div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span> <span class="comment">//     deltaX=m_delta_x;</span></div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span> <span class="comment">//     deltaY=m_delta_y;</span></div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span> <span class="comment">//     rot1=0;</span></div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span> <span class="comment">//     rot2=0;</span></div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span> </div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span> GDALDataType ImgWriterGdal::getDataType(<span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>   assert(band<m_nband+1);</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>   <span class="keywordflow">return</span> (m_gds->GetRasterBand(band+1))->GetRasterDataType();</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span> }</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span> </div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span> GDALRasterBand* ImgWriterGdal::getRasterBand(<span class="keywordtype">int</span> band)</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span> {</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   assert(band<m_nband+1);</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   <span class="keywordflow">return</span> (m_gds->GetRasterBand(band+1));</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span> }</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span> </div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span> <span class="comment">//filename is ascii file containing 5 columns: index R G B ALFA (0:transparent, 255:solid)</span></div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span> <span class="keywordtype">void</span> ImgWriterGdal::setColorTable(<span class="keyword">const</span> std::string& filename, <span class="keywordtype">int</span> band)</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span> {</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>   <span class="comment">//todo: fool proof table in file (no checking currently done...)</span></div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   std::ifstream ftable(filename.c_str(),std::ios::in);</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   std::string line;</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span> <span class="comment">//   poCT=new GDALColorTable();</span></div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   GDALColorTable colorTable;</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   <span class="keywordtype">short</span> nline=0;</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   <span class="keywordflow">while</span>(getline(ftable,line)){</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     ++nline;</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     std::istringstream ist(line);</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     GDALColorEntry sEntry;</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     <span class="keywordtype">short</span> id;</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     ist >> <span class="keywordtype">id</span> >> sEntry.c1 >> sEntry.c2 >> sEntry.c3 >> sEntry.c4;</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span> <span class="comment">//     poCT->SetColorEntry(id,&sEntry);</span></div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     colorTable.SetColorEntry(<span class="keywordtype">id</span>,&sEntry);</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>   }</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>   <span class="comment">// assert(nline==colorTable.GetColorEntryCount());</span></div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span> <span class="comment">//   (m_gds->GetRasterBand(band+1))->SetColorTable(poCT);</span></div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   (m_gds->GetRasterBand(band+1))->SetColorTable(&colorTable);</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span> }</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span> </div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span> <span class="keywordtype">void</span> ImgWriterGdal::setColorTable(GDALColorTable* colorTable, <span class="keywordtype">int</span> band)</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span> {</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   (m_gds->GetRasterBand(band+1))->SetColorTable(colorTable);</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span> }</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span> </div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span> <span class="comment">//write an entire image from memory to file</span></div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span> <span class="keywordtype">bool</span> ImgWriterGdal::writeData(<span class="keywordtype">void</span>* pdata, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> band)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>   <span class="comment">//fetch raster band</span></div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>   GDALRasterBand  *poBand;</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>   <span class="keywordflow">if</span>(band>=nrOfBand()+1){</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     s << <span class="stringliteral">"band ("</span> << band << <span class="stringliteral">") exceeds nrOfBand ("</span> << nrOfBand() << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>   }</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>   poBand->RasterIO(GF_Write,0,0,nrOfCol(),nrOfRow(),pdata,nrOfCol(),nrOfRow(),dataType,0,0);</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>   <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span> }  </div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span> </div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span> <span class="keywordtype">void</span> ImgWriterGdal::rasterizeOgr(<a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a>& ogrReader, <span class="keyword">const</span> std::vector<double>& burnValues, <span class="keyword">const</span> std::vector<std::string>& layernames ){</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>   std::vector<int> bands;</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>   std::vector<double> burnBands;<span class="comment">//burn values for all bands in a single layer</span></div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>   std::vector<double> burnLayers;<span class="comment">//burn values for all bands and all layers</span></div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>   <span class="keywordflow">if</span>(burnValues.empty()){</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     std::string errorString=<span class="stringliteral">"Error: burn values not provided"</span>;</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>   }</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>   burnBands=burnValues;</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>   <span class="keywordflow">while</span>(burnBands.size()<nrOfBand())</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     burnBands.push_back(burnValues[0]);</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nrOfBand();++iband)</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     bands.push_back(iband+1);</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>   std::vector<OGRLayerH> layers;</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   <span class="keywordtype">int</span> nlayer=0;</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<ogrReader.getLayerCount();++ilayer){</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     std::string currentLayername=ogrReader.getLayer(ilayer)->GetName();</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="keywordflow">if</span>(layernames.size())</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       <span class="keywordflow">if</span>(find(layernames.begin(),layernames.end(),currentLayername)==layernames.end())</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     std::cout << <span class="stringliteral">"processing layer "</span> << currentLayername << std::endl;</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     layers.push_back((OGRLayerH)ogrReader.getLayer(ilayer));</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     ++nlayer;</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nrOfBand();++iband)</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       burnLayers.insert(burnLayers.end(),burnBands.begin(),burnBands.end());</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>   }</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   <span class="keywordtype">void</span> *pTransformArg;</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>   <span class="keywordtype">char</span> **papszOptions;</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   <span class="keywordtype">double</span> dfComplete=0.0;</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>   pfnProgress(dfComplete,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>   <span class="keywordflow">if</span>(GDALRasterizeLayers( (GDALDatasetH)m_gds,nrOfBand(),&(bands[0]),layers.size(),&(layers[0]),NULL,pTransformArg,&(burnLayers[0]),papszOptions,pfnProgress,pProgressArg)!=CE_None){</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     std::cerr << CPLGetLastErrorMsg() << std::endl;</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     exit(1);</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   }</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     dfComplete=1.0;</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     pfnProgress(dfComplete,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>   }</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   poBand->RasterIO(GF_Write,0,0,nrOfCol(),nrOfRow(),pdata,nrOfCol(),nrOfRow(),dataType,0,0);</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>   <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span> }  </div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span> </div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span> <span class="keywordtype">void</span> ImgWriterGdal::rasterizeOgr(<a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a>& ogrReader, <span class="keyword">const</span> std::vector<double>& burnValues, <span class="keyword">const</span> std::vector<std::string>& layernames ){</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   std::vector<int> bands;</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>   std::vector<double> burnBands;<span class="comment">//burn values for all bands in a single layer</span></div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>   std::vector<double> burnLayers;<span class="comment">//burn values for all bands and all layers</span></div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>   <span class="keywordflow">if</span>(burnValues.empty()){</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     std::string errorString=<span class="stringliteral">"Error: burn values not provided"</span>;</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   }</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>   burnBands=burnValues;</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>   <span class="keywordflow">while</span>(burnBands.size()<nrOfBand())</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     burnBands.push_back(burnValues[0]);</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nrOfBand();++iband)</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     bands.push_back(iband+1);</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>   std::vector<OGRLayerH> layers;</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>   <span class="keywordtype">int</span> nlayer=0;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<ogrReader.getLayerCount();++ilayer){</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     std::string currentLayername=ogrReader.getLayer(ilayer)->GetName();</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     <span class="keywordflow">if</span>(layernames.size())</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       <span class="keywordflow">if</span>(find(layernames.begin(),layernames.end(),currentLayername)==layernames.end())</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     std::cout << <span class="stringliteral">"processing layer "</span> << currentLayername << std::endl;</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     layers.push_back((OGRLayerH)ogrReader.getLayer(ilayer));</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     ++nlayer;</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nrOfBand();++iband)</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       burnLayers.insert(burnLayers.end(),burnBands.begin(),burnBands.end());</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>   }</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>   <span class="keywordtype">void</span> *pTransformArg;</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   <span class="keywordtype">char</span> **papszOptions;</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   <span class="keywordtype">double</span> dfComplete=0.0;</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   pfnProgress(dfComplete,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   <span class="keywordflow">if</span>(GDALRasterizeLayers( (GDALDatasetH)m_gds,nrOfBand(),&(bands[0]),layers.size(),&(layers[0]),NULL,pTransformArg,&(burnLayers[0]),papszOptions,pfnProgress,pProgressArg)!=CE_None){</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     std::cerr << CPLGetLastErrorMsg() << std::endl;</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>     exit(1);</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   }</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     dfComplete=1.0;</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     pfnProgress(dfComplete,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>   }</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span> }</div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgWriterGdal_8h_source.html b/doc/html/ImgWriterGdal_8h_source.html
index c2b09b2..1c05e72 100644
--- a/doc/html/ImgWriterGdal_8h_source.html
+++ b/doc/html/ImgWriterGdal_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,221 +79,195 @@
 <div class="line"><a name="l00025"></a><span class="lineno">   25</span> <span class="preprocessor">#include <string></span></div>
 <div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="preprocessor">#include <sstream></span></div>
 <div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="preprocessor">#include "gdal_priv.h"</span></div>
-<div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="preprocessor">#include "ImgReaderGdal.h"</span></div>
-<div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="preprocessor">#include "ImgReaderOgr.h"</span></div>
-<div class="line"><a name="l00030"></a><span class="lineno">   30</span> </div>
-<div class="line"><a name="l00031"></a><span class="lineno">   31</span> <span class="comment">//--------------------------------------------------------------------------</span></div>
-<div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="classImgWriterGdal.html">   32</a></span> <span class="keyword">class </span><a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a></div>
-<div class="line"><a name="l00033"></a><span class="lineno">   33</span> {</div>
-<div class="line"><a name="l00034"></a><span class="lineno">   34</span> <span class="keyword">public</span>:</div>
-<div class="line"><a name="l00035"></a><span class="lineno">   35</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>(<span class="keywordtype">void</span>);</div>
-<div class="line"><a name="l00036"></a><span class="lineno">   36</span>   ~<a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>(<span class="keywordtype">void</span>);</div>
-<div class="line"><a name="l00037"></a><span class="lineno">   37</span>   <span class="keywordtype">void</span> open(<span class="keyword">const</span> std::string& filename);</div>
-<div class="line"><a name="l00038"></a><span class="lineno">   38</span>   <span class="keywordtype">void</span> open(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& imgSrc, <span class="keyword">const</span> std::vector<std::string>& options=std::vector<std::string>());</div>
-<div class="line"><a name="l00039"></a><span class="lineno">   39</span>   <span class="comment">// void open(const std::string& filename, int ncol, int nrow, int nband, const GDALDataType& dataType, const std::string& imageType="GTiff", const std::string& interleave="BAND", const std::string& compression="LZW", int magicX=1, int magicY=1);</span></div>
+<div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="preprocessor">#include "ImgRasterGdal.h"</span></div>
+<div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="preprocessor">#include "ImgReaderGdal.h"</span></div>
+<div class="line"><a name="l00030"></a><span class="lineno">   30</span> <span class="preprocessor">#include "ImgReaderOgr.h"</span></div>
+<div class="line"><a name="l00031"></a><span class="lineno">   31</span> </div>
+<div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="comment">//--------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="classImgWriterGdal.html">   33</a></span> <span class="keyword">class </span><a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> : <span class="keyword">public</span> <span class="keyword">virtual</span> <a class="code" href="classImgRasterGdal.html">ImgRasterGdal</a></div>
+<div class="line"><a name="l00034"></a><span class="lineno">   34</span> {</div>
+<div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00037"></a><span class="lineno">   37</span>   ~<a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>(<span class="keywordtype">void</span>);</div>
+<div class="line"><a name="l00038"></a><span class="lineno">   38</span>   <span class="keywordtype">void</span> open(<span class="keyword">const</span> std::string& filename);</div>
+<div class="line"><a name="l00039"></a><span class="lineno">   39</span>   <span class="keywordtype">void</span> open(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& imgSrc, <span class="keyword">const</span> std::vector<std::string>& options=std::vector<std::string>());</div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span>   <span class="keywordtype">void</span> open(<span class="keyword">const</span> std::string& filename, <span class="keywordtype">int</span> ncol, <span class="keywordtype">int</span> nrow, <span class="keywordtype">int</span> nband, <span class="keyword">const</span> GDALDataType& dataType, <span class="keyword">const</span> std::string& imageType, <span class="keyword">const</span> std::vector<s [...]
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>   <span class="keywordtype">void</span> close(<span class="keywordtype">void</span>);</div>
-<div class="line"><a name="l00042"></a><span class="lineno">   42</span>   std::string getFileName()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_filename;};</div>
-<div class="line"><a name="l00043"></a><span class="lineno">   43</span>   <span class="keywordtype">int</span> nrOfCol(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_ncol;};</div>
-<div class="line"><a name="l00044"></a><span class="lineno">   44</span>   <span class="keywordtype">int</span> nrOfRow(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_nrow;};</div>
-<div class="line"><a name="l00045"></a><span class="lineno">   45</span>   <span class="keywordtype">int</span> nrOfBand(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_nband;};</div>
-<div class="line"><a name="l00046"></a><span class="lineno">   46</span>   <span class="keywordtype">void</span> copyGeoTransform(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& imgSrc);</div>
-<div class="line"><a name="l00047"></a><span class="lineno">   47</span>   std::string setProjection(<span class="keywordtype">void</span>);<span class="comment">//set (and return) default projection ETSR-LAEA</span></div>
-<div class="line"><a name="l00048"></a><span class="lineno">   48</span>   <span class="keywordtype">void</span> setProjection(<span class="keyword">const</span> std::string& projection);</div>
-<div class="line"><a name="l00049"></a><span class="lineno">   49</span>   std::string setProjectionProj4(<span class="keyword">const</span> std::string& projection);</div>
-<div class="line"><a name="l00050"></a><span class="lineno">   50</span>   <span class="keywordtype">void</span> setImageDescription(<span class="keyword">const</span> std::string& imageDescription){m_gds->SetMetadataItem( <span class="stringliteral">"TIFFTAG_IMAGEDESCRIPTION"</span>,imageDescription.c_str());};</div>
-<div class="line"><a name="l00051"></a><span class="lineno">   51</span>   CPLErr GDALSetNoDataValue(<span class="keywordtype">double</span> noDataValue, <span class="keywordtype">int</span> band=0) {<span class="keywordflow">return</span> getRasterBand(band)->SetNoDataValue(noDataValue);};</div>
-<div class="line"><a name="l00052"></a><span class="lineno">   52</span>   std::string getProjection(<span class="keywordtype">void</span>) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00053"></a><span class="lineno">   53</span>   std::string getGeoTransform() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00054"></a><span class="lineno">   54</span>   <span class="keywordtype">void</span> getGeoTransform(<span class="keywordtype">double</span>* gt) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00055"></a><span class="lineno">   55</span>   <span class="keywordtype">void</span> setGeoTransform(<span class="keywordtype">double</span>* gt);</div>
-<div class="line"><a name="l00056"></a><span class="lineno">   56</span>   <span class="comment">/* void setGeoTransform(double ulx, double uly, double deltaX, double deltaY, double rot1=0, double rot2=0); */</span></div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>   <span class="comment">/* void getGeoTransform(double& ulx, double& uly, double& deltaX, double& deltaY, double& rot1, double& rot2) const; */</span></div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>   <span class="keywordtype">bool</span> getBoundingBox(<span class="keywordtype">double</span>& ulx, <span class="keywordtype">double</span>& uly, <span class="keywordtype">double</span>& lrx, <span class="keywordtype">double</span>& lry) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>   <span class="keywordtype">bool</span> getCentrePos(<span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span>   <span class="keywordtype">bool</span> covers(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="keywordtype">bool</span> covers(<span class="keywordtype">double</span> ulx, <span class="keywordtype">double</span>  uly, <span class="keywordtype">double</span> lrx, <span class="keywordtype">double</span> lry) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>   <span class="keywordtype">bool</span> geo2image(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y, <span class="keywordtype">double</span>& i, <span class="keywordtype">double</span>& j) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>   <span class="keywordtype">bool</span> image2geo(<span class="keywordtype">double</span> i, <span class="keywordtype">double</span> j, <span class="keywordtype">double</span>& x, <span class="keywordtype">double</span>& y) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>   <span class="keywordtype">bool</span> isGeoRef()<span class="keyword"> const </span>{<span class="keywordtype">double</span> gt[6];getGeoTransform(gt);<span class="keywordflow">if</span>(gt[5]<0) <span class="keywordflow">return</span> <span class="keyword">true</span>;<span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;};</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>   <span class="comment">// void getMagicPixel(double& x, double& y) const {x=m_magic_x;y=m_magic_y;};</span></div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>   <span class="keywordtype">double</span> getDeltaX(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordtype">double</span> gt[6];getGeoTransform(gt);<span class="keywordflow">return</span> gt[1];};</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>   <span class="keywordtype">double</span> getDeltaY(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordtype">double</span> gt[6];getGeoTransform(gt);<span class="keywordflow">return</span> -gt[5];};</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> writeData(T& value, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> col, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> writeData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <spa [...]
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> writeData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   <span class="keywordtype">bool</span> writeData(<span class="keywordtype">void</span>* pdata, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> writeDataBlock(<a class="code" href="classVector2d.html">Vector2d<T></a>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> minRow [...]
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <span class="comment">// std::string getInterleave(){return m_interleave;};</span></div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <span class="comment">// std::string getCompression(){return m_compression;};</span></div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   GDALDataType getDataType(<span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   GDALRasterBand* getRasterBand(<span class="keywordtype">int</span> band);</div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <span class="keywordtype">void</span> setColorTable(<span class="keyword">const</span> std::string& filename, <span class="keywordtype">int</span> band=0);</div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <span class="keywordtype">void</span> setColorTable(GDALColorTable* colorTable, <span class="keywordtype">int</span> band=0);</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <span class="keywordtype">void</span> setMetadata(<span class="keywordtype">char</span>** metadata);</div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <span class="keywordtype">void</span> rasterizeOgr(<a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a>& ogrReader, <span class="keyword">const</span> std::vector<double>& burnValues=std::vector<double>(), <span class="keyword">const</span> std::vector<std::string>& layernames=std::vector<std::string>());</div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span> </div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span> <span class="keyword">protected</span>:</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <span class="keywordtype">void</span> setCodec(<span class="keyword">const</span> std::string& imageType);</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <span class="keywordtype">void</span> setCodec(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& ImgSrc);</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span> </div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   std::string m_filename;</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   GDALDataset *m_gds;</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <span class="keywordtype">int</span> m_ncol;</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <span class="keywordtype">int</span> m_nrow;</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <span class="keywordtype">int</span> m_nband;</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   GDALDataType m_type;</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <span class="keywordtype">double</span> m_gt[6];</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <span class="comment">/* double m_ulx; */</span></div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <span class="comment">/* double m_uly; */</span></div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <span class="comment">/* double m_delta_x; */</span></div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <span class="comment">/* double m_delta_y; */</span></div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <span class="comment">/* bool m_isGeoRef; */</span></div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <span class="comment">// std::string m_interleave;</span></div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <span class="comment">// std::string m_compression;</span></div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   std::vector<std::string> m_options;</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span> };</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span> </div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> ImgWriterGdal::writeData(T& value, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> col, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <span class="comment">//fetch raster band</span></div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   GDALRasterBand  *poBand;</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <span class="keywordflow">if</span>(band>=nrOfBand()+1){</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>     s << <span class="stringliteral">"band ("</span> << band << <span class="stringliteral">") exceeds nrOfBand ("</span> << nrOfBand() << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   }</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <span class="keywordflow">if</span>(col>=nrOfCol()){</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>     s << <span class="stringliteral">"col ("</span> << col << <span class="stringliteral">") exceeds nrOfCol ("</span> << nrOfCol() << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   }</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <span class="keywordflow">if</span>(col<0){</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     s << <span class="stringliteral">"col ("</span> << col << <span class="stringliteral">") is negative"</span>;</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   }</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <span class="keywordflow">if</span>(row>=nrOfRow()){</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     s << <span class="stringliteral">"row ("</span> << row << <span class="stringliteral">") exceeds nrOfRow ("</span> << nrOfRow() << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   }</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <span class="keywordflow">if</span>(row<0){</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     s << <span class="stringliteral">"row ("</span> << row << <span class="stringliteral">") is negative"</span>;</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   }</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   poBand->RasterIO(GF_Write,col,row,1,1,&value,1,1,dataType,0,0);</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span> }</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span> </div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> ImgWriterGdal::writeData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span>  [...]
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <span class="comment">//fetch raster band</span></div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   GDALRasterBand  *poBand;</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <span class="keywordflow">if</span>(band>=nrOfBand()+1){</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     s << <span class="stringliteral">"band ("</span> << band << <span class="stringliteral">") exceeds nrOfBand ("</span> << nrOfBand() << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   }</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <span class="keywordflow">if</span>(buffer.size()!=maxCol-minCol+1){</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     std::string errorstring=<span class="stringliteral">"invalid buffer size"</span>;</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   }</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <span class="keywordflow">if</span>(minCol>=nrOfCol()){</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     s << <span class="stringliteral">"minCol ("</span> << minCol << <span class="stringliteral">") exceeds nrOfCol ("</span> << nrOfCol() << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   }</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="keywordflow">if</span>(minCol<0){</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     s << <span class="stringliteral">"mincol ("</span> << minCol << <span class="stringliteral">") is negative"</span>;</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   }</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <span class="keywordflow">if</span>(maxCol>=nrOfCol()){</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     s << <span class="stringliteral">"maxCol ("</span> << maxCol << <span class="stringliteral">") exceeds nrOfCol ("</span> << nrOfCol() << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   }</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <span class="keywordflow">if</span>(maxCol<minCol){</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     s << <span class="stringliteral">"maxCol ("</span> << maxCol << <span class="stringliteral">") is less than minCol ("</span> << minCol << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   }</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span> </div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <span class="keywordflow">if</span>(row>=nrOfRow()){</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     s << <span class="stringliteral">"row ("</span> << row << <span class="stringliteral">") exceeds nrOfRow ("</span> << nrOfRow() << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   }</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="keywordflow">if</span>(row<0){</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     s << <span class="stringliteral">"row ("</span> << row << <span class="stringliteral">") is negative"</span>;</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   }</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   poBand->RasterIO(GF_Write,minCol,row,buffer.size(),1,&(buffer[0]),buffer.size(),1,dataType,0,0);</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span> }</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span> </div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> ImgWriterGdal::writeData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="comment">//fetch raster band</span></div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   GDALRasterBand  *poBand;</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordflow">if</span>(band>=nrOfBand()+1){</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     s << <span class="stringliteral">"band ("</span> << band << <span class="stringliteral">") exceeds nrOfBand ("</span> << nrOfBand() << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   }</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   <span class="keywordflow">if</span>(buffer.size()!=nrOfCol()){</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     std::string errorstring=<span class="stringliteral">"invalid buffer size"</span>;</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   }</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <span class="keywordflow">if</span>(row>=nrOfRow()){</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     s << <span class="stringliteral">"row ("</span> << row << <span class="stringliteral">") exceeds nrOfRow ("</span> << nrOfRow() << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   }</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   poBand->RasterIO(GF_Write,0,row,buffer.size(),1,&(buffer[0]),buffer.size(),1,dataType,0,0);</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span> }</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span> </div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> ImgWriterGdal::writeDataBlock(<a class="code" href="classVector2d.html">Vector2d<T></a>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int< [...]
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   <span class="comment">//fetch raster band</span></div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   GDALRasterBand  *poBand;</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordflow">if</span>(band>=nrOfBand()+1){</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     s << <span class="stringliteral">"band ("</span> << band << <span class="stringliteral">") exceeds nrOfBand ("</span> << nrOfBand() << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   }</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   assert(buffer.size()==maxRow-minRow+1);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=minRow;irow<=maxRow;++irow)</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     writeData(buffer[irow-minRow], dataType, minCol, maxCol, irow, band);</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span> }</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span> </div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span> <span class="preprocessor">#endif // _IMGWRITERGDAL_H_</span></div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span> <span class="preprocessor"></span></div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span> </div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span> <span class="comment">//     adfGeoTransform[0] /* top left x */</span></div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span> <span class="comment">//     adfGeoTransform[1] /* w-e pixel resolution */</span></div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span> <span class="comment">//     adfGeoTransform[2] /* rotation, 0 if image is "north up" */</span></div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span> <span class="comment">//     adfGeoTransform[3] /* top left y */</span></div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span> <span class="comment">//     adfGeoTransform[4] /* rotation, 0 if image is "north up" */</span></div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span> <span class="comment">//     adfGeoTransform[5] /* n-s pixel resolution */</span></div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="line"><a name="l00042"></a><span class="lineno">   42</span> </div>
+<div class="line"><a name="l00043"></a><span class="lineno">   43</span>   <span class="keywordtype">void</span> copyGeoTransform(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& imgSrc);</div>
+<div class="line"><a name="l00044"></a><span class="lineno">   44</span>   <span class="keywordtype">void</span> setProjection(<span class="keyword">const</span> std::string& projection);</div>
+<div class="line"><a name="l00045"></a><span class="lineno">   45</span>   std::string setProjectionProj4(<span class="keyword">const</span> std::string& projection);</div>
+<div class="line"><a name="l00046"></a><span class="lineno">   46</span> </div>
+<div class="line"><a name="l00047"></a><span class="lineno">   47</span>   <span class="keywordtype">void</span> setImageDescription(<span class="keyword">const</span> std::string& imageDescription){m_gds->SetMetadataItem( <span class="stringliteral">"TIFFTAG_IMAGEDESCRIPTION"</span>,imageDescription.c_str());};</div>
+<div class="line"><a name="l00048"></a><span class="lineno">   48</span>   <span class="keywordtype">void</span> setGeoTransform(<span class="keywordtype">double</span>* gt);</div>
+<div class="line"><a name="l00049"></a><span class="lineno">   49</span> </div>
+<div class="line"><a name="l00050"></a><span class="lineno">   50</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> writeData(T& value, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> col, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00051"></a><span class="lineno">   51</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> writeData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <spa [...]
+<div class="line"><a name="l00052"></a><span class="lineno">   52</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> writeData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00053"></a><span class="lineno">   53</span>   <span class="keywordtype">bool</span> writeData(<span class="keywordtype">void</span>* pdata, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> band=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00054"></a><span class="lineno">   54</span>   <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> writeDataBlock(<a class="code" href="classVector2d.html">Vector2d<T></a>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> minRow [...]
+<div class="line"><a name="l00055"></a><span class="lineno">   55</span>   <span class="comment">// std::string getInterleave(){return m_interleave;};</span></div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>   <span class="comment">// std::string getCompression(){return m_compression;};</span></div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span>   <span class="keywordtype">void</span> setColorTable(<span class="keyword">const</span> std::string& filename, <span class="keywordtype">int</span> band=0);</div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>   <span class="keywordtype">void</span> setColorTable(GDALColorTable* colorTable, <span class="keywordtype">int</span> band=0);</div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>   <span class="keywordtype">void</span> setMetadata(<span class="keywordtype">char</span>** metadata);</div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span>   <span class="keywordtype">void</span> rasterizeOgr(<a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a>& ogrReader, <span class="keyword">const</span> std::vector<double>& burnValues=std::vector<double>(), <span class="keyword">const</span> std::vector<std::string>& layernames=std::vector<std::string>());</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span> </div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>   <span class="keywordtype">void</span> setCodec(<span class="keyword">const</span> GDALDataType& dataType, <span class="keyword">const</span> std::string& imageType);</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>   <span class="keywordtype">void</span> setCodec(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& ImgSrc);</div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span> </div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>   <span class="comment">/* double m_ulx; */</span></div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>   <span class="comment">/* double m_uly; */</span></div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>   <span class="comment">/* double m_delta_x; */</span></div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   <span class="comment">/* double m_delta_y; */</span></div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   <span class="comment">/* bool m_isGeoRef; */</span></div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   <span class="comment">// std::string m_interleave;</span></div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>   <span class="comment">// std::string m_compression;</span></div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   std::vector<std::string> m_options;</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span> };</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span> </div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> ImgWriterGdal::writeData(T& value, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> col, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <span class="comment">//fetch raster band</span></div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   GDALRasterBand  *poBand;</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <span class="keywordflow">if</span>(band>=nrOfBand()+1){</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>     s << <span class="stringliteral">"band ("</span> << band << <span class="stringliteral">") exceeds nrOfBand ("</span> << nrOfBand() << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   }</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <span class="keywordflow">if</span>(col>=nrOfCol()){</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>     s << <span class="stringliteral">"col ("</span> << col << <span class="stringliteral">") exceeds nrOfCol ("</span> << nrOfCol() << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   }</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <span class="keywordflow">if</span>(col<0){</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>     s << <span class="stringliteral">"col ("</span> << col << <span class="stringliteral">") is negative"</span>;</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   }</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <span class="keywordflow">if</span>(row>=nrOfRow()){</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>     s << <span class="stringliteral">"row ("</span> << row << <span class="stringliteral">") exceeds nrOfRow ("</span> << nrOfRow() << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   }</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <span class="keywordflow">if</span>(row<0){</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     s << <span class="stringliteral">"row ("</span> << row << <span class="stringliteral">") is negative"</span>;</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   }</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   poBand->RasterIO(GF_Write,col,row,1,1,&value,1,1,dataType,0,0);</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span> }</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span> </div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> ImgWriterGdal::writeData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span>  [...]
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <span class="comment">//fetch raster band</span></div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   GDALRasterBand  *poBand;</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <span class="keywordflow">if</span>(band>=nrOfBand()+1){</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>     s << <span class="stringliteral">"band ("</span> << band << <span class="stringliteral">") exceeds nrOfBand ("</span> << nrOfBand() << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   }</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <span class="keywordflow">if</span>(buffer.size()!=maxCol-minCol+1){</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     std::string errorstring=<span class="stringliteral">"invalid buffer size"</span>;</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   }</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <span class="keywordflow">if</span>(minCol>=nrOfCol()){</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     s << <span class="stringliteral">"minCol ("</span> << minCol << <span class="stringliteral">") exceeds nrOfCol ("</span> << nrOfCol() << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   }</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <span class="keywordflow">if</span>(minCol<0){</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     s << <span class="stringliteral">"mincol ("</span> << minCol << <span class="stringliteral">") is negative"</span>;</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   }</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <span class="keywordflow">if</span>(maxCol>=nrOfCol()){</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     s << <span class="stringliteral">"maxCol ("</span> << maxCol << <span class="stringliteral">") exceeds nrOfCol ("</span> << nrOfCol() << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   }</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <span class="keywordflow">if</span>(maxCol<minCol){</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     s << <span class="stringliteral">"maxCol ("</span> << maxCol << <span class="stringliteral">") is less than minCol ("</span> << minCol << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   }</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span> </div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <span class="keywordflow">if</span>(row>=nrOfRow()){</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     s << <span class="stringliteral">"row ("</span> << row << <span class="stringliteral">") exceeds nrOfRow ("</span> << nrOfRow() << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   }</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <span class="keywordflow">if</span>(row<0){</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     s << <span class="stringliteral">"row ("</span> << row << <span class="stringliteral">") is negative"</span>;</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   }</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   poBand->RasterIO(GF_Write,minCol,row,buffer.size(),1,&(buffer[0]),buffer.size(),1,dataType,0,0);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span> }</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span> </div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> ImgWriterGdal::writeData(std::vector<T>& buffer, <span class="keyword">const</span> GDALDataType& dataType, <span class="keywordtype">int</span> row, <span class="keywordtype">int</span> band)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <span class="comment">//fetch raster band</span></div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   GDALRasterBand  *poBand;</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <span class="keywordflow">if</span>(band>=nrOfBand()+1){</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     s << <span class="stringliteral">"band ("</span> << band << <span class="stringliteral">") exceeds nrOfBand ("</span> << nrOfBand() << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   }</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <span class="keywordflow">if</span>(buffer.size()!=nrOfCol()){</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     std::string errorstring=<span class="stringliteral">"invalid buffer size"</span>;</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   }</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <span class="keywordflow">if</span>(row>=nrOfRow()){</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     s << <span class="stringliteral">"row ("</span> << row << <span class="stringliteral">") exceeds nrOfRow ("</span> << nrOfRow() << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   }</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   poBand->RasterIO(GF_Write,0,row,buffer.size(),1,&(buffer[0]),buffer.size(),1,dataType,0,0);</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span> }</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span> </div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> ImgWriterGdal::writeDataBlock(<a class="code" href="classVector2d.html">Vector2d<T></a>& buffer, <span class="keyword">const</span> GDALDataType& dataType , <span class="keywordtype">int</span> minCol, <span class="keywordtype">int</span> maxCol, <span class="keywordtype">int< [...]
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   <span class="comment">//fetch raster band</span></div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   GDALRasterBand  *poBand;</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   <span class="keywordflow">if</span>(band>=nrOfBand()+1){</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     s << <span class="stringliteral">"band ("</span> << band << <span class="stringliteral">") exceeds nrOfBand ("</span> << nrOfBand() << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   }</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   poBand = m_gds->GetRasterBand(band+1);<span class="comment">//GDAL uses 1 based index</span></div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   assert(buffer.size()==maxRow-minRow+1);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=minRow;irow<=maxRow;++irow)</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     writeData(buffer[irow-minRow], dataType, minCol, maxCol, irow, band);</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span> }</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span> </div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span> <span class="preprocessor">#endif // _IMGWRITERGDAL_H_</span></div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span> <span class="preprocessor"></span></div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span> </div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span> <span class="comment">//     adfGeoTransform[0] /* top left x */</span></div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span> <span class="comment">//     adfGeoTransform[1] /* w-e pixel resolution */</span></div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span> <span class="comment">//     adfGeoTransform[2] /* rotation, 0 if image is "north up" */</span></div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span> <span class="comment">//     adfGeoTransform[3] /* top left y */</span></div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span> <span class="comment">//     adfGeoTransform[4] /* rotation, 0 if image is "north up" */</span></div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span> <span class="comment">//     adfGeoTransform[5] /* n-s pixel resolution */</span></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
+<div class="ttc" id="classImgRasterGdal_html"><div class="ttname"><a href="classImgRasterGdal.html">ImgRasterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgRasterGdal_8h_source.html#l00035">ImgRasterGdal.h:35</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgWriterOgr_8cc_source.html b/doc/html/ImgWriterOgr_8cc_source.html
index 7c1c6c6..c96b3e4 100644
--- a/doc/html/ImgWriterOgr_8cc_source.html
+++ b/doc/html/ImgWriterOgr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -179,554 +179,602 @@
 <div class="line"><a name="l00125"></a><span class="lineno">  125</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
 <div class="line"><a name="l00126"></a><span class="lineno">  126</span> <span class="keywordtype">void</span> ImgWriterOgr::close(<span class="keywordtype">void</span>)</div>
 <div class="line"><a name="l00127"></a><span class="lineno">  127</span> {</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   OGRDataSource::DestroyDataSource(m_datasource);</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span> }</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span> </div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span> <span class="keywordtype">void</span> ImgWriterOgr::setCodec(<span class="keyword">const</span> std::string& imageType){</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <span class="comment">//register the drivers</span></div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   OGRRegisterAll();</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <span class="comment">//fetch the OGR file driver</span></div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   OGRSFDriver *poDriver;</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(imageType.c_str());</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <span class="keywordflow">if</span>( poDriver == NULL ){</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     std::string errorString=<span class="stringliteral">"FileOpenError"</span>;</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   }</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), TRUE );</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <span class="keywordflow">if</span>( m_datasource == NULL ){</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), FALSE );</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     <span class="keywordflow">if</span> ( m_datasource != NULL){<span class="comment">// we can only open in not update mode</span></div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>       std::string errorString=<span class="stringliteral">"Update mode not supported, delete output dataset first"</span>;</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>       OGRDataSource::DestroyDataSource(m_datasource);</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>       m_datasource = NULL;</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     }</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     <span class="keywordflow">else</span> <span class="comment">//create the data source</span></div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>       m_datasource=poDriver->CreateDataSource(m_filename.c_str(),NULL);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   }</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <span class="keywordflow">else</span>{<span class="comment">//datasets exists, always overwrite all layers (no update append for now)</span></div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     <span class="keywordtype">int</span> nLayerCount = m_datasource->GetLayerCount();</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iLayer = 0; iLayer < nLayerCount; ++iLayer){</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>       <span class="keywordflow">if</span>(m_datasource->DeleteLayer(iLayer)!=OGRERR_NONE){</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     std::string errorstring=<span class="stringliteral">"DeleteLayer() failed when overwrite requested"</span>;</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>       }</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     }</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   }</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <span class="keywordflow">if</span>(m_datasource==NULL){</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     std::string errorString=<span class="stringliteral">"Creation of output file failed"</span>;</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   }</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span> }</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span> </div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span> <span class="keywordtype">void</span> ImgWriterOgr::setCodec(OGRSFDriver *poDriver){</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   OGRRegisterAll();</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <span class="keywordflow">if</span>( poDriver == NULL ){</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     std::string errorString=<span class="stringliteral">"FileOpenError"</span>;</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   }</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), TRUE );</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <span class="keywordflow">if</span>( m_datasource == NULL ){</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), FALSE );</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     <span class="keywordflow">if</span> ( m_datasource != NULL){<span class="comment">// we can only open in not update mode</span></div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>       std::string errorString=<span class="stringliteral">"Update mode not supported, delete output dataset first"</span>;</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>       OGRDataSource::DestroyDataSource(m_datasource);</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>       m_datasource = NULL;</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     }</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     <span class="keywordflow">else</span> <span class="comment">//create the data source</span></div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>       m_datasource=poDriver->CreateDataSource(m_filename.c_str(),NULL);</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   }</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <span class="keywordflow">else</span>{<span class="comment">//datasets exists, always overwrite all layers (no update append for now)</span></div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     <span class="keywordtype">int</span> nLayerCount = m_datasource->GetLayerCount();</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iLayer = 0; iLayer < nLayerCount; ++iLayer){</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>       <span class="keywordflow">if</span>(m_datasource->DeleteLayer(iLayer)!=OGRERR_NONE){</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     std::string errorstring=<span class="stringliteral">"DeleteLayer() failed when overwrite requested"</span>;</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>       }</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     }</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   }</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   <span class="keywordflow">if</span>(m_datasource==NULL){</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     std::string errorString=<span class="stringliteral">"Creation of output file failed"</span>;</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   }</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span> }</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span> </div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span> <span class="comment">// OGRLayer* ImgWriterOgr::copyLayer(OGRLayer* poSrcLayer, const std::string& layername, char** papszOptions)</span></div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span> <span class="comment">//   return(m_datasource->CopyLayer(poSrcLayer, layername.c_str(),papszOptions));</span></div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span> </div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span> OGRLayer* ImgWriterOgr::createLayer(<span class="keyword">const</span> std::string& layername, <span class="keyword">const</span> std::string& theProjection, <span class="keyword">const</span> OGRwkbGeometryType& eGType, <span class="keywordtype">char</span>** papszOptions)</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span> {</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   <span class="keywordflow">if</span>( !m_datasource->TestCapability( ODsCCreateLayer ) ){</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     std::string errorString=<span class="stringliteral">"Test capability to create layer failed"</span>;</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   }</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="comment">//papszOptions = CSLSetNameValue( papszOptions, "DIM", "1" );</span></div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   <span class="comment">//if points: use wkbPoint</span></div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   <span class="comment">//if no constraints on the types geometry to be written: use wkbUnknown </span></div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   OGRLayer* poLayer;</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span> </div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   OGRSpatialReference oSRS;</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span> </div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="keywordflow">if</span>(theProjection!=<span class="stringliteral">""</span>){</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     oSRS.SetFromUserInput(theProjection.c_str());</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     poLayer=m_datasource->CreateLayer( layername.c_str(), &oSRS, eGType,papszOptions );</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     <span class="comment">//   if(theProjection.find("EPSPG:")!=std::string::npos){</span></div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <span class="comment">//     int epsg_code=atoi(theProjection.substr(theProjection.find_first_not_of("EPSG:")).c_str());</span></div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     <span class="comment">//     OGRSpatialReference oSRS;</span></div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     <span class="comment">//     oSRS.importFromEPSG(epsg_code);</span></div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="comment">//     poLayer=m_datasource->CreateLayer( layername.c_str(), &oSRS, eGType,papszOptions );</span></div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     <span class="comment">//   }</span></div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     <span class="comment">//   else{</span></div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     <span class="comment">//     OGRSpatialReference oSRS(theProjection.c_str());</span></div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     <span class="comment">//     poLayer=m_datasource->CreateLayer( layername.c_str(), &oSRS, eGType,papszOptions );</span></div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     <span class="comment">//   }</span></div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     <span class="comment">// }</span></div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     <span class="comment">// oSRS.importFromProj4(theProjection);</span></div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   }</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     poLayer=m_datasource->CreateLayer( layername.c_str(), NULL, eGType,papszOptions );</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <span class="comment">//check if destroy is needed?!</span></div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   CSLDestroy( papszOptions );</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <span class="keywordflow">if</span>( poLayer == NULL ){</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     std::string errorstring=<span class="stringliteral">"Layer creation failed"</span>;</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span> <span class="preprocessor"></span>  OGRDataSource::DestroyDataSource(m_datasource);</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span> <span class="preprocessor"></span>  GDALClose(m_datasource);</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span> <span class="preprocessor"></span>}</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span> </div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span> <span class="comment">//---------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span> <span class="keywordtype">void</span> ImgWriterOgr::setCodec(<span class="keyword">const</span> std::string& imageType){</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span> <span class="preprocessor"></span>  <span class="comment">//register the drivers</span></div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   OGRRegisterAll();</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <span class="comment">//fetch the OGR file driver</span></div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   OGRSFDriver *poDriver;</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(imageType.c_str());</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span> <span class="preprocessor"></span>  <span class="comment">//register the drivers</span></div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   GDALAllRegister();</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   GDALDriver *poDriver;</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   poDriver = GetGDALDriverManager()->GetDriverByName(imageType.c_str());</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span> <span class="preprocessor"></span>  <span class="keywordflow">if</span>( poDriver == NULL ){</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     std::string errorString=<span class="stringliteral">"FileOpenError"</span>;</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   }</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span> <span class="preprocessor"></span>  m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), TRUE );</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span> <span class="preprocessor"></span>  m_datasource = (GDALDataset*) GDALOpenEx(m_filename.c_str(), GDAL_OF_UPDATE, NULL, NULL, NULL);</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span> <span class="preprocessor"></span>  <span class="keywordflow">if</span>( m_datasource == NULL ){</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span> <span class="preprocessor"></span>    m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), FALSE );</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span> <span class="preprocessor"></span>    m_datasource = (GDALDataset*) GDALOpenEx(m_filename.c_str(), GDAL_OF_READONLY, NULL, NULL, NULL);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span> <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( m_datasource != NULL){<span class="comment">// we can only open in not update mode</span></div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>       std::string errorString=<span class="stringliteral">"Update mode not supported, delete output dataset first"</span>;</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span> <span class="preprocessor"></span>      OGRDataSource::DestroyDataSource(m_datasource);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span> <span class="preprocessor"></span>      GDALClose(m_datasource);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span> <span class="preprocessor"></span>      m_datasource = NULL;</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     }</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     <span class="keywordflow">else</span> <span class="comment">//create the data source</span></div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span> <span class="preprocessor"></span>      m_datasource=poDriver->CreateDataSource(m_filename.c_str(),NULL);</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span> <span class="preprocessor"></span>      m_datasource=poDriver->Create(m_filename.c_str(),0,0,0,GDT_Unknown,NULL);</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span> <span class="preprocessor"></span>  }</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <span class="keywordflow">else</span>{<span class="comment">//datasets exists, always overwrite all layers (no update append for now)</span></div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     <span class="keywordtype">int</span> nLayerCount = m_datasource->GetLayerCount();</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iLayer = 0; iLayer < nLayerCount; ++iLayer){</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>       <span class="keywordflow">if</span>(m_datasource->DeleteLayer(iLayer)!=OGRERR_NONE){</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     std::string errorstring=<span class="stringliteral">"DeleteLayer() failed when overwrite requested"</span>;</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>       }</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     }</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   }</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordflow">if</span>(m_datasource==NULL){</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     std::string errorString=<span class="stringliteral">"Creation of output file failed"</span>;</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   }</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span> }</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span> </div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span> <span class="preprocessor"></span><span class="keywordtype">void</span> ImgWriterOgr::setCodec(OGRSFDriver *poDriver){</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   OGRRegisterAll();</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span> <span class="preprocessor"></span><span class="keywordtype">void</span> ImgWriterOgr::setCodec(GDALDriver *poDriver){</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   GDALAllRegister();</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span> <span class="preprocessor"></span>  <span class="keywordflow">if</span>( poDriver == NULL ){</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     std::string errorString=<span class="stringliteral">"FileOpenError"</span>;</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   }</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span> <span class="preprocessor"></span>  m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), TRUE );</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span> <span class="preprocessor"></span>  m_datasource = (GDALDataset*) GDALOpenEx(m_filename.c_str(), GDAL_OF_UPDATE, NULL, NULL, NULL);</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span> <span class="preprocessor"></span>  <span class="keywordflow">if</span>( m_datasource == NULL ){</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span> <span class="preprocessor"></span>    m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), FALSE );</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span> <span class="preprocessor"></span>    m_datasource = (GDALDataset*) GDALOpenEx(m_filename.c_str(), GDAL_OF_READONLY, NULL, NULL, NULL);</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span> <span class="preprocessor"></span>    <span class="keywordflow">if</span> ( m_datasource != NULL){<span class="comment">// we can only open in not update mode</span></div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>       std::string errorString=<span class="stringliteral">"Update mode not supported, delete output dataset first"</span>;</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span> <span class="preprocessor"></span>      OGRDataSource::DestroyDataSource(m_datasource);</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span> <span class="preprocessor"></span>      GDALClose(m_datasource);</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span> <span class="preprocessor"></span>      m_datasource = NULL;</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     }</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     <span class="keywordflow">else</span> <span class="comment">//create the data source</span></div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span> <span class="preprocessor"></span>      m_datasource=poDriver->CreateDataSource(m_filename.c_str(),NULL);</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span> <span class="preprocessor"></span>      m_datasource=poDriver->Create(m_filename.c_str(),0,0,0,GDT_Unknown,NULL);</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span> <span class="preprocessor"></span>  }</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="keywordflow">else</span>{<span class="comment">//datasets exists, always overwrite all layers (no update append for now)</span></div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     <span class="keywordtype">int</span> nLayerCount = m_datasource->GetLayerCount();</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iLayer = 0; iLayer < nLayerCount; ++iLayer){</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>       <span class="keywordflow">if</span>(m_datasource->DeleteLayer(iLayer)!=OGRERR_NONE){</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     std::string errorstring=<span class="stringliteral">"DeleteLayer() failed when overwrite requested"</span>;</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>       }</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     }</div>
 <div class="line"><a name="l00243"></a><span class="lineno">  243</span>   }</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="comment">// OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</span></div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordflow">return</span> poLayer;</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span> }</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span> </div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span> <span class="keywordtype">void</span> ImgWriterOgr::createField(<span class="keyword">const</span> std::string& fieldname, <span class="keyword">const</span> OGRFieldType& fieldType, <span class="keywordtype">int</span> theLayer)</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span> {</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   OGRFieldDefn oField( fieldname.c_str(), fieldType );</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <span class="keywordflow">if</span>(fieldType==OFTString)</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     oField.SetWidth(32);</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   <span class="keywordflow">if</span>(theLayer<0)</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     theLayer=m_datasource->GetLayerCount()-1;<span class="comment">//get back layer</span></div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <span class="keywordflow">if</span>(m_datasource->GetLayer(theLayer)->CreateField( &oField ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>       std::ostringstream es;</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>       es << <span class="stringliteral">"Creating field "</span> << fieldname << <span class="stringliteral">" failed"</span>;</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>       std::string errorString=es.str();</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="keywordflow">if</span>(m_datasource==NULL){</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     std::string errorString=<span class="stringliteral">"Creation of output file failed"</span>;</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   }</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span> }</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span> </div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span> <span class="comment">// OGRLayer* ImgWriterOgr::copyLayer(OGRLayer* poSrcLayer, const std::string& layername, char** papszOptions)</span></div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span> <span class="comment">//   return(m_datasource->CopyLayer(poSrcLayer, layername.c_str(),papszOptions));</span></div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span> </div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span> OGRLayer* ImgWriterOgr::createLayer(<span class="keyword">const</span> std::string& layername, <span class="keyword">const</span> std::string& theProjection, <span class="keyword">const</span> OGRwkbGeometryType& eGType, <span class="keywordtype">char</span>** papszOptions)</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span> {</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="keywordflow">if</span>( !m_datasource->TestCapability( ODsCCreateLayer ) ){</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     std::string errorString=<span class="stringliteral">"Test capability to create layer failed"</span>;</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     <span class="keywordflow">throw</span>(errorString);</div>
 <div class="line"><a name="l00260"></a><span class="lineno">  260</span>   }</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span> }</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span> </div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span> <span class="keywordtype">int</span> ImgWriterOgr::getFields(std::vector<std::string>& fields, <span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordflow">if</span>(layer<0)</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     layer=m_datasource->GetLayerCount()-1;</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   }</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   fields.clear();</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   fields.resize(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     fields[iField]=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   }</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="keywordflow">return</span>(fields.size());</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span> }</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span> </div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span> <span class="keywordtype">int</span> ImgWriterOgr::getFields(std::vector<OGRFieldDefn*>& fields, <span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <span class="keywordflow">if</span>(layer<0)</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     layer=m_datasource->GetLayerCount()-1;</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   }</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   fields.clear();</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   fields.resize(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     fields[iField]=poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   }</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   assert(fields.size()==getFieldCount(layer));</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keywordflow">return</span>(fields.size());</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span> }</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span> </div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span> <span class="keywordtype">void</span> ImgWriterOgr::copyFields(<span class="keyword">const</span> <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a>& imgReaderOgr, <span class="keywordtype">int</span> srcLayer, <span class="keywordtype">int</span> targetLayer){</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>   <span class="keywordflow">if</span>(targetLayer<0)</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     targetLayer=m_datasource->GetLayerCount()-1;<span class="comment">//get back layer</span></div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   <span class="comment">//get fields from imgReaderOgr</span></div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   std::vector<OGRFieldDefn*> fields;</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   </div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   imgReaderOgr.getFields(fields,srcLayer);</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<fields.size();++iField){</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="keywordflow">if</span>(m_datasource->GetLayer(targetLayer)->CreateField(fields[iField]) != OGRERR_NONE ){</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       std::ostringstream es;</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>       es << <span class="stringliteral">"Creating field "</span> << fields[iField]->GetNameRef() << <span class="stringliteral">" failed"</span>;</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       std::string errorString=es.str();</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     }</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   }</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span> }</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span> </div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span> <span class="keywordtype">void</span> ImgWriterOgr::addPoint(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y, <span class="keyword">const</span> std::map<std::string,double>& pointAttributes, std::string fieldName, <span class="keyword">const</span> std::string& theId, <span class="keywordtype">int</span> layer){</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   OGRFeature *poFeature;</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   poFeature=createFeature(layer);</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   OGRPoint pt;</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>   poFeature->SetField( fieldName.c_str(), theId.c_str());</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>   <span class="keywordflow">for</span>(std::map<std::string,double>::const_iterator mit=pointAttributes.begin();mit!=pointAttributes.end();++mit){</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     poFeature->SetField((mit->first).c_str(), mit->second);</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>   }</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>   pt.setX(x);</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   pt.setY(y);</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   poFeature->SetGeometry( &pt );</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   <span class="keywordflow">if</span>(createFeature(poFeature,layer)!=OGRERR_NONE){</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   }</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span> }</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span> </div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span> <span class="keywordtype">void</span> ImgWriterOgr::addPoint(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y, <span class="keyword">const</span> std::map<std::string,double>& pointAttributes, std::string fieldName, <span class="keywordtype">int</span> theId, <span class="keywordtype">int</span> layer){</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   OGRFeature *poFeature;</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   poFeature = createFeature(layer);</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   OGRPoint pt;</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   <span class="keywordflow">if</span>(pointAttributes.size()+1!=poFeature->GetFieldCount()){</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     std::ostringstream ess;</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     ess << <span class="stringliteral">"Failed to add feature: "</span> << pointAttributes.size() << <span class="stringliteral">" !="</span> << poFeature->GetFieldCount() << std::endl;</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="comment">//papszOptions = CSLSetNameValue( papszOptions, "DIM", "1" );</span></div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="comment">//if points: use wkbPoint</span></div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="comment">//if no constraints on the types geometry to be written: use wkbUnknown </span></div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   OGRLayer* poLayer;</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span> </div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   OGRSpatialReference oSRS;</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span> </div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordflow">if</span>(theProjection!=<span class="stringliteral">""</span>){</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     oSRS.SetFromUserInput(theProjection.c_str());</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     poLayer=m_datasource->CreateLayer( layername.c_str(), &oSRS, eGType,papszOptions );</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     <span class="comment">//   if(theProjection.find("EPSPG:")!=std::string::npos){</span></div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     <span class="comment">//     int epsg_code=atoi(theProjection.substr(theProjection.find_first_not_of("EPSG:")).c_str());</span></div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     <span class="comment">//     OGRSpatialReference oSRS;</span></div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>     <span class="comment">//     oSRS.importFromEPSG(epsg_code);</span></div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     <span class="comment">//     poLayer=m_datasource->CreateLayer( layername.c_str(), &oSRS, eGType,papszOptions );</span></div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     <span class="comment">//   }</span></div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     <span class="comment">//   else{</span></div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     <span class="comment">//     OGRSpatialReference oSRS(theProjection.c_str());</span></div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     <span class="comment">//     poLayer=m_datasource->CreateLayer( layername.c_str(), &oSRS, eGType,papszOptions );</span></div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     <span class="comment">//   }</span></div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="comment">// oSRS.importFromProj4(theProjection);</span></div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   }</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     poLayer=m_datasource->CreateLayer( layername.c_str(), NULL, eGType,papszOptions );</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <span class="comment">//check if destroy is needed?!</span></div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   CSLDestroy( papszOptions );</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="keywordflow">if</span>( poLayer == NULL ){</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     std::string errorstring=<span class="stringliteral">"Layer creation failed"</span>;</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   }</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="comment">// OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</span></div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="keywordflow">return</span> poLayer;</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span> }</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span> </div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span> <span class="keywordtype">void</span> ImgWriterOgr::createField(<span class="keyword">const</span> std::string& fieldname, <span class="keyword">const</span> OGRFieldType& fieldType, <span class="keywordtype">int</span> theLayer)</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span> {</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   OGRFieldDefn oField( fieldname.c_str(), fieldType );</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keywordflow">if</span>(fieldType==OFTString)</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     oField.SetWidth(32);</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keywordflow">if</span>(theLayer<0)</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     theLayer=m_datasource->GetLayerCount()-1;<span class="comment">//get back layer</span></div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="keywordflow">if</span>(m_datasource->GetLayer(theLayer)->CreateField( &oField ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       std::ostringstream es;</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       es << <span class="stringliteral">"Creating field "</span> << fieldname << <span class="stringliteral">" failed"</span>;</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       std::string errorString=es.str();</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   }</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span> }</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span> </div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span> <span class="keywordtype">int</span> ImgWriterOgr::getFields(std::vector<std::string>& fields, <span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>   <span class="keywordflow">if</span>(layer<0)</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     layer=m_datasource->GetLayerCount()-1;</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   }</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   fields.clear();</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   fields.resize(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     fields[iField]=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>   }</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>   <span class="keywordflow">return</span>(fields.size());</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span> }</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span> </div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span> <span class="keywordtype">int</span> ImgWriterOgr::getFields(std::vector<OGRFieldDefn*>& fields, <span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>   <span class="keywordflow">if</span>(layer<0)</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     layer=m_datasource->GetLayerCount()-1;</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   }</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   fields.clear();</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   fields.resize(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     fields[iField]=poFDefn->GetFieldDefn(iField);</div>
 <div class="line"><a name="l00347"></a><span class="lineno">  347</span>   }</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   assert(pointAttributes.size()+1==poFeature->GetFieldCount());</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   poFeature->SetField( fieldName.c_str(), theId);</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   <span class="keywordtype">int</span> fid=0;</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   <span class="keywordflow">for</span>(std::map<std::string,double>::const_iterator mit=pointAttributes.begin();mit!=pointAttributes.end();++mit){</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     poFeature->SetField((mit->first).c_str(),mit->second);</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   }</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   pt.setX(x);</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   pt.setY(y);</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   poFeature->SetGeometry( &pt );</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordflow">if</span>(createFeature(poFeature,layer)!=OGRERR_NONE){</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   }</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span> }</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span> </div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span> <span class="comment">//add a line std::string (polygon), caller is responsible to close the line (end point=start point)</span></div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span> <span class="keywordtype">void</span> ImgWriterOgr::addLineString(std::vector<OGRPoint*>& points, <span class="keyword">const</span> std::string& fieldName, <span class="keywordtype">int</span> theId, <span class="keywordtype">int</span> layer){</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   OGRFeature *poFeature;</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>   poFeature = createFeature(layer);</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   poFeature->SetStyleString(<span class="stringliteral">"PEN(c:#FF0000,w:5px)"</span>);<span class="comment">//see also http://www.gdal.org/ogr/ogr_feature_style.html</span></div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   poFeature->SetField( fieldName.c_str(), theId);</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   OGRLineString theLineString;</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   theLineString.setNumPoints(points.size());</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ip=0;ip<points.size();++ip)</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     theLineString.setPoint(ip,points[ip]);</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   <span class="keywordflow">if</span>(poFeature->SetGeometry( &theLineString )!=OGRERR_NONE){</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     std::string errorString=<span class="stringliteral">"Failed to set line OGRLineString as feature geometry"</span>;</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   }</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   <span class="keywordflow">if</span>(createFeature(poFeature,layer)!=OGRERR_NONE){</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>   }</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span> }</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span> </div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span> <span class="comment">//add a ring (polygon), caller is responsible to close the line (end point=start point)?</span></div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span> <span class="keywordtype">void</span> ImgWriterOgr::addRing(std::vector<OGRPoint*>& points, <span class="keyword">const</span> std::string& fieldName, <span class="keywordtype">int</span> theId, <span class="keywordtype">int</span> layer){</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   OGRFeature *poFeature;</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   poFeature = createFeature(layer);</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>   poFeature->SetStyleString(<span class="stringliteral">"PEN(c:#FF0000,w:5px)"</span>);<span class="comment">//see also http://www.gdal.org/ogr/ogr_feature_style.html</span></div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   poFeature->SetField( fieldName.c_str(), theId);</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <span class="comment">// OGRLineString theLineString;</span></div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   <span class="comment">// theLineString.setNumPoints(points.size());</span></div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>   OGRPolygon thePolygon;</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>   OGRLinearRing theRing;</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ip=0;ip<points.size();++ip)</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     theRing.addPoint(points[ip]);</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>   <span class="comment">//  theRing.addPoint(points[0]);//close the ring</span></div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   theRing.closeRings();<span class="comment">//redundent with previous line?</span></div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   thePolygon.addRing(&theRing);</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>   <span class="comment">// SetSpatialFilter(&thePolygon)</span></div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   poFeature->SetGeometry( &thePolygon );</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>   <span class="keywordflow">if</span>(createFeature(poFeature,layer)!=OGRERR_NONE){</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>   }</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>   <span class="keywordflow">if</span>(poFeature->SetGeometry( &thePolygon )!=OGRERR_NONE){</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     std::string errorString=<span class="stringliteral">"Failed to set polygon as feature geometry"</span>;</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   }</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>   OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span> }</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span> </div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span> <span class="comment">//add a line string (polygon), caller is responsible to close the line (end point=start point)</span></div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span> <span class="keywordtype">void</span> ImgWriterOgr::addLineString(std::vector<OGRPoint*>& points, <span class="keyword">const</span> std::string& fieldName, <span class="keyword">const</span> std::string& theId, <span class="keywordtype">int</span> layer){</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>   OGRFeature *poFeature;</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>   poFeature = createFeature(layer);</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>   poFeature->SetField( fieldName.c_str(), theId.c_str());</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>   OGRLineString theLineString;</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>   theLineString.setNumPoints(points.size());</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ip=0;ip<points.size();++ip)</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     theLineString.setPoint(ip,points[ip]);</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>   <span class="keywordflow">if</span>(poFeature->SetGeometry( &theLineString )!=OGRERR_NONE){</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     std::string errorString=<span class="stringliteral">"Failed to set line OGRLineString as feature geometry"</span>;</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>   }</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>   <span class="keywordflow">if</span>(createFeature(poFeature,layer)!=OGRERR_NONE){</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   }</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span> }</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span> </div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span> OGRFeature* ImgWriterOgr::createFeature(<span class="keywordtype">int</span> layer){</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   <span class="keywordflow">return</span>(OGRFeature::CreateFeature(m_datasource->GetLayer(layer)->GetLayerDefn()));</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span> }</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span> </div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span> OGRErr ImgWriterOgr::createFeature(OGRFeature *theFeature,<span class="keywordtype">int</span> layer){</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   <span class="keywordflow">return</span> m_datasource->GetLayer(layer)->CreateFeature(theFeature);</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span> }</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span> </div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span> <span class="keywordtype">int</span> ImgWriterOgr::getFieldCount(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>   assert(m_datasource->GetLayerCount()>layer);</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>   }</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>   <span class="keywordflow">return</span>(poFDefn->GetFieldCount());</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span> }</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span> </div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span> <span class="keywordtype">int</span> ImgWriterOgr::getFeatureCount(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>   <span class="keywordflow">return</span>(getLayer(layer)->GetFeatureCount());</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span> }</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span> </div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span> <span class="keywordtype">int</span> ImgWriterOgr::ascii2ogr(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> std::string &layername, <span class="keyword">const</span> std::vector<std::string>& fieldName, <span class="keyword">const</span> std::vector<OGRFieldType>& fieldType, <span class="keywordtype">short</span> colX, <span class="keywo [...]
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span> {</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>   <span class="keywordtype">char</span>     **papszOptions=NULL;</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>   createLayer(layername, theProjection, eGType, papszOptions);</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>   <span class="comment">//create attribute fields that should appear on the layer. Fields must be added to the layer before any features are written. To create a field we initialize an OGRField object with the information about the field. In the case of Shapefiles, the field width and precision is significant in the creation of the output .dbf file, so we set it specifically, though generally the defaults are O [...]
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>   <span class="keywordtype">int</span> ncol=fieldName.size();</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>   assert(colX>=0);</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>   assert(colY>=0);</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>   assert(colX<ncol+2);</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>   assert(colY<ncol+2);</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifield=0;ifield<ncol;++ifield)</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     createField(fieldName[ifield],fieldType[ifield]);</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>   <span class="comment">//create a local OGRFeature, set attributes and attach geometry before trying to write it to the layer. It is imperative that this feature be instantiated from the OGRFeatureDefn associated with the layer it will be written to.</span></div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>   <span class="comment">//todo: try to open and catch if failure...</span></div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>   std::ifstream fpoints(filename.c_str(),std::ios::in);</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>   std::string line;</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>   OGRPolygon thePolygon;</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>   OGRLinearRing theRing;</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>   OGRPoint firstPoint;</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>   OGRFeature *polyFeature;</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>   <span class="keywordflow">if</span>(eGType!=wkbPoint)</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     polyFeature=createFeature();</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   assert(fields.size()==getFieldCount(layer));</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   <span class="keywordflow">return</span>(fields.size());</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span> }</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span> </div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span> <span class="keywordtype">void</span> ImgWriterOgr::copyFields(<span class="keyword">const</span> <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a>& imgReaderOgr, <span class="keywordtype">int</span> srcLayer, <span class="keywordtype">int</span> targetLayer){</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   <span class="keywordflow">if</span>(targetLayer<0)</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>     targetLayer=m_datasource->GetLayerCount()-1;<span class="comment">//get back layer</span></div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <span class="comment">//get fields from imgReaderOgr</span></div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   std::vector<OGRFieldDefn*> fields;</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   </div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   imgReaderOgr.getFields(fields,srcLayer);</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<fields.size();++iField){</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     <span class="keywordflow">if</span>(m_datasource->GetLayer(targetLayer)->CreateField(fields[iField]) != OGRERR_NONE ){</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       std::ostringstream es;</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       es << <span class="stringliteral">"Creating field "</span> << fields[iField]->GetNameRef() << <span class="stringliteral">" failed"</span>;</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       std::string errorString=es.str();</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     }</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   }</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span> }</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span> </div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span> <span class="keywordtype">void</span> ImgWriterOgr::addPoint(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y, <span class="keyword">const</span> std::map<std::string,double>& pointAttributes, std::string fieldName, <span class="keyword">const</span> std::string& theId, <span class="keywordtype">int</span> layer){</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   OGRFeature *poFeature;</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   poFeature=createFeature(layer);</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   OGRPoint pt;</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>   poFeature->SetField( fieldName.c_str(), theId.c_str());</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   <span class="keywordflow">for</span>(std::map<std::string,double>::const_iterator mit=pointAttributes.begin();mit!=pointAttributes.end();++mit){</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     poFeature->SetField((mit->first).c_str(), mit->second);</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   }</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   pt.setX(x);</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   pt.setY(y);</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   poFeature->SetGeometry( &pt );</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   <span class="keywordflow">if</span>(createFeature(poFeature,layer)!=OGRERR_NONE){</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>   }</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span> }</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span> </div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span> <span class="keywordtype">void</span> ImgWriterOgr::addPoint(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y, <span class="keyword">const</span> std::map<std::string,double>& pointAttributes, std::string fieldName, <span class="keywordtype">int</span> theId, <span class="keywordtype">int</span> layer){</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   OGRFeature *poFeature;</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>   poFeature = createFeature(layer);</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   OGRPoint pt;</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <span class="keywordflow">if</span>(pointAttributes.size()+1!=poFeature->GetFieldCount()){</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     std::ostringstream ess;</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     ess << <span class="stringliteral">"Failed to add feature: "</span> << pointAttributes.size() << <span class="stringliteral">" !="</span> << poFeature->GetFieldCount() << std::endl;</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   }</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   assert(pointAttributes.size()+1==poFeature->GetFieldCount());</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>   poFeature->SetField( fieldName.c_str(), theId);</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   <span class="keywordtype">int</span> fid=0;</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   <span class="keywordflow">for</span>(std::map<std::string,double>::const_iterator mit=pointAttributes.begin();mit!=pointAttributes.end();++mit){</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     poFeature->SetField((mit->first).c_str(),mit->second);</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   }</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>   pt.setX(x);</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>   pt.setY(y);</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   poFeature->SetGeometry( &pt );</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>   <span class="keywordflow">if</span>(createFeature(poFeature,layer)!=OGRERR_NONE){</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>   }</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>   OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span> }</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span> </div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span> <span class="comment">//add a line std::string (polygon), caller is responsible to close the line (end point=start point)</span></div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span> <span class="keywordtype">void</span> ImgWriterOgr::addLineString(std::vector<OGRPoint*>& points, <span class="keyword">const</span> std::string& fieldName, <span class="keywordtype">int</span> theId, <span class="keywordtype">int</span> layer){</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>   OGRFeature *poFeature;</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>   poFeature = createFeature(layer);</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>   poFeature->SetStyleString(<span class="stringliteral">"PEN(c:#FF0000,w:5px)"</span>);<span class="comment">//see also http://www.gdal.org/ogr/ogr_feature_style.html</span></div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>   poFeature->SetField( fieldName.c_str(), theId);</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>   OGRLineString theLineString;</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>   theLineString.setNumPoints(points.size());</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ip=0;ip<points.size();++ip)</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     theLineString.setPoint(ip,points[ip]);</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>   <span class="keywordflow">if</span>(poFeature->SetGeometry( &theLineString )!=OGRERR_NONE){</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     std::string errorString=<span class="stringliteral">"Failed to set line OGRLineString as feature geometry"</span>;</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>   }</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>   <span class="keywordflow">if</span>(createFeature(poFeature,layer)!=OGRERR_NONE){</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>   }</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span> }</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span> </div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span> <span class="comment">//add a ring (polygon), caller is responsible to close the line (end point=start point)?</span></div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span> <span class="keywordtype">void</span> ImgWriterOgr::addRing(std::vector<OGRPoint*>& points, <span class="keyword">const</span> std::string& fieldName, <span class="keywordtype">int</span> theId, <span class="keywordtype">int</span> layer){</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   OGRFeature *poFeature;</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   poFeature = createFeature(layer);</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>   poFeature->SetStyleString(<span class="stringliteral">"PEN(c:#FF0000,w:5px)"</span>);<span class="comment">//see also http://www.gdal.org/ogr/ogr_feature_style.html</span></div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>   poFeature->SetField( fieldName.c_str(), theId);</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   <span class="comment">// OGRLineString theLineString;</span></div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>   <span class="comment">// theLineString.setNumPoints(points.size());</span></div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>   OGRPolygon thePolygon;</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>   OGRLinearRing theRing;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ip=0;ip<points.size();++ip)</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     theRing.addPoint(points[ip]);</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>   <span class="comment">//  theRing.addPoint(points[0]);//close the ring</span></div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>   theRing.closeRings();<span class="comment">//redundent with previous line?</span></div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>   thePolygon.addRing(&theRing);</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>   <span class="comment">// SetSpatialFilter(&thePolygon)</span></div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>   poFeature->SetGeometry( &thePolygon );</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   <span class="keywordflow">if</span>(createFeature(poFeature,layer)!=OGRERR_NONE){</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>   }</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>   <span class="keywordflow">if</span>(poFeature->SetGeometry( &thePolygon )!=OGRERR_NONE){</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     std::string errorString=<span class="stringliteral">"Failed to set polygon as feature geometry"</span>;</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>   }</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>   OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span> }</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span> </div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span> <span class="comment">//add a line string (polygon), caller is responsible to close the line (end point=start point)</span></div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span> <span class="keywordtype">void</span> ImgWriterOgr::addLineString(std::vector<OGRPoint*>& points, <span class="keyword">const</span> std::string& fieldName, <span class="keyword">const</span> std::string& theId, <span class="keywordtype">int</span> layer){</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>   OGRFeature *poFeature;</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>   poFeature = createFeature(layer);</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>   poFeature->SetField( fieldName.c_str(), theId.c_str());</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>   OGRLineString theLineString;</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>   theLineString.setNumPoints(points.size());</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ip=0;ip<points.size();++ip)</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     theLineString.setPoint(ip,points[ip]);</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>   <span class="keywordflow">if</span>(poFeature->SetGeometry( &theLineString )!=OGRERR_NONE){</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>     std::string errorString=<span class="stringliteral">"Failed to set line OGRLineString as feature geometry"</span>;</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>   }</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>   <span class="keywordflow">if</span>(createFeature(poFeature,layer)!=OGRERR_NONE){</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>   }</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>   OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span> }</div>
 <div class="line"><a name="l00481"></a><span class="lineno">  481</span> </div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span> </div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>   <span class="keywordflow">if</span>(fs><span class="charliteral">' '</span>&&fs<=<span class="charliteral">'~'</span>){<span class="comment">//field separator is a regular character (minimum ASCII code is space, maximum ASCII code is tilde)</span></div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     std::string csvRecord;</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     <span class="keywordflow">while</span>(getline(fpoints,csvRecord)){<span class="comment">//read a line</span></div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>       OGRFeature *pointFeature;</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         pointFeature=createFeature();</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       OGRPoint thePoint;</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>       <span class="keywordtype">bool</span> skip=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       std::istringstream csvstream(csvRecord);</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       std::string value;</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>       <span class="keywordtype">int</span> colId=0;</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       <span class="keywordtype">int</span> fieldId=0;</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       <span class="keywordflow">while</span>(getline(csvstream,value,fs)){<span class="comment">//read a column</span></div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>         <span class="keywordflow">if</span>(colId==colX)</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>           thePoint.setX(atof(value.c_str()));</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(colId==colY)</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>           thePoint.setY(atof(value.c_str()));</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>           <span class="keywordflow">switch</span>(fieldType[fieldId]){</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>           <span class="keywordflow">case</span>(OFTReal):</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>               pointFeature->SetField(fieldId,atof(value.c_str()));</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>               polyFeature->SetField(fieldId,atof(value.c_str()));</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>           <span class="keywordflow">case</span>(OFTInteger):</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>               pointFeature->SetField(fieldId,atoi(value.c_str()));</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>               polyFeature->SetField(fieldId,atoi(value.c_str()));</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>           <span class="keywordflow">case</span>(OFTString):</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>               pointFeature->SetField(fieldId,value.c_str());</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>               polyFeature->SetField(fieldId,value.c_str());</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>           }</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>           ++fieldId;</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>         }</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>         ++colId;</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       }</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>       <span class="keywordflow">if</span>(colId!=fieldId+2){</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>         std::ostringstream ess;</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>         ess << <span class="stringliteral">"Error: colId = "</span> << colId << <span class="stringliteral">" is different from fieldId+2 = "</span> << fieldId;</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       }</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       <span class="keywordflow">if</span>(eGType==wkbPoint){</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>         pointFeature->SetGeometry( &thePoint );</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>         <span class="keywordflow">if</span>(createFeature(pointFeature)!=OGRERR_NONE){</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>           std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>           <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>           OGRFeature::DestroyFeature( pointFeature );</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>         }</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       }</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>         <span class="keywordflow">if</span>(firstPoint.IsEmpty()){</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>           firstPoint=thePoint;</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>         }</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>         theRing.addPoint(&thePoint);</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       }</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     }</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   }</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>   <span class="keywordflow">else</span>{<span class="comment">//space or tab delimited fields</span></div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     <span class="keywordflow">while</span>(getline(fpoints,line)){</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       OGRFeature *pointFeature;</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         pointFeature=createFeature();</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       OGRPoint thePoint;</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       <span class="keywordtype">bool</span> skip=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       std::istringstream ist(line);</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       std::string value;</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="keywordtype">int</span> colId=0;</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       <span class="keywordtype">int</span> fieldId=0;</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       <span class="keywordflow">while</span>(ist >> value){</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         <span class="keywordflow">if</span>(colId==colX)</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>           thePoint.setX(atof(value.c_str()));</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(colId==colY)</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>           thePoint.setY(atof(value.c_str()));</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>           <span class="keywordflow">switch</span>(fieldType[fieldId]){</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>           <span class="keywordflow">case</span>(OFTReal):</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>               pointFeature->SetField(fieldId,atof(value.c_str()));</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>               polyFeature->SetField(fieldId,atof(value.c_str()));</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>           <span class="keywordflow">case</span>(OFTInteger):</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>               pointFeature->SetField(fieldId,atoi(value.c_str()));</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>               polyFeature->SetField(fieldId,atoi(value.c_str()));</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>           <span class="keywordflow">case</span>(OFTString):</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>               pointFeature->SetField(fieldId,value.c_str());</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>               polyFeature->SetField(fieldId,value.c_str());</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>           }</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>           ++fieldId;</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>         }</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         ++colId;</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       }</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">if</span>(colId!=fieldId+2){</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>         std::ostringstream ess;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>         ess << <span class="stringliteral">"Error: colId = "</span> << colId << <span class="stringliteral">" is different from fieldId+2 = "</span> << fieldId;</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>         <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       }</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       <span class="keywordflow">if</span>(eGType==wkbPoint){</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>         pointFeature->SetGeometry( &thePoint );</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>         <span class="keywordflow">if</span>(createFeature(pointFeature)!=OGRERR_NONE){</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>           std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>           <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>           OGRFeature::DestroyFeature( pointFeature );</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         }</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       }</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>         <span class="keywordflow">if</span>(firstPoint.IsEmpty()){</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>           firstPoint=thePoint;</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>         }</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>         theRing.addPoint(&thePoint);</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       }</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     }</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>   }</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>   <span class="keywordflow">if</span>(eGType!=wkbPoint){</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     theRing.addPoint(&firstPoint);<span class="comment">//close the ring</span></div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     thePolygon.addRing(&theRing);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     <span class="comment">// SetSpatialFilter(&thePolygon)</span></div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     polyFeature->SetGeometry( &thePolygon );</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     <span class="keywordflow">if</span>(createFeature(polyFeature)!=OGRERR_NONE){</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       OGRFeature::DestroyFeature( polyFeature );</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     }</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>   }</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>   <span class="keywordflow">return</span> getFeatureCount();</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span> }</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span> </div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span> <span class="keywordtype">int</span> ImgWriterOgr::addData(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& imgReader, <span class="keywordtype">int</span> theLayer, <span class="keywordtype">bool</span> verbose)</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span> {</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   OGRLayer  *poLayer;</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>   assert(m_datasource->GetLayerCount()>theLayer);</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     std::cout << <span class="stringliteral">"get layer "</span> << theLayer << std::endl;</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>   poLayer = m_datasource->GetLayer(theLayer);</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>   <span class="comment">//start reading features from the layer</span></div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>   OGRFeature *poFeature;</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   poLayer->ResetReading();</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<imgReader.nrOfBand();++iband){</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     std::ostringstream fs;</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     fs << <span class="stringliteral">"band"</span> << iband;</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>     createField(fs.str(),OFTReal,theLayer);</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>   }</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>   <span class="keywordtype">int</span> nfield=poFDefn->GetFieldCount();</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>   <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     std::cout << <span class="stringliteral">"new number of fields: "</span> << nfield << std::endl;</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     poGeometry = poFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     assert(poGeometry != NULL </div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>            && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     <span class="keywordtype">double</span> x=poPoint->getX();</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     <span class="keywordtype">double</span> y=poPoint->getY();</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<imgReader.nrOfBand();++iband){</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>       <span class="keywordtype">double</span> imgData;</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>       imgReader.readData(imgData,GDT_Float64,x,y,iband);</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       <span class="comment">//todo: put imgdata in field</span></div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>       std::ostringstream fs;</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>       fs << <span class="stringliteral">"band"</span> << iband;</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       poFeature->SetField(fs.str().c_str(),imgData);</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     }</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   }</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   <span class="keywordflow">return</span>(nfield);</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span> }</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span> </div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span> OGRFeature* ImgWriterOgr::createFeature(<span class="keywordtype">int</span> layer){</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>   <span class="keywordflow">return</span>(OGRFeature::CreateFeature(m_datasource->GetLayer(layer)->GetLayerDefn()));</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span> }</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span> </div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span> OGRErr ImgWriterOgr::createFeature(OGRFeature *theFeature,<span class="keywordtype">int</span> layer){</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   <span class="keywordflow">return</span> m_datasource->GetLayer(layer)->CreateFeature(theFeature);</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span> }</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span> </div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span> <span class="keywordtype">int</span> ImgWriterOgr::getFieldCount(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>   assert(m_datasource->GetLayerCount()>layer);</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>   <span class="keywordflow">if</span>((poLayer = m_datasource->GetLayer(layer))==NULL){</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     std::string errorstring=<span class="stringliteral">"Could not get layer"</span>;</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>   }</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>   <span class="keywordflow">return</span>(poFDefn->GetFieldCount());</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span> }</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span> </div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span> <span class="keywordtype">int</span> ImgWriterOgr::getFeatureCount(<span class="keywordtype">int</span> layer)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>   <span class="keywordflow">return</span>(getLayer(layer)->GetFeatureCount());</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span> }</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span> </div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span> <span class="keywordtype">int</span> ImgWriterOgr::ascii2ogr(<span class="keyword">const</span> std::string& filename, <span class="keyword">const</span> std::string &layername, <span class="keyword">const</span> std::vector<std::string>& fieldName, <span class="keyword">const</span> std::vector<OGRFieldType>& fieldType, <span class="keywordtype">short</span> colX, <span class="keywo [...]
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span> {</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>   <span class="keywordtype">char</span>     **papszOptions=NULL;</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   createLayer(layername, theProjection, eGType, papszOptions);</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="comment">//create attribute fields that should appear on the layer. Fields must be added to the layer before any features are written. To create a field we initialize an OGRField object with the information about the field. In the case of Shapefiles, the field width and precision is significant in the creation of the output .dbf file, so we set it specifically, though generally the defaults are O [...]
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   <span class="keywordtype">int</span> ncol=fieldName.size();</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   assert(colX>=0);</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>   assert(colY>=0);</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>   assert(colX<ncol+2);</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>   assert(colY<ncol+2);</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifield=0;ifield<ncol;++ifield)</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>     createField(fieldName[ifield],fieldType[ifield]);</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   <span class="comment">//create a local OGRFeature, set attributes and attach geometry before trying to write it to the layer. It is imperative that this feature be instantiated from the OGRFeatureDefn associated with the layer it will be written to.</span></div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="comment">//todo: try to open and catch if failure...</span></div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   std::ifstream fpoints(filename.c_str(),std::ios::in);</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   std::string line;</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   OGRPolygon thePolygon;</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   OGRLinearRing theRing;</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   OGRPoint firstPoint;</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>   OGRFeature *polyFeature;</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <span class="keywordflow">if</span>(eGType!=wkbPoint)</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     polyFeature=createFeature();</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span> </div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span> </div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   <span class="keywordflow">if</span>(fs><span class="charliteral">' '</span>&&fs<=<span class="charliteral">'~'</span>){<span class="comment">//field separator is a regular character (minimum ASCII code is space, maximum ASCII code is tilde)</span></div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     std::string csvRecord;</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     <span class="keywordflow">while</span>(getline(fpoints,csvRecord)){<span class="comment">//read a line</span></div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       OGRFeature *pointFeature;</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>         pointFeature=createFeature();</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       OGRPoint thePoint;</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordtype">bool</span> skip=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       std::istringstream csvstream(csvRecord);</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       std::string value;</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       <span class="keywordtype">int</span> colId=0;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       <span class="keywordtype">int</span> fieldId=0;</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>       <span class="keywordflow">while</span>(getline(csvstream,value,fs)){<span class="comment">//read a column</span></div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>         <span class="keywordflow">if</span>(colId==colX)</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>           thePoint.setX(atof(value.c_str()));</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(colId==colY)</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>           thePoint.setY(atof(value.c_str()));</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>           <span class="keywordflow">switch</span>(fieldType[fieldId]){</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>           <span class="keywordflow">case</span>(OFTReal):</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>               pointFeature->SetField(fieldId,atof(value.c_str()));</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>               polyFeature->SetField(fieldId,atof(value.c_str()));</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>           <span class="keywordflow">case</span>(OFTInteger):</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>               pointFeature->SetField(fieldId,atoi(value.c_str()));</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>               polyFeature->SetField(fieldId,atoi(value.c_str()));</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>           <span class="keywordflow">case</span>(OFTString):</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>               pointFeature->SetField(fieldId,value.c_str());</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>               polyFeature->SetField(fieldId,value.c_str());</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>           }</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>           ++fieldId;</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>         }</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>         ++colId;</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       }</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       <span class="keywordflow">if</span>(colId!=fieldId+2){</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>         std::ostringstream ess;</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>         ess << <span class="stringliteral">"Error: colId = "</span> << colId << <span class="stringliteral">" is different from fieldId+2 = "</span> << fieldId;</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>         <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       }</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       <span class="keywordflow">if</span>(eGType==wkbPoint){</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>         pointFeature->SetGeometry( &thePoint );</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>         <span class="keywordflow">if</span>(createFeature(pointFeature)!=OGRERR_NONE){</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>           std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>           <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>           OGRFeature::DestroyFeature( pointFeature );</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>         }</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       }</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         <span class="keywordflow">if</span>(firstPoint.IsEmpty()){</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>           firstPoint=thePoint;</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>         }</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>         theRing.addPoint(&thePoint);</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       }</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     }</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   }</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   <span class="keywordflow">else</span>{<span class="comment">//space or tab delimited fields</span></div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>     <span class="keywordflow">while</span>(getline(fpoints,line)){</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       OGRFeature *pointFeature;</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>         pointFeature=createFeature();</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       OGRPoint thePoint;</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       <span class="keywordtype">bool</span> skip=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       std::istringstream ist(line);</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       std::string value;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       <span class="keywordtype">int</span> colId=0;</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       <span class="keywordtype">int</span> fieldId=0;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="keywordflow">while</span>(ist >> value){</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>         <span class="keywordflow">if</span>(colId==colX)</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>           thePoint.setX(atof(value.c_str()));</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(colId==colY)</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>           thePoint.setY(atof(value.c_str()));</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>           <span class="keywordflow">switch</span>(fieldType[fieldId]){</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>           <span class="keywordflow">case</span>(OFTReal):</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>               pointFeature->SetField(fieldId,atof(value.c_str()));</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>               polyFeature->SetField(fieldId,atof(value.c_str()));</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>           <span class="keywordflow">case</span>(OFTInteger):</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>               pointFeature->SetField(fieldId,atoi(value.c_str()));</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>               polyFeature->SetField(fieldId,atoi(value.c_str()));</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>           <span class="keywordflow">case</span>(OFTString):</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>               pointFeature->SetField(fieldId,value.c_str());</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>               polyFeature->SetField(fieldId,value.c_str());</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>           }</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>           ++fieldId;</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         }</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         ++colId;</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       }</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       <span class="keywordflow">if</span>(colId!=fieldId+2){</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>         std::ostringstream ess;</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>         ess << <span class="stringliteral">"Error: colId = "</span> << colId << <span class="stringliteral">" is different from fieldId+2 = "</span> << fieldId;</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>         <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       }</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>       <span class="keywordflow">if</span>(eGType==wkbPoint){</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>         pointFeature->SetGeometry( &thePoint );</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>         <span class="keywordflow">if</span>(createFeature(pointFeature)!=OGRERR_NONE){</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>           std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>           <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>           OGRFeature::DestroyFeature( pointFeature );</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>         }</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       }</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>         <span class="keywordflow">if</span>(firstPoint.IsEmpty()){</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>           firstPoint=thePoint;</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>         }</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>         theRing.addPoint(&thePoint);</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       }</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     }</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>   }</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   <span class="keywordflow">if</span>(eGType!=wkbPoint){</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     theRing.addPoint(&firstPoint);<span class="comment">//close the ring</span></div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     thePolygon.addRing(&theRing);</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     <span class="comment">// SetSpatialFilter(&thePolygon)</span></div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     polyFeature->SetGeometry( &thePolygon );</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     <span class="keywordflow">if</span>(createFeature(polyFeature)!=OGRERR_NONE){</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>       std::string errorString=<span class="stringliteral">"Failed to create feature"</span>;</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       OGRFeature::DestroyFeature( polyFeature );</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     }</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   }</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   <span class="keywordflow">return</span> getFeatureCount();</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span> }</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span> </div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span> <span class="keywordtype">int</span> ImgWriterOgr::addData(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& imgReader, <span class="keywordtype">int</span> theLayer, <span class="keywordtype">bool</span> verbose)</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span> {</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>   OGRLayer  *poLayer;</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   assert(m_datasource->GetLayerCount()>theLayer);</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     std::cout << <span class="stringliteral">"number of layers: "</span> << m_datasource->GetLayerCount() << std::endl;</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     std::cout << <span class="stringliteral">"get layer "</span> << theLayer << std::endl;</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   poLayer = m_datasource->GetLayer(theLayer);</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   <span class="comment">//start reading features from the layer</span></div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>   OGRFeature *poFeature;</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     std::cout << <span class="stringliteral">"reset reading"</span> << std::endl;</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>   poLayer->ResetReading();</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<imgReader.nrOfBand();++iband){</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     std::ostringstream fs;</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     fs << <span class="stringliteral">"band"</span> << iband;</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     createField(fs.str(),OFTReal,theLayer);</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>   }</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>   OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>   <span class="keywordtype">int</span> nfield=poFDefn->GetFieldCount();</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>   <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     std::cout << <span class="stringliteral">"new number of fields: "</span> << nfield << std::endl;</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>   <span class="keywordflow">while</span>( (poFeature = poLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     poGeometry = poFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     assert(poGeometry != NULL </div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>            && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     <span class="keywordtype">double</span> x=poPoint->getX();</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     <span class="keywordtype">double</span> y=poPoint->getY();</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<imgReader.nrOfBand();++iband){</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       <span class="keywordtype">double</span> imgData;</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       imgReader.readData(imgData,GDT_Float64,x,y,iband);</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       <span class="comment">//todo: put imgdata in field</span></div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       std::ostringstream fs;</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       fs << <span class="stringliteral">"band"</span> << iband;</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       poFeature->SetField(fs.str().c_str(),imgData);</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     }</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>   }</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>   <span class="keywordflow">return</span>(nfield);</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span> }</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span> </div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgWriterOgr_8h_source.html b/doc/html/ImgWriterOgr_8h_source.html
index 049f70b..643ea2d 100644
--- a/doc/html/ImgWriterOgr_8h_source.html
+++ b/doc/html/ImgWriterOgr_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -116,29 +116,42 @@
 <div class="line"><a name="l00062"></a><span class="lineno">   62</span>   OGRErr createFeature(OGRFeature* theFeature, <span class="keywordtype">int</span> layer=0);</div>
 <div class="line"><a name="l00063"></a><span class="lineno">   63</span>   <span class="keywordtype">int</span> getFieldCount(<span class="keywordtype">int</span> layer=0) <span class="keyword">const</span>;</div>
 <div class="line"><a name="l00064"></a><span class="lineno">   64</span>   <span class="keywordtype">int</span> getFeatureCount(<span class="keywordtype">int</span> layer=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>   OGRDataSource* getDataSource(<span class="keywordtype">void</span>) {<span class="keywordflow">return</span> m_datasource;};</div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>   OGRSFDriver* getDriver(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_datasource->GetDriver();};</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span> </div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span> <span class="keyword">protected</span>:</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>   <span class="keywordtype">void</span> setCodec(<span class="keyword">const</span> std::string& imageType);</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   <span class="keywordtype">void</span> setCodec(OGRSFDriver *poDriver);</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   </div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="comment">//   OGRLayer* getLayer(int layer=0);</span></div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>     </div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   std::string m_filename;</div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   OGRDataSource *m_datasource;</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="comment">//   vector<OGRLayer*> m_layers;</span></div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span> };</div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span> </div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span> <span class="preprocessor">#endif // _IMGWRITEROGR_H_</span></div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span> <span class="preprocessor"></span>  OGRDataSource* getDataSource(<span class="keywordtype">void</span>) {<span class="keywordflow">return</span> m_datasource;};</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>   OGRSFDriver* getDriver(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_datasource->GetDriver();};</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span> <span class="preprocessor"></span>  GDALDataset* getDataSource(<span class="keywordtype">void</span>) {<span class="keywordflow">return</span> m_datasource;};</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   GDALDriver* getDriver(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_datasource->GetDriver();};</div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="preprocessor"></span></div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <span class="keywordtype">void</span> setCodec(<span class="keyword">const</span> std::string& imageType);</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="preprocessor"></span>  <span class="keywordtype">void</span> setCodec(OGRSFDriver *poDriver);</div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span> <span class="preprocessor"></span>  <span class="keywordtype">void</span> setCodec(GDALDriver *poDriver);</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span> <span class="preprocessor"></span>  </div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span> <span class="comment">//   OGRLayer* getLayer(int layer=0);</span></div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>     </div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   std::string m_filename;</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span> <span class="preprocessor">#if GDAL_VERSION_MAJOR < 2</span></div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span> <span class="preprocessor"></span>  OGRDataSource *m_datasource;</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span> <span class="preprocessor"></span>  GDALDataset *m_datasource;</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span> <span class="preprocessor"></span><span class="comment">//   vector<OGRLayer*> m_layers;</span></div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span> };</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span> </div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span> <span class="preprocessor">#endif // _IMGWRITEROGR_H_</span></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 <div class="ttc" id="classImgWriterOgr_html"><div class="ttname"><a href="classImgWriterOgr.html">ImgWriterOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterOgr_8h_source.html#l00035">ImgWriterOgr.h:35</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/IndexValue_8h_source.html b/doc/html/IndexValue_8h_source.html
index f10f23d..3eacdf6 100644
--- a/doc/html/IndexValue_8h_source.html
+++ b/doc/html/IndexValue_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -105,7 +105,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/OptFactory_8h_source.html b/doc/html/OptFactory_8h_source.html
index 308b851..13e8093 100644
--- a/doc/html/OptFactory_8h_source.html
+++ b/doc/html/OptFactory_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -272,7 +272,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Optionpk_8h_source.html b/doc/html/Optionpk_8h_source.html
index 2c37885..1688cdd 100644
--- a/doc/html/Optionpk_8h_source.html
+++ b/doc/html/Optionpk_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -474,7 +474,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/PosValue_8h_source.html b/doc/html/PosValue_8h_source.html
index eace62d..c93f344 100644
--- a/doc/html/PosValue_8h_source.html
+++ b/doc/html/PosValue_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -106,7 +106,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ProcessingPktoolsPlugin_8py_source.html b/doc/html/ProcessingPktoolsPlugin_8py_source.html
index ee42273..872ccf0 100644
--- a/doc/html/ProcessingPktoolsPlugin_8py_source.html
+++ b/doc/html/ProcessingPktoolsPlugin_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -107,7 +107,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/StatFactory_8h_source.html b/doc/html/StatFactory_8h_source.html
index 31af71b..5c20853 100644
--- a/doc/html/StatFactory_8h_source.html
+++ b/doc/html/StatFactory_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -212,1409 +212,1512 @@
 <div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> T sum(<span class="keyword">const</span> std::vector<T>& v) <span class="keyword">const</span>;</div>
 <div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> mean(<span class="keyword">const</span> std::vector<T>& v) <span class="keyword">const</span>;</div>
 <div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> eraseNoData(std::vector<T>& v) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> T median(<span class="keyword">const</span> std::vector<T>& v) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> var(<span class="keyword">const</span> std::vector<T>& v) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> moment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> cmoment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> skewness(<span class="keyword">const</span> std::vector<T>& v) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> kurtosis(<span class="keyword">const</span> std::vector<T>& v) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> meanVar(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">double</span>& m1, <span class="keywordtype">double</span>& v1) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span>  scale2byte(<span class="keyword">const</span> std::vector<T1>& input, std::vector<T2>& output, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> lbound=0, <span class="keywordtype">unsigned</span> <spa [...]
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> distribution(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end,  std::vector<double>& output, <span cla [...]
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> distribution(<span class="keyword">const</span> std::vector<T>& input,  std::vector<double>& output, <span class="keywordtype">int</span> nbin, <span class="keywordtype">double</span> sigma=0, <span class="keyword">const</span> std::string &filename=<span class="strin [...]
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  distribution2d(<span class="keyword">const</span> std::vector<T>& inputX, <span class="keyword">const</span> std::vector<T>& inputY, std::vector< std::vector<double> >& output, <span class="keywordtype">int</span> nbin, T& minX, T& maxX, T& mi [...]
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> cumulative (<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<int>& output, <span class="k [...]
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  percentiles (<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<T>& output, <span class="k [...]
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> T percentile(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, <span class="keywordtype">double</span> percent, T minimum=0, T maximum=0) <span class= [...]
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> signature(<span class="keyword">const</span> std::vector<T>& input, <span class="keywordtype">double</span>& k, <span class="keywordtype">double</span>& alpha, <span class="keywordtype">double</span>& beta, <span class="keywordtype">double</span> e) <span class="keyword [...]
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <span class="keywordtype">void</span> signature(<span class="keywordtype">double</span> m1, <span class="keywordtype">double</span> m2, <span class="keywordtype">double</span>& k, <span class="keywordtype">double</span>& alpha, <span class="keywordtype">double</span>& beta, <span class="keywordtype">double</span> e) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> normalize(<span class="keyword">const</span> std::vector<T>& input, std::vector<double>& output) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> normalize_pct(std::vector<T>& input) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> rmse(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> delay=0) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <span class="comment">//  template<class T> double gsl_correlation(const std::vector<T>& x, const std::vector<T>& y) const;</span></div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> gsl_covariance(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> cross_correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> maxdelay, std::vector<T>& z) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> linear_regression(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> linear_regression_err(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateNoData(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::string& type, std::vector<T>& output, <span class="keywordtype">bool</sp [...]
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateUp(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::vector<double>& wavelengthOut, <span class="keyword">const</span> std::string&am [...]
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateUp(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector< std::vector<T> >& input, <span class="keyword">const</span> std::vector<double>& wavelengthOut, <span class="keyword">const< [...]
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="comment">// template<class T> void interpolateUp(const std::vector< std::vector<T> >& input, std::vector< std::vector<T> >& output, double start, double end, double step, const gsl_interp_type* type);</span></div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="comment">// template<class T> void interpolateUp(const std::vector< std::vector<T> >& input, const std::vector<double>& wavelengthIn, std::vector< std::vector<T> >& output, std::vector<double>& wavelengthOut, double start, double end, double step, const gsl_interp_type* type);</span></div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> nearUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateUp(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin);</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateDown(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateDown(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin);</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span> </div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span> <span class="keyword">private</span>:</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <span class="keyword">static</span> <span class="keywordtype">void</span> initMap(std::map<std::string, INTERPOLATION_TYPE>& m_interpMap){</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     <span class="comment">//initialize selMap</span></div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     m_interpMap[<span class="stringliteral">"linear"</span>]=linear;</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     m_interpMap[<span class="stringliteral">"polynomial"</span>]=polynomial;</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     m_interpMap[<span class="stringliteral">"cspline"</span>]=cspline;</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     m_interpMap[<span class="stringliteral">"cspline_periodic"</span>]=cspline_periodic;</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     m_interpMap[<span class="stringliteral">"akima"</span>]=akima;</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     m_interpMap[<span class="stringliteral">"akima_periodic"</span>]=akima_periodic;</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   }</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   <span class="keyword">static</span> <span class="keywordtype">void</span> initDist(std::map<std::string, DISTRIBUTION_TYPE>& m_distMap){</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     <span class="comment">//initialize distMap</span></div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     m_distMap[<span class="stringliteral">"gaussian"</span>]=gaussian;</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     m_distMap[<span class="stringliteral">"uniform"</span>]=uniform;</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   }</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   std::vector<double> m_noDataValues;</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span> };</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span> </div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span> </div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T&g [...]
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="keywordflow">for</span>(<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     <span class="keywordflow">if</span>(!isNoData(*it)){</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     <span class="keywordflow">if</span>(*tmpIt>*it)</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       tmpIt=it;</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>       }</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     tmpIt=it;</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>       }</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     }</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   }</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   }</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span> }</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span> </div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt;</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     <span class="keywordflow">if</span>(!isNoData(*it)){</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>       <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordflow">if</span>(*tmpIt>*it)</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>       tmpIt=it;</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       }</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     tmpIt=it;</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>       }</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     }</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   }</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   }</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span> }</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span> </div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span>  <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   T minValue=minConstraint;</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>       <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<=minValue)){</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     tmpIt=it;</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     minValue=*it;</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       }</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     }</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>       tmpIt=it;</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       minValue=*it;</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     }    </div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   }</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   }</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span> }</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span> </div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt;</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   T minValue=minConstraint;</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<=minValue)){</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     tmpIt=it;</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     minValue=*it;</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       }</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     }</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>       tmpIt=it;</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       minValue=*it;</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     }    </div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   }</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>   }</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span> }</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span> </div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T&g [...]
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>       <span class="keywordflow">if</span>(*tmpIt<*it)</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     tmpIt=it;</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     }</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       tmpIt=it;</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     }</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   }</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   }</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span> }</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span> </div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt;</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       <span class="keywordflow">if</span>(*tmpIt<*it)</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     tmpIt=it;</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     }</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       tmpIt=it;</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     }</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   }</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="keywordflow">return</span> end;</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span> }</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span> </div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T&g [...]
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   T maxValue=maxConstraint;</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">if</span>((maxConstraint>=*it)&&(*it>=maxValue)){</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     tmpIt=it;</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     maxValue=*it;</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       }</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     }</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       tmpIt=it;</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       maxValue=*it;</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     }    </div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   }</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   <span class="keywordflow">else</span>  </div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     <span class="keywordflow">return</span> end;</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span> }</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span> </div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt=v.end();</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>   T maxValue=maxConstraint;</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       <span class="keywordflow">if</span>((maxConstraint>=*it)&&(*it>=maxValue)){</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     tmpIt=it;</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     maxValue=*it;</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       }</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     }</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       tmpIt=it;</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       maxValue=*it;</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     }    </div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>   }</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>   <span class="keywordflow">else</span>  </div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <span class="keywordflow">return</span> end;</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span> }</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span> </div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   <span class="keywordflow">if</span>(v.empty()){</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>     std::string errorString=<span class="stringliteral">"Error: vector is empty"</span>;</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   }</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   T minValue;</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       <span class="keywordflow">if</span>(minValue>*it)</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       minValue=*it;</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     }</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       minValue=*it;</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     }</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>   }</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     <span class="keywordflow">return</span> minValue;</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>   }</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span> }</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span> </div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, T minConstraint)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>   T minValue=minConstraint;</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<=minValue))</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       minValue=*it;</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>   }</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     <span class="keywordflow">return</span> minValue;</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>   }</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span> }</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span> </div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>   <span class="keywordflow">if</span>(v.empty()){</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     std::string errorString=<span class="stringliteral">"Error: vector is empty"</span>;</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>   }</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   T maxValue;</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       <span class="keywordflow">if</span>(maxValue<*it)</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       maxValue=*it;</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     }</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       maxValue=*it;</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     }</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>   }</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     <span class="keywordflow">return</span> maxValue;</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   }</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span> }</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span> </div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, T maxConstraint)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   T maxValue=maxConstraint;</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     <span class="keywordflow">if</span>((maxValue<=*it)&&(*it<=maxConstraint))</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       maxValue=*it;</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   }</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>     <span class="keywordflow">return</span> maxValue;</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>   }</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span> }</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span> </div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::absmax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       <span class="keywordflow">if</span>(abs(*tmpIt)<abs(*it))</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     tmpIt=it;</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     }</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       tmpIt=it;</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nvalid(<span class="keyword">const</span> std::vector<T>& v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> T median(<span class="keyword">const</span> std::vector<T>& v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> var(<span class="keyword">const</span> std::vector<T>& v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> moment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> cmoment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> skewness(<span class="keyword">const</span> std::vector<T>& v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> kurtosis(<span class="keyword">const</span> std::vector<T>& v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> meanVar(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">double</span>& m1, <span class="keywordtype">double</span>& v1) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span>  scale2byte(<span class="keyword">const</span> std::vector<T1>& input, std::vector<T2>& output, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> lbound=0, <span class="keywordtype">unsigned</span> <spa [...]
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> distribution(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end,  std::vector<double>& output, <span cla [...]
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> distribution(<span class="keyword">const</span> std::vector<T>& input,  std::vector<double>& output, <span class="keywordtype">int</span> nbin, <span class="keywordtype">double</span> sigma=0, <span class="keyword">const</span> std::string &filename=<span class="strin [...]
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  distribution2d(<span class="keyword">const</span> std::vector<T>& inputX, <span class="keyword">const</span> std::vector<T>& inputY, std::vector< std::vector<double> >& output, <span class="keywordtype">int</span> nbin, T& minX, T& maxX, T& mi [...]
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> cumulative (<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<int>& output, <span class="k [...]
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  percentiles (<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<T>& output, <span class="k [...]
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> T percentile(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, <span class="keywordtype">double</span> percent, T minimum=0, T maximum=0) <span class= [...]
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> signature(<span class="keyword">const</span> std::vector<T>& input, <span class="keywordtype">double</span>& k, <span class="keywordtype">double</span>& alpha, <span class="keywordtype">double</span>& beta, <span class="keywordtype">double</span> e) <span class="keyword [...]
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="keywordtype">void</span> signature(<span class="keywordtype">double</span> m1, <span class="keywordtype">double</span> m2, <span class="keywordtype">double</span>& k, <span class="keywordtype">double</span>& alpha, <span class="keywordtype">double</span>& beta, <span class="keywordtype">double</span> e) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> normalize(<span class="keyword">const</span> std::vector<T>& input, std::vector<double>& output) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> normalize_pct(std::vector<T>& input) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> rmse(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> nrmse(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> cvrmse(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> delay=0) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   <span class="comment">//  template<class T> double gsl_correlation(const std::vector<T>& x, const std::vector<T>& y) const;</span></div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> gsl_covariance(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> cross_correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> maxdelay, std::vector<T>& z) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> linear_regression(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> linear_regression_err(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateNoData(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::string& type, std::vector<T>& output, <span class="keywordtype">bool</sp [...]
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateUp(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::vector<double>& wavelengthOut, <span class="keyword">const</span> std::string&am [...]
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateUp(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector< std::vector<T> >& input, <span class="keyword">const</span> std::vector<double>& wavelengthOut, <span class="keyword">const< [...]
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="comment">// template<class T> void interpolateUp(const std::vector< std::vector<T> >& input, std::vector< std::vector<T> >& output, double start, double end, double step, const gsl_interp_type* type);</span></div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <span class="comment">// template<class T> void interpolateUp(const std::vector< std::vector<T> >& input, const std::vector<double>& wavelengthIn, std::vector< std::vector<T> >& output, std::vector<double>& wavelengthOut, double start, double end, double step, const gsl_interp_type* type);</span></div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> nearUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateUp(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateDown(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> interpolateDown(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin);</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span> </div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span> <span class="keyword">private</span>:</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keyword">static</span> <span class="keywordtype">void</span> initMap(std::map<std::string, INTERPOLATION_TYPE>& m_interpMap){</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     <span class="comment">//initialize selMap</span></div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     m_interpMap[<span class="stringliteral">"linear"</span>]=linear;</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     m_interpMap[<span class="stringliteral">"polynomial"</span>]=polynomial;</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     m_interpMap[<span class="stringliteral">"cspline"</span>]=cspline;</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     m_interpMap[<span class="stringliteral">"cspline_periodic"</span>]=cspline_periodic;</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     m_interpMap[<span class="stringliteral">"akima"</span>]=akima;</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     m_interpMap[<span class="stringliteral">"akima_periodic"</span>]=akima_periodic;</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   }</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <span class="keyword">static</span> <span class="keywordtype">void</span> initDist(std::map<std::string, DISTRIBUTION_TYPE>& m_distMap){</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     <span class="comment">//initialize distMap</span></div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     m_distMap[<span class="stringliteral">"gaussian"</span>]=gaussian;</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     m_distMap[<span class="stringliteral">"uniform"</span>]=uniform;</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   }</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   std::vector<double> m_noDataValues;</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span> };</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span> </div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span> </div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T&g [...]
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   <span class="keywordflow">for</span>(<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <span class="keywordflow">if</span>(!isNoData(*it)){</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>       <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     <span class="keywordflow">if</span>(*tmpIt>*it)</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>       tmpIt=it;</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       }</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     tmpIt=it;</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       }</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     }</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   }</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   }</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span> }</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span> </div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt;</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     <span class="keywordflow">if</span>(!isNoData(*it)){</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     <span class="keywordflow">if</span>(*tmpIt>*it)</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       tmpIt=it;</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>       }</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     tmpIt=it;</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>       }</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     }</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   }</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   }</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span> }</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span> </div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span>  <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   T minValue=minConstraint;</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<minValue)){</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     tmpIt=it;</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     minValue=*it;</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       }</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     }</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       <span class="keywordflow">if</span>(*it<minValue)</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       tmpIt=it;</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       minValue=*it;</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     }    </div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   }</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   }</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span> }</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span> </div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt;</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   T minValue=minConstraint;</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<minValue)){</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     tmpIt=it;</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     minValue=*it;</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       }</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     }</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>       <span class="keywordflow">if</span>(*it<minConstraint)</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       tmpIt=it;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>       minValue=*it;</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     }    </div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   }</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   }</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span> }</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span> </div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T&g [...]
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       <span class="keywordflow">if</span>(*tmpIt<*it)</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     tmpIt=it;</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     }</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       tmpIt=it;</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     }</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   }</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   }</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span> }</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span> </div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt;</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       <span class="keywordflow">if</span>(*tmpIt<*it)</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     tmpIt=it;</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     }</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       tmpIt=it;</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     }</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   }</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span> }</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span> </div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T&g [...]
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   T maxValue=maxConstraint;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       <span class="keywordflow">if</span>((maxConstraint>=*it)&&(*it>maxValue)){</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     tmpIt=it;</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     maxValue=*it;</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       }</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     }</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       <span class="keywordflow">if</span>(*it>maxConstraint)</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       tmpIt=it;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       maxValue=*it;</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     }    </div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   }</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>   <span class="keywordflow">else</span>  </div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span> }</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span> </div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt=v.end();</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>   T maxValue=maxConstraint;</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="keywordflow">if</span>((maxConstraint>=*it)&&(*it>maxValue)){</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     tmpIt=it;</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     maxValue=*it;</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       }</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     }</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       <span class="keywordflow">if</span>(*it>maxValue)</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       tmpIt=it;</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       maxValue=*it;</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>     }    </div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   }</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   <span class="keywordflow">else</span>  </div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span> }</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span> </div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>   <span class="keywordflow">if</span>(v.empty()){</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     std::string errorString=<span class="stringliteral">"Error: vector is empty"</span>;</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>   }</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>   T minValue;</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">if</span>(minValue>*it)</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       minValue=*it;</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     }</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       minValue=*it;</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     }</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>   }</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     <span class="keywordflow">return</span> minValue;</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>   }</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span> }</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span> </div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, T minConstraint)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>   T minValue=minConstraint;</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<minValue))</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     minValue=*it;</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>     }</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       <span class="keywordflow">if</span>(*it<minValue)</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>       minValue=*it;</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     }    </div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   }</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     <span class="keywordflow">return</span> minValue;</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>   }</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span> }</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span> </div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>   <span class="keywordflow">if</span>(v.empty()){</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     std::string errorString=<span class="stringliteral">"Error: vector is empty"</span>;</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   }</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>   T maxValue;</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       <span class="keywordflow">if</span>(maxValue<*it)</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       maxValue=*it;</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>     }</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       maxValue=*it;</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     }</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>   }</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>     <span class="keywordflow">return</span> maxValue;</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   }</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span> }</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span> </div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, T maxConstraint)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>   T maxValue=maxConstraint;</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       <span class="keywordflow">if</span>((*it<=maxConstraint)&&(*it>maxValue))</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       maxValue=*it;</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     }</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       <span class="keywordflow">if</span>(*it>maxValue)</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       maxValue=*it;</div>
 <div class="line"><a name="l00542"></a><span class="lineno">  542</span>       isValid=<span class="keyword">true</span>;</div>
 <div class="line"><a name="l00543"></a><span class="lineno">  543</span>     }</div>
 <div class="line"><a name="l00544"></a><span class="lineno">  544</span>   }</div>
 <div class="line"><a name="l00545"></a><span class="lineno">  545</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     <span class="keywordflow">return</span> end;</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span> }</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span> </div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::absmin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       <span class="keywordflow">if</span>(abs(*tmpIt)>abs(*it))</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     tmpIt=it;</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     }</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       tmpIt=it;</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     <span class="keywordflow">return</span> maxValue;</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>   }</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span> }</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span> </div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::absmax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       <span class="keywordflow">if</span>(abs(*tmpIt)<abs(*it))</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     tmpIt=it;</div>
 <div class="line"><a name="l00565"></a><span class="lineno">  565</span>     }</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>   }</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordflow">return</span> end;</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span> }</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span> </div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">void</span> StatFactory::minmax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, T& theMi [...]
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       <span class="keywordflow">if</span>(theMin>*it)</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     theMin=*it;</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       <span class="keywordflow">if</span>(theMax<*it)</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     theMax=*it;</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     }</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       theMin=*it;</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       theMax=*it;</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     }</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>   }</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   <span class="keywordflow">if</span>(!isValid){</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       theMin=m_noDataValues[0];</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       theMax=m_noDataValues[0];</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     }</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     }</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>   }</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span> }</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span> </div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::sum(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>   T tmpSum=0;</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     tmpSum+=*it;</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>   }</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     <span class="keywordflow">return</span> tmpSum;</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>   }</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span> }</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span> </div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">double</span> StatFactory::mean(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   T tmpSum=0;</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     ++validSize;</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     tmpSum+=*it;</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>   }</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>   <span class="keywordflow">if</span>(validSize)</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(tmpSum)/validSize;</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   }</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span> }</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span> </div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">void</span> StatFactory::eraseNoData(std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     <span class="keyword">typename</span> std::vector<T>::iterator it=v.begin();</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     <span class="keywordflow">while</span>(it!=v.end()){</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     v.erase(it);</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     ++it;</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     }</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   }</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span> }</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span> </div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span> <span class="keyword">template</span><<span class="keyword">class</span> T> T StatFactory::median(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   std::vector<T> tmpV=v;</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   eraseNoData(tmpV);</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   <span class="keywordflow">if</span>(tmpV.size()){</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     sort(tmpV.begin(),tmpV.end());</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     <span class="keywordflow">if</span>(tmpV.size()%2)</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       <span class="keywordflow">return</span> tmpV[tmpV.size()/2];</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       <span class="keywordflow">return</span> 0.5*(tmpV[tmpV.size()/2-1]+tmpV[tmpV.size()/2]);</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   }</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   }</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span> }</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span> </div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::var(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>   <span class="keywordtype">double</span> m1=0;</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   <span class="keywordtype">double</span> m2=0;</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     m1+=*it;</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     m2+=(*it)*(*it);</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     ++validSize;</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   }</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   <span class="keywordflow">if</span>(validSize){</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     m2/=validSize;</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     m1/=validSize;</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     <span class="keywordflow">return</span> m2-m1*m1;</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>   }</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>   }</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span> }</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span> </div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::moment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   <span class="keywordtype">double</span> m=0;</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span> <span class="comment">//   double m1=mean(v);</span></div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>   <span class="keywordflow">for</span>(it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     m+=pow((*it),n);</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     ++validSize;</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>   }</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>   <span class="keywordflow">if</span>(validSize)</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     <span class="keywordflow">return</span> m/validSize;</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>   }</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span> }</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span> </div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>   <span class="comment">//central moment</span></div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::cmoment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>   <span class="keywordtype">double</span> m=0;</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>   <span class="keywordtype">double</span> m1=mean(v);</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>   <span class="keywordflow">for</span>(it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     m+=pow((*it-m1),n);</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     ++validSize;</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>   }</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>   <span class="keywordflow">if</span>(validSize)</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>     <span class="keywordflow">return</span> m/validSize;</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>   }</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span> }</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span> </div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::skewness(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>   <span class="comment">//todo: what if nodata value?</span></div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>   <span class="keywordflow">return</span> cmoment(v,3)/pow(var(v),1.5);</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span> }</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span> </div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::kurtosis(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>   <span class="comment">//todo: what if nodata value?</span></div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>   <span class="keywordtype">double</span> m2=cmoment(v,2);</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>   <span class="keywordtype">double</span> m4=cmoment(v,4);</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>   <span class="keywordflow">return</span> m4/m2/m2-3.0;</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span> }</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span> </div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::meanVar(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">double</span>& m1, <span class="keywordtype">double</span>& v1)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>   m1=0;</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>   v1=0;</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>   <span class="keywordtype">double</span> m2=0;</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>     m1+=*it;</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>     m2+=(*it)*(*it);</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>     ++validSize;</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>   }</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>   <span class="keywordflow">if</span>(validSize){</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     m2/=validSize;</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     m1/=validSize;</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     v1=m2-m1*m1;</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>   }</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     m1=m_noDataValues[0];</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>     v1=m_noDataValues[0];</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       tmpIt=it;</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     }</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>   }</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span> }</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span> </div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::absmin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       <span class="keywordflow">if</span>(abs(*tmpIt)>abs(*it))</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     tmpIt=it;</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     }</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       tmpIt=it;</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     }</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   }</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>     <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span> }</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span> </div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">void</span> StatFactory::minmax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, T& theMi [...]
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>   <span class="keywordtype">bool</span> isConstraint=(theMax>theMin);</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>   <span class="keywordtype">double</span> minConstraint=theMin;</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>   <span class="keywordtype">double</span> maxConstraint=theMax;</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="keywordflow">if</span>(isConstraint){</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     <span class="keywordflow">if</span>(*it<minConstraint)</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     <span class="keywordflow">if</span>(*it>maxConstraint)</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       }</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       <span class="keywordflow">if</span>(*it<theMin)</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     theMin=*it;</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="keywordflow">if</span>(*it>theMax)</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     theMax=*it;</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     }</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       <span class="keywordflow">if</span>(isConstraint){</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     <span class="keywordflow">if</span>(*it<minConstraint)</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     <span class="keywordflow">if</span>(*it>maxConstraint)</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       }</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       theMin=*it;</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       theMax=*it;</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     }</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>   }</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>   <span class="keywordflow">if</span>(!isValid){</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       theMin=m_noDataValues[0];</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       theMax=m_noDataValues[0];</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     }</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     }</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   }</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span> }</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span> </div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::sum(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>   T tmpSum=0;</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     tmpSum+=*it;</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>   }</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     <span class="keywordflow">return</span> tmpSum;</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   }</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span> }</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span> </div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">double</span> StatFactory::mean(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   T tmpSum=0;</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     ++validSize;</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     tmpSum+=*it;</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   }</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>   <span class="keywordflow">if</span>(validSize)</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(tmpSum)/validSize;</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   }</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span> }</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span> </div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">void</span> StatFactory::eraseNoData(std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     <span class="keyword">typename</span> std::vector<T>::iterator it=v.begin();</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     <span class="keywordflow">while</span>(it!=v.end()){</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     v.erase(it);</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     ++it;</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     }</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>   }</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span> }</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span> </div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> StatFactory::nvalid(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>   std::vector<T> tmpV=v;</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>   eraseNoData(tmpV);</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>   <span class="keywordflow">return</span>(tmpV.size());</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>  }</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span> </div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span> <span class="keyword">template</span><<span class="keyword">class</span> T> T StatFactory::median(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   std::vector<T> tmpV=v;</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>   eraseNoData(tmpV);</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>   <span class="keywordflow">if</span>(tmpV.size()){</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     sort(tmpV.begin(),tmpV.end());</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     <span class="keywordflow">if</span>(tmpV.size()%2)</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>       <span class="keywordflow">return</span> tmpV[tmpV.size()/2];</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       <span class="keywordflow">return</span> 0.5*(tmpV[tmpV.size()/2-1]+tmpV[tmpV.size()/2]);</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>   }</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>   }</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span> }</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span> </div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::var(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   <span class="keywordtype">double</span> m1=0;</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   <span class="keywordtype">double</span> m2=0;</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     m1+=*it;</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     m2+=(*it)*(*it);</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     ++validSize;</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>   }</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>   <span class="keywordflow">if</span>(validSize){</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>     m2/=validSize;</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>     m1/=validSize;</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>     <span class="keywordflow">return</span> m2-m1*m1;</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>   }</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>   }</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span> }</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span> </div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::moment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>   <span class="keywordtype">double</span> m=0;</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span> <span class="comment">//   double m1=mean(v);</span></div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>   <span class="keywordflow">for</span>(it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>     m+=pow((*it),n);</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>     ++validSize;</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>   }</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>   <span class="keywordflow">if</span>(validSize)</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>     <span class="keywordflow">return</span> m/validSize;</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>   }</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span> }</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span> </div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>   <span class="comment">//central moment</span></div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::cmoment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>   <span class="keywordtype">double</span> m=0;</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>   <span class="keywordtype">double</span> m1=mean(v);</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>   <span class="keywordflow">for</span>(it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     m+=pow((*it-m1),n);</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>     ++validSize;</div>
 <div class="line"><a name="l00784"></a><span class="lineno">  784</span>   }</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>   }</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span> }</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span> </div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span> <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> StatFactory::scale2byte(<span class="keyword">const</span> std::vector<T1>& input, std::vector<T2>& output, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> lbound,  <span class="keywordtype">unsigned</s [...]
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>   output.resize(input.size());</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>   T1 minimum=mymin(input);</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>   T1 maximum=mymax(input);</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>   <span class="keywordflow">if</span>(minimum>=maximum){</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>   }</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>   <span class="keywordtype">double</span> scale=(ubound-lbound)/(maximum-minimum);</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>   <span class="comment">//todo: what if nodata value?</span></div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0;i<input.size();++i){</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     output[i]=scale*(input[i]-(minimum))+lbound;</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>   }</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span> }</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span> </div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::distribution(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<double>& output [...]
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>   <span class="keywordtype">double</span> minValue=0;</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>   <span class="keywordtype">double</span> maxValue=0;</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>   minmax(input,begin,end,minValue,maxValue);</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>   <span class="keywordflow">if</span>(minimum<maximum&&minimum>minValue)</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     minValue=minimum;</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>   <span class="keywordflow">if</span>(minimum<maximum&&maximum<maxValue)</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     maxValue=maximum;</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span> </div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>   <span class="comment">//todo: check...</span></div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>   minimum=minValue;</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>   maximum=maxValue;</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span> </div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>   <span class="keywordflow">if</span>(maximum<=minimum){</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (min>=max)"</span>;</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>   }</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>   <span class="keywordflow">if</span>(!nbin){</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     std::string errorString=<span class="stringliteral">"Error: nbin not defined"</span>;</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>   }</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>   <span class="keywordflow">if</span>(!input.size()){</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>   }</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>   <span class="keywordflow">if</span>(output.size()!=nbin){</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>     output.resize(nbin);</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;output[i++]=0);</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>   }</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>   <span class="keywordflow">for</span>(it=begin;it!=end;++it){</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <span class="keywordflow">if</span>(*it<minimum)</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="keywordflow">if</span>(*it>maximum)</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     <span class="keywordflow">if</span>(sigma>0){</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>       <span class="comment">// minimum-=2*sigma;</span></div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       <span class="comment">// maximum+=2*sigma;</span></div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>       <span class="comment">//todo: calculate real surface below pdf by using gsl_cdf_gaussian_P(x-mean+binsize,sigma)-gsl_cdf_gaussian_P(x-mean,sigma)</span></div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin){</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>         <span class="keywordtype">double</span> icenter=minimum+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maximum-minimum)*(ibin+0.5)/nbin;</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>         <span class="keywordtype">double</span> thePdf=gsl_ran_gaussian_pdf(*it-icenter, sigma);</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>         output[ibin]+=thePdf;</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       }</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     }</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       <span class="keywordtype">int</span> theBin=0;</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       <span class="keywordflow">if</span>(*it==maximum)</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>         theBin=nbin-1;</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*it>minimum && *it<maximum)</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>         theBin=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>((nbin-1)*(*it)-minimum)/(maximum-minimum));</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       ++output[theBin];</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       <span class="comment">// if(*it==maximum)</span></div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <span class="comment">//   ++output[nbin-1];</span></div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       <span class="comment">// else if(*it>=minimum && *it<maximum)</span></div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       <span class="comment">//   ++output[static_cast<int>(static_cast<double>((*it)-minimum)/(maximum-minimum)*nbin)];</span></div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>     }</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>   <span class="keywordflow">if</span>(validSize)</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     <span class="keywordflow">return</span> m/validSize;</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>   }</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span> }</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span> </div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::skewness(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>   <span class="comment">//todo: what if nodata value?</span></div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>   <span class="keywordflow">return</span> cmoment(v,3)/pow(var(v),1.5);</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span> }</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span> </div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::kurtosis(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>   <span class="comment">//todo: what if nodata value?</span></div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>   <span class="keywordtype">double</span> m2=cmoment(v,2);</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>   <span class="keywordtype">double</span> m4=cmoment(v,4);</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>   <span class="keywordflow">return</span> m4/m2/m2-3.0;</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span> }</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span> </div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::meanVar(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">double</span>& m1, <span class="keywordtype">double</span>& v1)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>   m1=0;</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>   v1=0;</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>   <span class="keywordtype">double</span> m2=0;</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     m1+=*it;</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     m2+=(*it)*(*it);</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>     ++validSize;</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>   }</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>   <span class="keywordflow">if</span>(validSize){</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     m2/=validSize;</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     m1/=validSize;</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     v1=m2-m1*m1;</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>   }</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>     m1=m_noDataValues[0];</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     v1=m_noDataValues[0];</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>   }</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>   }</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span> }</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span> </div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span> <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> StatFactory::scale2byte(<span class="keyword">const</span> std::vector<T1>& input, std::vector<T2>& output, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> lbound,  <span class="keywordtype">unsigned</s [...]
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>   output.resize(input.size());</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>   T1 minimum=mymin(input);</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>   T1 maximum=mymax(input);</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>   <span class="keywordflow">if</span>(minimum>=maximum){</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>   }</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>   <span class="keywordtype">double</span> scale=(ubound-lbound)/(maximum-minimum);</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>   <span class="comment">//todo: what if nodata value?</span></div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0;i<input.size();++i){</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     output[i]=scale*(input[i]-(minimum))+lbound;</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>   }</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span> }</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span> </div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::distribution(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<double>& output [...]
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>   <span class="keywordtype">double</span> minValue=0;</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>   <span class="keywordtype">double</span> maxValue=0;</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>   minmax(input,begin,end,minimum,maximum);</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>   <span class="keywordflow">if</span>(minimum<maximum&&minimum>minValue)</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>   minValue=minimum;</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>   <span class="keywordflow">if</span>(minimum<maximum&&maximum<maxValue)</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>   maxValue=maximum;</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span> </div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>   <span class="comment">//todo: check...</span></div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>   minimum=minValue;</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>   maximum=maxValue;</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span> </div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>   <span class="keywordflow">if</span>(maximum<=minimum){</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (min>=max)"</span>;</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>     <span class="keywordflow">throw</span>(s.str());</div>
 <div class="line"><a name="l00872"></a><span class="lineno">  872</span>   }</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>   <span class="keywordflow">if</span>(!isValid){</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>   <span class="keywordflow">if</span>(!nbin){</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     std::string errorString=<span class="stringliteral">"Error: nbin not defined"</span>;</div>
 <div class="line"><a name="l00875"></a><span class="lineno">  875</span>     <span class="keywordflow">throw</span>(errorString);</div>
 <div class="line"><a name="l00876"></a><span class="lineno">  876</span>   }</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!filename.empty()){</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     std::ofstream outputfile;</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>     outputfile.open(filename.c_str());</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>     <span class="keywordflow">if</span>(!outputfile){</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>       s<<<span class="stringliteral">"Error opening distribution file , "</span> << filename;</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>     }</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin)</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       outputfile << minimum+static_cast<double>(maximum-minimum)*(ibin+0.5)/nbin << <span class="stringliteral">" "</span> << <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[ibin])/input.size() << std::endl;</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>     outputfile.close();</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>   }</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span> }</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span> </div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::distribution2d(<span class="keyword">const</span> std::vector<T>& inputX, <span class="keyword">const</span> std::vector<T>& inputY, std::vector< std::vector<double> >& output, <span class="keywordtype">int</span> nbin, T& minX, T& maxX [...]
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>   <span class="keywordflow">if</span>(inputX.empty()){</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>     s<<<span class="stringliteral">"Error: inputX is empty"</span>;</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>   }</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>   <span class="keywordflow">if</span>(inputX.size()!=inputY.size()){</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>     s<<<span class="stringliteral">"Error: inputX is empty"</span>;</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>   }</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> npoint=inputX.size();</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>   <span class="keywordflow">if</span>(maxX<=minX)</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>     minmax(inputX,inputX.begin(),inputX.end(),minX,maxX);</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>   <span class="keywordflow">if</span>(maxX<=minX){</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>   }</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>   <span class="keywordflow">if</span>(maxY<=minY)</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>     minmax(inputY,inputY.begin(),inputY.end(),minY,maxY);</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>   <span class="keywordflow">if</span>(maxY<=minY){</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>   }</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>   <span class="keywordflow">if</span>(nbin<=1){</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 1"</span>;</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>   }</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>   output.resize(nbin);</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     output[i].resize(nbin);</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       output[i][j]=0;</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>   }</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>   <span class="keywordtype">int</span> binX=0;</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>   <span class="keywordtype">int</span> binY=0;</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>   <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ipoint=0;ipoint<npoint;++ipoint){</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     <span class="keywordflow">if</span>(inputX[ipoint]==maxX)</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>        binX=nbin-1;</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[ipoint]-minX)/(maxX-minX)*nbin);</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     <span class="keywordflow">if</span>(inputY[ipoint]==maxY)</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>        binY=nbin-1;</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[ipoint]-minY)/(maxY-minY)*nbin);</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     <span class="keywordflow">if</span>(binX<0){</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       s<<<span class="stringliteral">"Error: binX is smaller than 0"</span>;</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     }</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     <span class="keywordflow">if</span>(output.size()<=binX){</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       s<<<span class="stringliteral">"Error: output size must be larger than binX"</span>;</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>     }</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     <span class="keywordflow">if</span>(binY<0){</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       s<<<span class="stringliteral">"Error: binY is smaller than 0"</span>;</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     }</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>     <span class="keywordflow">if</span>(output.size()<=binY){</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       s<<<span class="stringliteral">"Error: output size must be larger than binY"</span>;</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>     }</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>     <span class="keywordflow">if</span>(sigma>0){</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       <span class="comment">// minX-=2*sigma;</span></div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       <span class="comment">// maxX+=2*sigma;</span></div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       <span class="comment">// minY-=2*sigma;</span></div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       <span class="comment">// maxY+=2*sigma;</span></div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>         <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>         <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[ipoint]-centerX, sigma);</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>           <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>           <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>           <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[ipoint]-centerY, sigma);</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>           output[ibinX][binY]+=pdfX*pdfY;</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>         }</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>       }</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>     }</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>       ++output[binX][binY];</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>   }</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>   <span class="keywordflow">if</span>(!filename.empty()){</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>     std::ofstream outputfile;</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>     outputfile.open(filename.c_str());</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>     <span class="keywordflow">if</span>(!outputfile){</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>       s<<<span class="stringliteral">"Error opening distribution file , "</span> << filename;</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>     }</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>       outputfile << std::endl;</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>     <span class="keywordtype">double</span> binValueX=0;</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>       binValueX=minX+binX;</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>       binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>     <span class="keywordtype">double</span> binValueY=0;</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>     <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>       binValueY=minY+binY;</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>         <span class="keywordtype">double</span> value=0;</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>         value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY])/npoint;</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>     outputfile << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>         <span class="comment">/* double value=static_cast<double>(output[binX][binY])/npoint; */</span></div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         <span class="comment">/* outputfile << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl; */</span></div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       }</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>     }</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>     outputfile.close();</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>   }</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span> }</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span> </div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span> <span class="comment">//todo: what with nodata values?</span></div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::percentiles (<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<T>& output, <sp [...]
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>   <span class="keywordflow">if</span>(maximum<=minimum)</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>     minmax(input,begin,end,minimum,maximum);</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>   <span class="keywordflow">if</span>(maximum<=minimum){</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>     s<<<span class="stringliteral">"Error: maximum must be at least minimum"</span>;</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>   }</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>   <span class="keywordflow">if</span>(nbin<=1){</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 1"</span>;</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>   <span class="keywordflow">if</span>(!input.size()){</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>   }</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>   <span class="keywordflow">if</span>(output.size()!=nbin){</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     output.resize(nbin);</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;output[i++]=0);</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>   }</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>   <span class="keywordflow">for</span>(it=begin;it!=end;++it){</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>     <span class="keywordflow">if</span>(*it<minimum)</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>     <span class="keywordflow">if</span>(*it>maximum)</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>     <span class="keywordflow">if</span>(sigma>0){</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>       <span class="comment">// minimum-=2*sigma;</span></div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>       <span class="comment">// maximum+=2*sigma;</span></div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       <span class="comment">//todo: calculate real surface below pdf by using gsl_cdf_gaussian_P(x-mean+binsize,sigma)-gsl_cdf_gaussian_P(x-mean,sigma)</span></div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin){</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>         <span class="keywordtype">double</span> icenter=minimum+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maximum-minimum)*(ibin+0.5)/nbin;</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>         <span class="keywordtype">double</span> thePdf=gsl_ran_gaussian_pdf(*it-icenter, sigma);</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>         output[ibin]+=thePdf;</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       }</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>     }</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       <span class="keywordtype">int</span> theBin=0;</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       <span class="keywordflow">if</span>(*it==maximum)</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>         theBin=nbin-1;</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*it>minimum && *it<maximum)</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>         theBin=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>((nbin-1)*(*it)-minimum)/(maximum-minimum));</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       ++output[theBin];</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       <span class="comment">// if(*it==maximum)</span></div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       <span class="comment">//   ++output[nbin-1];</span></div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       <span class="comment">// else if(*it>=minimum && *it<maximum)</span></div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       <span class="comment">//   ++output[static_cast<int>(static_cast<double>((*it)-minimum)/(maximum-minimum)*nbin)];</span></div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>     }</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>   }</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>   <span class="keywordflow">if</span>(!isValid){</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>   }</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!filename.empty()){</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     std::ofstream outputfile;</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>     outputfile.open(filename.c_str());</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordflow">if</span>(!outputfile){</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       s<<<span class="stringliteral">"Error opening distribution file , "</span> << filename;</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>     }</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin)</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       outputfile << minimum+static_cast<double>(maximum-minimum)*(ibin+0.5)/nbin << <span class="stringliteral">" "</span> << <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[ibin])/input.size() << std::endl;</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     outputfile.close();</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>   }</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span> }</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span> </div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::distribution2d(<span class="keyword">const</span> std::vector<T>& inputX, <span class="keyword">const</span> std::vector<T>& inputY, std::vector< std::vector<double> >& output, <span class="keywordtype">int</span> nbin, T& minX, T& maxX [...]
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>   <span class="keywordflow">if</span>(inputX.empty()){</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     s<<<span class="stringliteral">"Error: inputX is empty"</span>;</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>   }</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>   <span class="keywordflow">if</span>(inputX.size()!=inputY.size()){</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>     s<<<span class="stringliteral">"Error: inputX is empty"</span>;</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>   }</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> npoint=inputX.size();</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>   <span class="keywordflow">if</span>(maxX<=minX)</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>     minmax(inputX,inputX.begin(),inputX.end(),minX,maxX);</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>   <span class="keywordflow">if</span>(maxX<=minX){</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>   }</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>   <span class="keywordflow">if</span>(maxY<=minY)</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>     minmax(inputY,inputY.begin(),inputY.end(),minY,maxY);</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>   <span class="keywordflow">if</span>(maxY<=minY){</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>   }</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>   <span class="keywordflow">if</span>(nbin<=1){</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 1"</span>;</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>   }</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>   output.resize(nbin);</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>     output[i].resize(nbin);</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>       output[i][j]=0;</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>   }</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>   <span class="keywordtype">int</span> binX=0;</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>   <span class="keywordtype">int</span> binY=0;</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>   <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ipoint=0;ipoint<npoint;++ipoint){</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>     <span class="keywordflow">if</span>(inputX[ipoint]==maxX)</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>        binX=nbin-1;</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>       binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[ipoint]-minX)/(maxX-minX)*nbin);</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>     <span class="keywordflow">if</span>(inputY[ipoint]==maxY)</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>        binY=nbin-1;</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>       binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[ipoint]-minY)/(maxY-minY)*nbin);</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>     <span class="keywordflow">if</span>(binX<0){</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>       s<<<span class="stringliteral">"Error: binX is smaller than 0"</span>;</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     }</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>     <span class="keywordflow">if</span>(output.size()<=binX){</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>       s<<<span class="stringliteral">"Error: output size must be larger than binX"</span>;</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>     }</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>     <span class="keywordflow">if</span>(binY<0){</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>       s<<<span class="stringliteral">"Error: binY is smaller than 0"</span>;</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>     }</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>     <span class="keywordflow">if</span>(output.size()<=binY){</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       s<<<span class="stringliteral">"Error: output size must be larger than binY"</span>;</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>     }</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>     <span class="keywordflow">if</span>(sigma>0){</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>       <span class="comment">// minX-=2*sigma;</span></div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       <span class="comment">// maxX+=2*sigma;</span></div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>       <span class="comment">// minY-=2*sigma;</span></div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>       <span class="comment">// maxY+=2*sigma;</span></div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>         <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>         <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[ipoint]-centerX, sigma);</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>           <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>           <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>           <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[ipoint]-centerY, sigma);</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>           output[ibinX][binY]+=pdfX*pdfY;</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>         }</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       }</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>     }</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>       ++output[binX][binY];</div>
 <div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>   }</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>   <span class="keywordflow">if</span>(input.empty()){</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>   }</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>   output.resize(nbin);</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>   std::vector<T> inputSort;</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>   inputSort.assign(begin,end);</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>   <span class="keyword">typename</span> std::vector<T>::iterator vit=inputSort.begin();</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>   <span class="keywordflow">while</span>(vit!=inputSort.end()){</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>     <span class="keywordflow">if</span>(*vit<minimum||*vit>maximum)</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>       inputSort.erase(vit);</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       ++vit;</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>   }</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>   std::sort(inputSort.begin(),inputSort.end());</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>   vit=inputSort.begin();</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>   std::vector<T> inputBin;</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin){</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>     inputBin.clear();</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>     <span class="keywordflow">while</span>(inputBin.size()<inputSort.size()/nbin&&vit!=inputSort.end()){</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>       inputBin.push_back(*vit);</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>       ++vit;</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>     }</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>     <span class="keywordflow">if</span>(inputBin.size()){</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>       output[ibin]=mymax(inputBin);</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>     }</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>   }</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>   <span class="keywordflow">if</span>(!filename.empty()){</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>     std::ofstream outputfile;</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>     outputfile.open(filename.c_str());</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>     <span class="keywordflow">if</span>(!outputfile){</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>       std::ostringstream s;</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>       s<<<span class="stringliteral">"error opening distribution file , "</span> << filename;</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>     }</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin)</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>       outputfile << ibin*100.0/nbin << <span class="stringliteral">" "</span> << static_cast<double>(output[ibin])/input.size() << std::endl;</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>     outputfile.close();</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>   }</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span> }</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span> </div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span> <span class="comment">//todo: what with nodata values?</span></div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> <span class="keyword">template</span><<span class="keyword">class</span> T> T  StatFactory::percentile(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, <span class="keywordtype">double</span> percent, T minimum, T maximum)<span [...]
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>   <span class="keywordflow">if</span>(input.empty()){</div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>   }</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>   std::vector<T> inputSort;</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>   inputSort.assign(begin,end);</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>   <span class="keyword">typename</span> std::vector<T>::iterator vit=inputSort.begin();</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>   <span class="keywordflow">while</span>(vit!=inputSort.end()){</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>     <span class="keywordflow">if</span>(maximum>minimum){</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>       <span class="keywordflow">if</span>(*vit<minimum||*vit>maximum)</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>     inputSort.erase(vit);</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>     }</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>       ++vit;</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>   }</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>   std::sort(inputSort.begin(),inputSort.end());</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>   <span class="keywordflow">return</span> gsl_stats_quantile_from_sorted_data(&(inputSort[0]),1,inputSort.size(),percent/100.0);</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span> }</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span> </div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::signature(<span class="keyword">const</span> std::vector<T>& input, <span class="keywordtype">double</span>&k, <span class="keywordtype">double</span>& alpha, <span class="keywordtype">double</span>& beta, <span class="keywordtype">double</span> e)<span class [...]
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>   <span class="keywordtype">double</span> m1=moment(input,1);</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>   <span class="keywordtype">double</span> m2=moment(input,2);</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>   signature(m1,m2,k,alpha,beta,e);</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span> }</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span> </div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span> <span class="comment">//todo: what with nodata values?</span></div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::normalize(<span class="keyword">const</span> std::vector<T>& input, std::vector<double>& output)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>   <span class="keywordtype">double</span> total=sum(input);</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>   <span class="keywordflow">if</span>(total){</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>     output.resize(input.size());</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<input.size();++index)</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>       output[index]=input[index]/total;</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>   }</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>     output=input;</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span> }</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span> </div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span> <span class="comment">//todo: what with nodata values?</span></div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::normalize_pct(std::vector<T>& input)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>   <span class="keywordtype">double</span> total=sum(input);</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>   <span class="keywordflow">if</span>(total){</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>     <span class="keyword">typename</span> std::vector<T>::iterator it;</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>     <span class="keywordflow">for</span>(it=input.begin();it!=input.end();++it)</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       *it=100.0*(*it)/total;</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>   }</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span> }</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  </div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::rmse(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>   }</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>   <span class="keywordflow">if</span>(x.empty()){</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>   }</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>   <span class="keywordtype">double</span> mse=0;</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<x.size();++isample){</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>     <span class="keywordflow">if</span>(isNoData(x[isample])||isNoData(y[isample]))</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>        <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>     <span class="keywordtype">double</span> e=x[isample]-y[isample];</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>     mse+=e*e/x.size();</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>   }</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>   <span class="keywordflow">return</span> sqrt(mse);</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span> }</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span> </div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span> <span class="comment">// template<class T> double StatFactory::gsl_correlation(const std::vector<T>& x, const std::vector<T>& y) const{</span></div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span> <span class="comment">//  return(gsl_stats_correlation(&(x[0]),1,&(y[0]),1,x.size()));</span></div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span> </div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::gsl_covariance(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>    <span class="keywordflow">return</span>(gsl_stats_covariance(&(x[0]),1,&(y[0]),1,x.size()));</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  }</div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span> </div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span> </div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> delay)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>   <span class="keywordtype">double</span> meanX=0;</div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>   <span class="keywordtype">double</span> meanY=0;</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>   <span class="keywordtype">double</span> varX=0;</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>   <span class="keywordtype">double</span> varY=0;</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>   <span class="keywordtype">double</span> sXY=0;</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>   meanVar(x,meanX,varX);</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>   meanVar(y,meanY,varY);</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>   <span class="keywordtype">double</span> denom = sqrt(varX*varY);</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>   <span class="keywordflow">if</span>(denom){</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     <span class="comment">//Calculate the correlation series</span></div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>     sXY = 0;</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0;i<x.size();++i) {</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>       <span class="keywordtype">int</span> j = i + delay;</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       <span class="keywordflow">if</span> (j < 0 || j >= y.size())</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(isNoData(x[i])||isNoData(y[j]))</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>     <span class="keywordflow">if</span>(i<0){</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>       std::ostringstream s;</div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>       s<<<span class="stringliteral">"Error: i must be positive"</span>;</div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>     }</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>     <span class="keywordflow">if</span>(i>=x.size()){</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>       std::ostringstream s;</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>       s<<<span class="stringliteral">"Error: i must be smaller than x.size()"</span>;</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>     }</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>     <span class="keywordflow">if</span>(j<0){</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>       std::ostringstream s;</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       s<<<span class="stringliteral">"Error: j must be positive"</span>;</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>     }</div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>     <span class="keywordflow">if</span>(j>=y.size()){</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       std::ostringstream s;</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>       s<<<span class="stringliteral">"Error: j must be smaller than y.size()"</span>;</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>     }</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>         sXY += (x[i] - meanX) * (y[j] - meanY);</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       }</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     }</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>       <span class="keywordtype">double</span> minSize=(x.size()<y.size())?x.size():y.size();</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>       <span class="keywordflow">return</span>(sXY / denom / (minSize-1));</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>     }</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>       <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>       std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>     }</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>   }</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span> }</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span> </div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span> <span class="comment">//todo: what if no valid data?</span></div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::cross_correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> maxdelay, std::vector<T>& z)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>   z.clear();</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>   <span class="keywordtype">double</span> sumCorrelation=0;</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> delay=-maxdelay;delay<maxdelay;delay++) {</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>     z.push_back(correlation(x,y,delay));</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>     sumCorrelation+=z.back();</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>   }</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>   <span class="keywordflow">return</span> sumCorrelation;</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span> }</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span> </div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::linear_regression(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>   }</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>   <span class="keywordflow">if</span>(x.empty()){</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>   }</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>   <span class="keywordtype">double</span> cov00;</div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>   <span class="keywordtype">double</span> cov01;</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>   <span class="keywordtype">double</span>  cov11;</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>   <span class="keywordtype">double</span> sumsq;</div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>   gsl_fit_linear(&(x[0]),1,&(y[0]),1,x.size(),&c0,&c1,&cov00,&cov01,&cov11,&sumsq);</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>   <span class="keywordflow">return</span> (1-sumsq/var(y)/(y.size()-1));</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span> }</div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> </div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::linear_regression_err(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1)<span class="keyword"> const</sp [...]
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>   }</div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>   <span class="keywordflow">if</span>(x.empty()){</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>   }</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>   <span class="keywordtype">double</span> cov00;</div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>   <span class="keywordtype">double</span> cov01;</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>   <span class="keywordtype">double</span>  cov11;</div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>   <span class="keywordtype">double</span> sumsq;</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>   gsl_fit_linear(&(x[0]),1,&(y[0]),1,x.size(),&c0,&c1,&cov00,&cov01,&cov11,&sumsq);</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>   <span class="keywordflow">return</span> sqrt((sumsq)/(y.size()));</div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span> }</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span> </div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span> <span class="comment">//alternatively: use GNU scientific library:</span></div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span> <span class="comment">// gsl_stats_correlation (const double data1[], const size_t stride1, const double data2[], const size_t stride2, const size_t n)</span></div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span> </div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateNoData(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::string& type, std::vector<T>& output, <span class="keywordtyp [...]
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>   <span class="keywordflow">if</span>(wavelengthIn.empty()){</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>     s<<<span class="stringliteral">"Error: wavelengthIn is empty"</span>;</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>   }</div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>   std::vector<double> wavelengthOut=wavelengthIn;</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>   std::vector<T> validIn=input;</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>   <span class="keywordflow">if</span>(input.size()!=wavelengthIn.size()){</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>   }</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>   <span class="keywordtype">int</span> nband=wavelengthIn.size();</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>   output.clear();</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>   <span class="comment">//remove nodata from input and corresponding wavelengthIn</span></div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>     <span class="keyword">typename</span> std::vector<T>::iterator itValue=validIn.begin();</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>     <span class="keyword">typename</span> std::vector<T>::iterator itWavelength=wavelengthOut.begin();</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>     <span class="keywordflow">while</span>(itValue!=validIn.end()&&itWavelength!=wavelengthOut.end()){</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>       <span class="keywordflow">if</span>(isNoData(*itValue)){</div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>     validIn.erase(itValue);</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>     wavelengthOut.erase(itWavelength);</div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>       }</div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>     ++itValue;</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>     ++itWavelength;</div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>       }</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>     }</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>     <span class="keywordflow">if</span>(validIn.size()>1){</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>     interpolateUp(wavelengthOut, validIn, wavelengthIn, type, output, verbose);</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>   <span class="keywordflow">if</span>(!filename.empty()){</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     std::ofstream outputfile;</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>     outputfile.open(filename.c_str());</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     <span class="keywordflow">if</span>(!outputfile){</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       s<<<span class="stringliteral">"Error opening distribution file , "</span> << filename;</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>     }</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       outputfile << std::endl;</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>     <span class="keywordtype">double</span> binValueX=0;</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>     <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       binValueX=minX+binX;</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>       binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>     <span class="keywordtype">double</span> binValueY=0;</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>     <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>       binValueY=minY+binY;</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>       binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>         <span class="keywordtype">double</span> value=0;</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>         value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY])/npoint;</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>     outputfile << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>         <span class="comment">/* double value=static_cast<double>(output[binX][binY])/npoint; */</span></div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>         <span class="comment">/* outputfile << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl; */</span></div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>       }</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>     }</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>     outputfile.close();</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>   }</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span> }</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span> </div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span> <span class="comment">//todo: what with nodata values?</span></div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::percentiles (<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<T>& output, <sp [...]
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>   <span class="keywordflow">if</span>(maximum<=minimum)</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>     minmax(input,begin,end,minimum,maximum);</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>   <span class="keywordflow">if</span>(maximum<=minimum){</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>     s<<<span class="stringliteral">"Error: maximum must be at least minimum"</span>;</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>   }</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>   <span class="keywordflow">if</span>(nbin<=1){</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 1"</span>;</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>   }</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>   <span class="keywordflow">if</span>(input.empty()){</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>   }</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>   output.resize(nbin);</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>   std::vector<T> inputSort;</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>   inputSort.assign(begin,end);</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>   <span class="keyword">typename</span> std::vector<T>::iterator vit=inputSort.begin();</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>   <span class="keywordflow">while</span>(vit!=inputSort.end()){</div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>     <span class="keywordflow">if</span>(*vit<minimum||*vit>maximum)</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>       inputSort.erase(vit);</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>       ++vit;</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>   }</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>   eraseNoData(inputSort);</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>   std::sort(inputSort.begin(),inputSort.end());</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>   vit=inputSort.begin();</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>   std::vector<T> inputBin;</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin){</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>     inputBin.clear();</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>     <span class="keywordflow">while</span>(inputBin.size()<inputSort.size()/nbin&&vit!=inputSort.end()){</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>       inputBin.push_back(*vit);</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>       ++vit;</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>     }</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>     <span class="keywordflow">if</span>(inputBin.size()){</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>       output[ibin]=mymax(inputBin);</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>     }</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>   }</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>   <span class="keywordflow">if</span>(!filename.empty()){</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>     std::ofstream outputfile;</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>     outputfile.open(filename.c_str());</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>     <span class="keywordflow">if</span>(!outputfile){</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>       s<<<span class="stringliteral">"error opening distribution file , "</span> << filename;</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>     }</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin)</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>       outputfile << ibin*100.0/nbin << <span class="stringliteral">" "</span> << static_cast<double>(output[ibin])/input.size() << std::endl;</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>     outputfile.close();</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>   }</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span> }</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span> </div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span> <span class="comment">//todo: what with nodata values?</span></div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span> <span class="keyword">template</span><<span class="keyword">class</span> T> T  StatFactory::percentile(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, <span class="keywordtype">double</span> percent, T minimum, T maximum)<span [...]
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>   <span class="keywordflow">if</span>(input.empty()){</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>   }</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>   std::vector<T> inputSort;</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>   inputSort.assign(begin,end);</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>   <span class="keyword">typename</span> std::vector<T>::iterator vit=inputSort.begin();</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>   <span class="keywordflow">while</span>(vit!=inputSort.end()){</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>     <span class="keywordflow">if</span>(maximum>minimum){</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       <span class="keywordflow">if</span>(*vit<minimum||*vit>maximum)</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>     inputSort.erase(vit);</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>     }</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       ++vit;</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>   }</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>   eraseNoData(inputSort);</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>   std::sort(inputSort.begin(),inputSort.end());</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>   <span class="keywordflow">return</span> gsl_stats_quantile_from_sorted_data(&(inputSort[0]),1,inputSort.size(),percent/100.0);</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span> }</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span> </div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::signature(<span class="keyword">const</span> std::vector<T>& input, <span class="keywordtype">double</span>&k, <span class="keywordtype">double</span>& alpha, <span class="keywordtype">double</span>& beta, <span class="keywordtype">double</span> e)<span class [...]
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>   <span class="keywordtype">double</span> m1=moment(input,1);</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>   <span class="keywordtype">double</span> m2=moment(input,2);</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>   signature(m1,m2,k,alpha,beta,e);</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span> }</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span> </div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span> <span class="comment">//todo: what with nodata values?</span></div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::normalize(<span class="keyword">const</span> std::vector<T>& input, std::vector<double>& output)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>   <span class="keywordtype">double</span> total=sum(input);</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>   <span class="keywordflow">if</span>(total){</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>     output.resize(input.size());</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<input.size();++index)</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>       output[index]=input[index]/total;</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>   }</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>     output=input;</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span> }</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span> </div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span> <span class="comment">//todo: what with nodata values?</span></div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::normalize_pct(std::vector<T>& input)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>   <span class="keywordtype">double</span> total=sum(input);</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>   <span class="keywordflow">if</span>(total){</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>     <span class="keyword">typename</span> std::vector<T>::iterator it;</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>     <span class="keywordflow">for</span>(it=input.begin();it!=input.end();++it)</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       *it=100.0*(*it)/total;</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>   }</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span> }</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  </div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::rmse(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>   }</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>   <span class="keywordflow">if</span>(x.empty()){</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>   }</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>   <span class="keywordtype">double</span> mse=0;</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<x.size();++isample){</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>     <span class="keywordflow">if</span>(isNoData(x[isample])||isNoData(y[isample]))</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>        <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>     <span class="keywordtype">double</span> e=x[isample]-y[isample];</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>     mse+=e*e/x.size();</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>   }</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>   <span class="keywordflow">return</span> sqrt(mse);</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span> }</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span> </div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> <span class="comment">//normalized root mean square error</span></div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::nrmse(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>   }</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>   <span class="keywordflow">if</span>(x.empty()){</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>   }</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>   std::vector<T> tmpX=x;</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>   eraseNoData(tmpX);</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>   std::vector<T> tmpY=y;</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>   eraseNoData(tmpY);</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>   <span class="keywordtype">double</span> maxY=mymax(y);</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>   <span class="keywordtype">double</span> minY=mymin(y);</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>   <span class="keywordtype">double</span> rangeY=maxY-minY;</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>   <span class="keywordtype">double</span> mse=0;</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<x.size();++isample){</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>     <span class="keywordtype">double</span> e=x[isample]-y[isample];</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>     mse+=e*e/x.size();</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>   }</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>   <span class="keywordflow">return</span> sqrt(mse)/rangeY;</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span> }</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span> </div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span> <span class="comment">// coefficient of variation root mean square error</span></div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::cvrmse(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>   }</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>   <span class="keywordflow">if</span>(x.empty()){</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>   }</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>   std::vector<T> tmpX=x;</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>   eraseNoData(tmpX);</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>   std::vector<T> tmpY=y;</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>   eraseNoData(tmpY);</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>   <span class="keywordtype">double</span> maxY=mymax(tmpY);</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>   <span class="keywordtype">double</span> minY=mymin(tmpY);</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>   <span class="keywordtype">double</span> rangeY=maxY-minY;</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>   <span class="keywordtype">double</span> mse=0;</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<x.size();++isample){</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>     <span class="keywordtype">double</span> e=x[isample]-y[isample];</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>     mse+=e*e/x.size();</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>   }</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>   <span class="keywordflow">return</span> sqrt(mse)/mean(tmpY);</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span> }</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span> </div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span> <span class="comment">// template<class T> double StatFactory::gsl_correlation(const std::vector<T>& x, const std::vector<T>& y) const{</span></div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span> <span class="comment">//  return(gsl_stats_correlation(&(x[0]),1,&(y[0]),1,x.size()));</span></div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> </div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::gsl_covariance(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>    <span class="keywordflow">return</span>(gsl_stats_covariance(&(x[0]),1,&(y[0]),1,x.size()));</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  }</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span> </div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span> </div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> delay)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>   <span class="keywordtype">double</span> meanX=0;</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>   <span class="keywordtype">double</span> meanY=0;</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>   <span class="keywordtype">double</span> varX=0;</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>   <span class="keywordtype">double</span> varY=0;</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>   <span class="keywordtype">double</span> sXY=0;</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>   meanVar(x,meanX,varX);</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>   meanVar(y,meanY,varY);</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>   <span class="keywordtype">double</span> denom = sqrt(varX*varY);</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>   <span class="keywordflow">if</span>(denom){</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>     <span class="comment">//Calculate the correlation series</span></div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>     sXY = 0;</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0;i<x.size();++i) {</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>       <span class="keywordtype">int</span> j = i + delay;</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>       <span class="keywordflow">if</span> (j < 0 || j >= y.size())</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(isNoData(x[i])||isNoData(y[j]))</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>     <span class="keywordflow">if</span>(i<0){</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>       s<<<span class="stringliteral">"Error: i must be positive"</span>;</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>     }</div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>     <span class="keywordflow">if</span>(i>=x.size()){</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>       s<<<span class="stringliteral">"Error: i must be smaller than x.size()"</span>;</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>     }</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>     <span class="keywordflow">if</span>(j<0){</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>       s<<<span class="stringliteral">"Error: j must be positive"</span>;</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>     }</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>     <span class="keywordflow">if</span>(j>=y.size()){</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>       s<<<span class="stringliteral">"Error: j must be smaller than y.size()"</span>;</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>     }</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>         sXY += (x[i] - meanX) * (y[j] - meanY);</div>
 <div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>       }</div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>     output=input;</div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>       }</div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>     }</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>     <span class="keywordflow">else</span><span class="comment">//we can not interpolate if no valid data</span></div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>       output=input;</div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>   }</div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>   <span class="keywordflow">else</span><span class="comment">//no nodata values to interpolate</span></div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>     output=input;</div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span> }</div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> </div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::vector<double>& wavelengthOut, <span class="keyword">const</span> std [...]
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>   <span class="keywordflow">if</span>(wavelengthIn.empty()){</div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>     s<<<span class="stringliteral">"Error: wavelengthIn is empty"</span>;</div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>   }</div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>   <span class="keywordflow">if</span>(input.size()!=wavelengthIn.size()){</div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>     s<<<span class="stringliteral">"Error: input and wavelengthIn not equal in size"</span>;</div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>   }</div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>   <span class="keywordflow">if</span>(wavelengthOut.empty()){</div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>     s<<<span class="stringliteral">"Error: wavelengthOut is empty"</span>;</div>
-<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>   }</div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>   <span class="keywordtype">int</span> nband=wavelengthIn.size();</div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>   output.clear();</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>   gsl_interp_accel *acc;</div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>   allocAcc(acc);</div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>   gsl_spline *spline;</div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>   getSpline(type,nband,spline);</div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>   assert(spline);</div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>   assert(&(wavelengthIn[0]));</div>
-<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>   assert(&(input[0]));</div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>   <span class="keywordtype">int</span> status=initSpline(spline,&(wavelengthIn[0]),&(input[0]),nband);</div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>   <span class="keywordflow">if</span>(status){</div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>     std::string errorString=<span class="stringliteral">"Could not initialize spline"</span>;</div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>   }</div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<wavelengthOut.size();++index){</div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>     <span class="keywordflow">if</span>(wavelengthOut[index]<*wavelengthIn.begin()){</div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>       output.push_back(*(input.begin()));</div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>     }</div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wavelengthOut[index]>wavelengthIn.back()){</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>       output.push_back(input.back());</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>     }</div>
-<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>     <span class="keywordtype">double</span> dout=evalSpline(spline,wavelengthOut[index],acc);</div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>     output.push_back(dout);</div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>   }</div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>   gsl_spline_free(spline);</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>   gsl_interp_accel_free(acc);</div>
-<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span> }</div>
-<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span> </div>
-<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span> <span class="comment">// template<class T> void StatFactory::interpolateUp(const std::vector<double>& wavelengthIn, const std::vector< std::vector<T> >& input, const std::vector<double>& wavelengthOut, const std::string& type, std::vector< std::vector<T> >& output, bool verbose){</span></div>
-<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span> <span class="comment">//   assert(wavelengthIn.size());</span></div>
-<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span> <span class="comment">//   assert(wavelengthOut.size());</span></div>
-<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span> <span class="comment">//   int nsample=input.size();  </span></div>
-<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span> <span class="comment">//   int nband=wavelengthIn.size();</span></div>
-<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span> <span class="comment">//   output.clear();</span></div>
-<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span> <span class="comment">//   output.resize(nsample);</span></div>
-<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span> <span class="comment">//   gsl_interp_accel *acc;</span></div>
-<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> <span class="comment">//   allocAcc(acc);</span></div>
-<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span> <span class="comment">//   gsl_spline *spline;</span></div>
-<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span> <span class="comment">//   getSpline(type,nband,spline);</span></div>
-<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span> <span class="comment">//   for(int isample=0;isample<nsample;++isample){</span></div>
-<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span> <span class="comment">//     assert(input[isample].size()==wavelengthIn.size());</span></div>
-<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span> <span class="comment">//     initSpline(spline,&(wavelengthIn[0]),&(input[isample][0]),nband);      </span></div>
-<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span> <span class="comment">//     for(int index=0;index<wavelengthOut.size();++index){</span></div>
-<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span> <span class="comment">//       if(type=="linear"){</span></div>
-<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span> <span class="comment">//         if(wavelengthOut[index]<wavelengthIn.back())</span></div>
-<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span> <span class="comment">//           output[isample].push_back(*(input.begin()));</span></div>
-<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span> <span class="comment">//         else if(wavelengthOut[index]>wavelengthIn.back())</span></div>
-<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span> <span class="comment">//           output[isample].push_back(input.back());</span></div>
-<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span> <span class="comment">//       }</span></div>
-<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span> <span class="comment">//       else{</span></div>
-<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span> <span class="comment">//         double dout=evalSpline(spline,wavelengthOut[index],acc);</span></div>
-<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span> <span class="comment">//         output[isample].push_back(dout);</span></div>
-<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span> <span class="comment">//       }</span></div>
-<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span> <span class="comment">//   gsl_spline_free(spline);</span></div>
-<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span> <span class="comment">//   gsl_interp_accel_free(acc);</span></div>
-<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span> </div>
-<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin)<span class="keyword"> const</span></div>
-<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>   <span class="keywordflow">if</span>(input.empty()){</div>
-<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
-<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>   }</div>
-<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>   <span class="keywordflow">if</span>(!nbin){</div>
-<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
-<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>   }</div>
-<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>   output.clear();</div>
-<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>   <span class="keywordtype">int</span> dim=input.size();</div>
-<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dim;++i){</div>
-<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>     <span class="keywordtype">double</span> deltaX=0;</div>
-<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>     <span class="keywordtype">double</span> left=input[i];</div>
-<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>     <span class="keywordflow">if</span>(i<dim-1){</div>
-<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>       <span class="keywordtype">double</span> right=(i<dim-1)? input[i+1]:input[i];</div>
-<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>       deltaX=(right-left)/static_cast<double>(nbin);</div>
-<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<nbin;++x){</div>
-<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>         output.push_back(left+x*deltaX);</div>
-<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>       }</div>
-<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>     }</div>
-<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>       output.push_back(input.back());</div>
-<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>   }</div>
-<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span> }</div>
-<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span> </div>
-<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::nearUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output)<span class="keyword"> const</span></div>
-<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>   <span class="keywordflow">if</span>(input.empty()){</div>
-<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
-<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>   }</div>
-<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>   <span class="keywordflow">if</span>(output.size()<input.size()){</div>
-<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>     s<<<span class="stringliteral">"Error: output size is smaller than input size"</span>;</div>
-<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>   }</div>
-<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>   <span class="keywordtype">int</span> dimInput=input.size();</div>
-<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>   <span class="keywordtype">int</span> dimOutput=output.size();</div>
-<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>   </div>
-<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iin=0;iin<dimInput;++iin){</div>
-<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iout=0;iout<dimOutput/dimInput;++iout){</div>
-<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>       <span class="keywordtype">int</span> indexOutput=iin*dimOutput/dimInput+iout;</div>
-<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>       <span class="keywordflow">if</span>(indexOutput>=output.size()){</div>
-<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>     s<<<span class="stringliteral">"Error: indexOutput must be smaller than output.size()"</span>;</div>
-<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>       }</div>
-<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>       output[indexOutput]=input[iin];</div>
-<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>     }</div>
-<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>   }</div>
-<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span> }</div>
-<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span> </div>
-<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin)</div>
-<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span> {</div>
-<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>   <span class="keywordflow">if</span>(!nbin){</div>
-<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
-<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>   }</div>
-<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>   output.clear();</div>
-<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dim;++i){</div>
-<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>     <span class="keywordtype">double</span> deltaX=0;</div>
-<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>     <span class="keywordtype">double</span> left=input[i];</div>
-<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>     <span class="keywordflow">if</span>(i<dim-1){</div>
-<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>       <span class="keywordtype">double</span> right=(i<dim-1)? input[i+1]:input[i];</div>
-<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>       deltaX=(right-left)/static_cast<double>(nbin);</div>
-<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<nbin;++x){</div>
-<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>         output.push_back(left+x*deltaX);</div>
-<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>       }</div>
-<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>     }</div>
-<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>       output.push_back(input[dim-1]);</div>
-<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>   }</div>
-<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> }</div>
-<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span> </div>
-<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateDown(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin)<span class="keyword"> const</span></div>
-<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>   <span class="keywordflow">if</span>(input.empty()){</div>
-<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
-<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>   }</div>
-<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>   <span class="keywordflow">if</span>(!nbin){</div>
-<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
-<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>   }</div>
-<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>   output.clear();</div>
-<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>   <span class="keywordtype">int</span> dim=input.size();</div>
-<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>   <span class="keywordtype">int</span> x=0;</div>
-<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>   output.push_back(input[0]);</div>
-<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=1;i<dim;++i){</div>
-<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>     <span class="keywordflow">if</span>(i%nbin)</div>
-<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>       x=(i-1)/nbin+1;</div>
-<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>       output.push_back(input[i]);</div>
-<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>     }</div>
-<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>   }</div>
-<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span> }</div>
-<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span> </div>
-<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateDown(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin)</div>
-<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span> {</div>
-<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>   <span class="keywordflow">if</span>(!nbin){</div>
-<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
-<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>   }</div>
-<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>   output.clear();</div>
-<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>   <span class="keywordtype">int</span> x=0;</div>
-<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>   output.push_back(input[0]);</div>
-<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=1;i<dim;++i){</div>
-<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>     <span class="keywordflow">if</span>(i%nbin)</div>
-<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>       x=(i-1)/nbin+1;</div>
-<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>       output.push_back(input[i]);</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>     }</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>       <span class="keywordtype">double</span> minSize=(x.size()<y.size())?x.size():y.size();</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>       <span class="keywordflow">return</span>(sXY / denom / (minSize-1));</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>     }</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>       <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>       std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>     }</div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>   }</div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>     <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span> }</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span> </div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span> <span class="comment">//todo: what if no valid data?</span></div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::cross_correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> maxdelay, std::vector<T>& z)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>   z.clear();</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>   <span class="keywordtype">double</span> sumCorrelation=0;</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> delay=-maxdelay;delay<maxdelay;delay++) {</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>     z.push_back(correlation(x,y,delay));</div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>     sumCorrelation+=z.back();</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>   }</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>   <span class="keywordflow">return</span> sumCorrelation;</div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span> }</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span> </div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::linear_regression(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>   }</div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>   <span class="keywordflow">if</span>(x.empty()){</div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>   }</div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>   <span class="keywordtype">double</span> cov00;</div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>   <span class="keywordtype">double</span> cov01;</div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>   <span class="keywordtype">double</span>  cov11;</div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>   <span class="keywordtype">double</span> sumsq;</div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>   gsl_fit_linear(&(x[0]),1,&(y[0]),1,x.size(),&c0,&c1,&cov00,&cov01,&cov11,&sumsq);</div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>   <span class="keywordflow">return</span> (1-sumsq/var(y)/(y.size()-1));</div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span> }</div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span> </div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::linear_regression_err(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1)<span class="keyword"> const</sp [...]
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>   }</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>   <span class="keywordflow">if</span>(x.empty()){</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
+<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>   }</div>
+<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>   <span class="keywordtype">double</span> cov00;</div>
+<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>   <span class="keywordtype">double</span> cov01;</div>
+<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>   <span class="keywordtype">double</span>  cov11;</div>
+<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>   <span class="keywordtype">double</span> sumsq;</div>
+<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>   gsl_fit_linear(&(x[0]),1,&(y[0]),1,x.size(),&c0,&c1,&cov00,&cov01,&cov11,&sumsq);</div>
+<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>   <span class="keywordflow">return</span> sqrt((sumsq)/(y.size()));</div>
+<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> }</div>
+<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span> </div>
+<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span> <span class="comment">//alternatively: use GNU scientific library:</span></div>
+<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span> <span class="comment">// gsl_stats_correlation (const double data1[], const size_t stride1, const double data2[], const size_t stride2, const size_t n)</span></div>
+<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span> </div>
+<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateNoData(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::string& type, std::vector<T>& output, <span class="keywordtyp [...]
+<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>   <span class="keywordflow">if</span>(wavelengthIn.empty()){</div>
+<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>     s<<<span class="stringliteral">"Error: wavelengthIn is empty"</span>;</div>
+<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>   }</div>
+<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>   std::vector<double> wavelengthOut=wavelengthIn;</div>
+<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>   std::vector<T> validIn=input;</div>
+<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>   <span class="keywordflow">if</span>(input.size()!=wavelengthIn.size()){</div>
+<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
+<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>   }</div>
+<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>   <span class="keywordtype">int</span> nband=wavelengthIn.size();</div>
+<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>   output.clear();</div>
+<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>   <span class="comment">//remove nodata from input and corresponding wavelengthIn</span></div>
+<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
+<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>     <span class="keyword">typename</span> std::vector<T>::iterator itValue=validIn.begin();</div>
+<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>     <span class="keyword">typename</span> std::vector<T>::iterator itWavelength=wavelengthOut.begin();</div>
+<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>     <span class="keywordflow">while</span>(itValue!=validIn.end()&&itWavelength!=wavelengthOut.end()){</div>
+<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>       <span class="keywordflow">if</span>(isNoData(*itValue)){</div>
+<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>     validIn.erase(itValue);</div>
+<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>     wavelengthOut.erase(itWavelength);</div>
+<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>       }</div>
+<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>     ++itValue;</div>
+<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>     ++itWavelength;</div>
+<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>       }</div>
+<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>     }</div>
+<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>     <span class="keywordflow">if</span>(validIn.size()>1){</div>
+<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>     interpolateUp(wavelengthOut, validIn, wavelengthIn, type, output, verbose);</div>
+<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>       }</div>
+<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>     output=input;</div>
+<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>       }</div>
+<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>     }</div>
+<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>     <span class="keywordflow">else</span><span class="comment">//we can not interpolate if no valid data</span></div>
+<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>       output=input;</div>
+<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>   }</div>
+<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>   <span class="keywordflow">else</span><span class="comment">//no nodata values to interpolate</span></div>
+<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>     output=input;</div>
+<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span> }</div>
+<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span> </div>
+<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::vector<double>& wavelengthOut, <span class="keyword">const</span> std [...]
+<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>   <span class="keywordflow">if</span>(wavelengthIn.empty()){</div>
+<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>     s<<<span class="stringliteral">"Error: wavelengthIn is empty"</span>;</div>
+<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>   }</div>
+<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>   <span class="keywordflow">if</span>(input.size()!=wavelengthIn.size()){</div>
+<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>     s<<<span class="stringliteral">"Error: input and wavelengthIn not equal in size"</span>;</div>
+<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>   }</div>
+<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>   <span class="keywordflow">if</span>(wavelengthOut.empty()){</div>
+<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>     s<<<span class="stringliteral">"Error: wavelengthOut is empty"</span>;</div>
+<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>   }</div>
+<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>   <span class="keywordtype">int</span> nband=wavelengthIn.size();</div>
+<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>   output.clear();</div>
+<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>   gsl_interp_accel *acc;</div>
+<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>   allocAcc(acc);</div>
+<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>   gsl_spline *spline;</div>
+<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>   getSpline(type,nband,spline);</div>
+<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>   assert(spline);</div>
+<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>   assert(&(wavelengthIn[0]));</div>
+<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>   assert(&(input[0]));</div>
+<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>   <span class="keywordtype">int</span> status=initSpline(spline,&(wavelengthIn[0]),&(input[0]),nband);</div>
+<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>   <span class="keywordflow">if</span>(status){</div>
+<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>     std::string errorString=<span class="stringliteral">"Could not initialize spline"</span>;</div>
+<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>   }</div>
+<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<wavelengthOut.size();++index){</div>
+<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>     <span class="keywordflow">if</span>(wavelengthOut[index]<*wavelengthIn.begin()){</div>
+<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>       output.push_back(*(input.begin()));</div>
+<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>     }</div>
+<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wavelengthOut[index]>wavelengthIn.back()){</div>
+<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>       output.push_back(input.back());</div>
+<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>     }</div>
+<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>     <span class="keywordtype">double</span> dout=evalSpline(spline,wavelengthOut[index],acc);</div>
+<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>     output.push_back(dout);</div>
+<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>   }</div>
+<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>   gsl_spline_free(spline);</div>
+<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>   gsl_interp_accel_free(acc);</div>
+<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span> }</div>
+<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span> </div>
+<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span> <span class="comment">// template<class T> void StatFactory::interpolateUp(const std::vector<double>& wavelengthIn, const std::vector< std::vector<T> >& input, const std::vector<double>& wavelengthOut, const std::string& type, std::vector< std::vector<T> >& output, bool verbose){</span></div>
+<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span> <span class="comment">//   assert(wavelengthIn.size());</span></div>
+<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span> <span class="comment">//   assert(wavelengthOut.size());</span></div>
+<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span> <span class="comment">//   int nsample=input.size();  </span></div>
+<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span> <span class="comment">//   int nband=wavelengthIn.size();</span></div>
+<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span> <span class="comment">//   output.clear();</span></div>
+<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span> <span class="comment">//   output.resize(nsample);</span></div>
+<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span> <span class="comment">//   gsl_interp_accel *acc;</span></div>
+<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span> <span class="comment">//   allocAcc(acc);</span></div>
+<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> <span class="comment">//   gsl_spline *spline;</span></div>
+<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span> <span class="comment">//   getSpline(type,nband,spline);</span></div>
+<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span> <span class="comment">//   for(int isample=0;isample<nsample;++isample){</span></div>
+<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span> <span class="comment">//     assert(input[isample].size()==wavelengthIn.size());</span></div>
+<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span> <span class="comment">//     initSpline(spline,&(wavelengthIn[0]),&(input[isample][0]),nband);      </span></div>
+<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span> <span class="comment">//     for(int index=0;index<wavelengthOut.size();++index){</span></div>
+<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span> <span class="comment">//       if(type=="linear"){</span></div>
+<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span> <span class="comment">//         if(wavelengthOut[index]<wavelengthIn.back())</span></div>
+<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span> <span class="comment">//           output[isample].push_back(*(input.begin()));</span></div>
+<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span> <span class="comment">//         else if(wavelengthOut[index]>wavelengthIn.back())</span></div>
+<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span> <span class="comment">//           output[isample].push_back(input.back());</span></div>
+<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span> <span class="comment">//       }</span></div>
+<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span> <span class="comment">//       else{</span></div>
+<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span> <span class="comment">//         double dout=evalSpline(spline,wavelengthOut[index],acc);</span></div>
+<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span> <span class="comment">//         output[isample].push_back(dout);</span></div>
+<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span> <span class="comment">//       }</span></div>
+<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span> <span class="comment">//   gsl_spline_free(spline);</span></div>
+<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span> <span class="comment">//   gsl_interp_accel_free(acc);</span></div>
+<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span> </div>
+<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin)<span class="keyword"> const</span></div>
+<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>   <span class="keywordflow">if</span>(input.empty()){</div>
+<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
+<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>   }</div>
+<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>   <span class="keywordflow">if</span>(!nbin){</div>
+<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
+<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>   }</div>
+<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>   output.clear();</div>
+<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>   <span class="keywordtype">int</span> dim=input.size();</div>
+<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dim;++i){</div>
+<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>     <span class="keywordtype">double</span> deltaX=0;</div>
+<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>     <span class="keywordtype">double</span> left=input[i];</div>
+<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>     <span class="keywordflow">if</span>(i<dim-1){</div>
+<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>       <span class="keywordtype">double</span> right=(i<dim-1)? input[i+1]:input[i];</div>
+<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>       deltaX=(right-left)/static_cast<double>(nbin);</div>
+<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<nbin;++x){</div>
+<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>         output.push_back(left+x*deltaX);</div>
+<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>       }</div>
 <div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>     }</div>
-<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>   }</div>
-<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span> }</div>
-<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span> }</div>
-<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span> </div>
-<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span> <span class="preprocessor">#endif </span><span class="comment">/* _STATFACTORY_H_ */</span><span class="preprocessor"></span></div>
-<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span> <span class="preprocessor"></span></div>
-<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span> <span class="comment">// void Histogram::signature(double m1, double m2, double& k, double& alpha, double& beta, double e)</span></div>
-<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span> <span class="comment">//   double y=m1*m1/m2;</span></div>
-<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span> <span class="comment">//   beta=F_1(y,0.1,10.0,e);</span></div>
-<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span> <span class="comment">//   double fb=F(beta);</span></div>
-<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span> <span class="comment">//   double g=exp(lgamma(1.0/beta));</span></div>
-<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span> <span class="comment">//   alpha=m1*g/exp(lgamma(2.0/beta));</span></div>
-<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span> <span class="comment">//   k=beta/(2*alpha*g);</span></div>
-<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span> <span class="comment">// //   std::cout << "y, alpha, beta: " << y << ", " << alpha << ", " << beta << std::endl;</span></div>
-<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span> </div>
-<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span> <span class="comment">// double Histogram::F(double x)</span></div>
-<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> <span class="comment">//   double g2=exp(lgamma(2.0/x));</span></div>
-<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span> <span class="comment">//   return(g2*g2/exp(lgamma(3.0/x))/exp(lgamma(1.0/x)));</span></div>
-<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span> </div>
-<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span> <span class="comment">// //x1 is under estimate, x2 is over estimate, e is error</span></div>
-<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span> <span class="comment">// double Histogram::F_1(double y, double x1, double x2, double e)</span></div>
-<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span> <span class="comment">//   double f1=F(x1);</span></div>
-<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span> <span class="comment">//   double f2=F(x2);</span></div>
-<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span> <span class="comment">//   assert(f1!=f2);</span></div>
-<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span> <span class="comment">//   double x=x1+(x2-x1)*(y-f1)/(f2-f1);</span></div>
-<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span> <span class="comment">//   double f=F(x);</span></div>
-<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span> <span class="comment">//   while(f-y>=e||y-f>=e){</span></div>
-<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span> <span class="comment">//     if(f<y)</span></div>
-<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span> <span class="comment">//       x1=x;</span></div>
-<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span> <span class="comment">//     else </span></div>
-<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span> <span class="comment">//       x2=x;</span></div>
-<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span> <span class="comment">//     if(x1==x2)</span></div>
-<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span> <span class="comment">//       return x1;</span></div>
-<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span> <span class="comment">//     assert(f1!=f2);</span></div>
-<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span> <span class="comment">//     x=x1+(x2-x1)*(y-f1)/(f2-f1);</span></div>
-<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span> <span class="comment">//     f=F(x);</span></div>
-<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> <span class="comment">//   return x;</span></div>
-<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>       output.push_back(input.back());</div>
+<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>   }</div>
+<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span> }</div>
+<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span> </div>
+<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::nearUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output)<span class="keyword"> const</span></div>
+<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>   <span class="keywordflow">if</span>(input.empty()){</div>
+<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
+<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>   }</div>
+<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>   <span class="keywordflow">if</span>(output.size()<input.size()){</div>
+<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>     s<<<span class="stringliteral">"Error: output size is smaller than input size"</span>;</div>
+<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>   }</div>
+<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>   <span class="keywordtype">int</span> dimInput=input.size();</div>
+<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>   <span class="keywordtype">int</span> dimOutput=output.size();</div>
+<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>   </div>
+<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iin=0;iin<dimInput;++iin){</div>
+<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iout=0;iout<dimOutput/dimInput;++iout){</div>
+<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>       <span class="keywordtype">int</span> indexOutput=iin*dimOutput/dimInput+iout;</div>
+<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>       <span class="keywordflow">if</span>(indexOutput>=output.size()){</div>
+<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>     s<<<span class="stringliteral">"Error: indexOutput must be smaller than output.size()"</span>;</div>
+<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>       }</div>
+<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>       output[indexOutput]=input[iin];</div>
+<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>     }</div>
+<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>   }</div>
+<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span> }</div>
+<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span> </div>
+<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin)</div>
+<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span> {</div>
+<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>   <span class="keywordflow">if</span>(!nbin){</div>
+<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
+<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>   }</div>
+<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>   output.clear();</div>
+<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dim;++i){</div>
+<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>     <span class="keywordtype">double</span> deltaX=0;</div>
+<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>     <span class="keywordtype">double</span> left=input[i];</div>
+<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>     <span class="keywordflow">if</span>(i<dim-1){</div>
+<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>       <span class="keywordtype">double</span> right=(i<dim-1)? input[i+1]:input[i];</div>
+<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>       deltaX=(right-left)/static_cast<double>(nbin);</div>
+<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<nbin;++x){</div>
+<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>         output.push_back(left+x*deltaX);</div>
+<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>       }</div>
+<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>     }</div>
+<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>       output.push_back(input[dim-1]);</div>
+<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>   }</div>
+<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span> }</div>
+<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span> </div>
+<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateDown(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin)<span class="keyword"> const</span></div>
+<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>   <span class="keywordflow">if</span>(input.empty()){</div>
+<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
+<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>   }</div>
+<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>   <span class="keywordflow">if</span>(!nbin){</div>
+<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
+<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>   }</div>
+<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>   output.clear();</div>
+<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>   <span class="keywordtype">int</span> dim=input.size();</div>
+<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>   <span class="keywordtype">int</span> x=0;</div>
+<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>   output.push_back(input[0]);</div>
+<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=1;i<dim;++i){</div>
+<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>     <span class="keywordflow">if</span>(i%nbin)</div>
+<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>       x=(i-1)/nbin+1;</div>
+<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>       output.push_back(input[i]);</div>
+<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>     }</div>
+<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>   }</div>
+<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span> }</div>
+<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span> </div>
+<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateDown(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin)</div>
+<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span> {</div>
+<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>   <span class="keywordflow">if</span>(!nbin){</div>
+<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
+<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>   }</div>
+<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>   output.clear();</div>
+<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>   <span class="keywordtype">int</span> x=0;</div>
+<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>   output.push_back(input[0]);</div>
+<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=1;i<dim;++i){</div>
+<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>     <span class="keywordflow">if</span>(i%nbin)</div>
+<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>       x=(i-1)/nbin+1;</div>
+<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>       output.push_back(input[i]);</div>
+<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>     }</div>
+<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>   }</div>
+<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span> }</div>
+<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span> }</div>
+<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span> </div>
+<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span> <span class="preprocessor">#endif </span><span class="comment">/* _STATFACTORY_H_ */</span><span class="preprocessor"></span></div>
+<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span> <span class="preprocessor"></span></div>
+<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span> <span class="comment">// void Histogram::signature(double m1, double m2, double& k, double& alpha, double& beta, double e)</span></div>
+<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span> <span class="comment">//   double y=m1*m1/m2;</span></div>
+<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span> <span class="comment">//   beta=F_1(y,0.1,10.0,e);</span></div>
+<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span> <span class="comment">//   double fb=F(beta);</span></div>
+<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span> <span class="comment">//   double g=exp(lgamma(1.0/beta));</span></div>
+<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span> <span class="comment">//   alpha=m1*g/exp(lgamma(2.0/beta));</span></div>
+<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span> <span class="comment">//   k=beta/(2*alpha*g);</span></div>
+<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span> <span class="comment">// //   std::cout << "y, alpha, beta: " << y << ", " << alpha << ", " << beta << std::endl;</span></div>
+<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span> </div>
+<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span> <span class="comment">// double Histogram::F(double x)</span></div>
+<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span> <span class="comment">//   double g2=exp(lgamma(2.0/x));</span></div>
+<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span> <span class="comment">//   return(g2*g2/exp(lgamma(3.0/x))/exp(lgamma(1.0/x)));</span></div>
+<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span> </div>
+<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span> <span class="comment">// //x1 is under estimate, x2 is over estimate, e is error</span></div>
+<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span> <span class="comment">// double Histogram::F_1(double y, double x1, double x2, double e)</span></div>
+<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span> <span class="comment">//   double f1=F(x1);</span></div>
+<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span> <span class="comment">//   double f2=F(x2);</span></div>
+<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span> <span class="comment">//   assert(f1!=f2);</span></div>
+<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span> <span class="comment">//   double x=x1+(x2-x1)*(y-f1)/(f2-f1);</span></div>
+<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span> <span class="comment">//   double f=F(x);</span></div>
+<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span> <span class="comment">//   while(f-y>=e||y-f>=e){</span></div>
+<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span> <span class="comment">//     if(f<y)</span></div>
+<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span> <span class="comment">//       x1=x;</span></div>
+<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span> <span class="comment">//     else </span></div>
+<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span> <span class="comment">//       x2=x;</span></div>
+<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span> <span class="comment">//     if(x1==x2)</span></div>
+<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span> <span class="comment">//       return x1;</span></div>
+<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span> <span class="comment">//     assert(f1!=f2);</span></div>
+<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span> <span class="comment">//     x=x1+(x2-x1)*(y-f1)/(f2-f1);</span></div>
+<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span> <span class="comment">//     f=F(x);</span></div>
+<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span> <span class="comment">//   return x;</span></div>
+<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span> <span class="comment">// }</span></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkdsm2shadow.html b/doc/html/Vector2d_8cc_source.html
similarity index 69%
copy from doc/html/md_examples_pkdsm2shadow.html
copy to doc/html/Vector2d_8cc_source.html
index e8e43db..2b1eeed 100644
--- a/doc/html/md_examples_pkdsm2shadow.html
+++ b/doc/html/Vector2d_8cc_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: examples_pkdsm2shadow</title>
+<title>pktools: /home/kempenep/pktools/src/base/Vector2d.cc Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -32,26 +32,31 @@
   <div id="navrow1" class="tabs">
     <ul class="tablist">
       <li><a href="index.html"><span>Main Page</span></a></li>
-      <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
       <li><a href="annotated.html"><span>Classes</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
     </ul>
   </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_0af1587c8378955de40f48b4bd1869f0.html">base</a></li>  </ul>
+</div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">examples_pkdsm2shadow </div>  </div>
+<div class="title">Vector2d.cc</div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="textblock"><h1><a class="anchor" id="examples_pkdsm2shadow"></a>
-Examples of pkdsm2shadow</h1>
-<p>Create a shadow mask for the input raster dataset dsm.tif, using Sun zenith angle of 10 degrees and a Sun azimuth angle of 135 degrees (South-South-East). All shadow pixels are set to a value of 1.</p>
-<div class="fragment"><div class="line">pkdsm2shadow -i dsm.tif -sza 10 -saa 170 -f 1 -o shadow.tif</div>
-</div><!-- fragment --> </div></div><!-- contents -->
+<div class="fragment"></div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Vector2d_8h_source.html b/doc/html/Vector2d_8h_source.html
index 539cc75..34e08ba 100644
--- a/doc/html/Vector2d_8h_source.html
+++ b/doc/html/Vector2d_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -388,7 +388,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/____init_____8py_source.html b/doc/html/____init_____8py_source.html
index f94dd0c..b682556 100644
--- a/doc/html/____init_____8py_source.html
+++ b/doc/html/____init_____8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/annotated.html b/doc/html/annotated.html
index eef8dac..d086f8e 100644
--- a/doc/html/annotated.html
+++ b/doc/html/annotated.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -157,39 +157,41 @@
 <tr id="row_20_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFeatureSelector.html" target="_self">FeatureSelector</a></td><td class="desc"></td></tr>
 <tr id="row_21_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFileReaderAscii.html" target="_self">FileReaderAscii</a></td><td class="desc"></td></tr>
 <tr id="row_22_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFileReaderLas.html" target="_self">FileReaderLas</a></td><td class="desc"></td></tr>
-<tr id="row_23_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderGdal.html" target="_self">ImgReaderGdal</a></td><td class="desc"></td></tr>
-<tr id="row_24_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderOgr.html" target="_self">ImgReaderOgr</a></td><td class="desc"></td></tr>
-<tr id="row_25_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterGdal.html" target="_self">ImgWriterGdal</a></td><td class="desc"></td></tr>
-<tr id="row_26_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterOgr.html" target="_self">ImgWriterOgr</a></td><td class="desc"></td></tr>
-<tr id="row_27_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__IndexValue.html" target="_self">Increase_IndexValue</a></td><td class="desc"></td></tr>
-<tr id="row_28_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__PosValue.html" target="_self">Increase_PosValue</a></td><td class="desc"></td></tr>
-<tr id="row_29_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structIndexValue.html" target="_self">IndexValue</a></td><td class="desc"></td></tr>
-<tr id="row_30_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classKernel.html" target="_self">Kernel</a></td><td class="desc"></td></tr>
-<tr id="row_31_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classLastReturnFilter.html" target="_self">LastReturnFilter</a></td><td class="desc"></td></tr>
-<tr id="row_32_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_33_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classONE__CLASS__Q.html" target="_self">ONE_CLASS_Q</a></td><td class="desc"></td></tr>
-<tr id="row_34_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptFactory.html" target="_self">OptFactory</a></td><td class="desc"></td></tr>
-<tr id="row_35_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptionpk.html" target="_self">Optionpk</a></td><td class="desc"></td></tr>
-<tr id="row_36_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structPosValue.html" target="_self">PosValue</a></td><td class="desc"></td></tr>
-<tr id="row_37_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classQMatrix.html" target="_self">QMatrix</a></td><td class="desc"></td></tr>
-<tr id="row_38_"><td class="entry"><img id="arr_38_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('38_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver.html" target="_self">Solver</a></td><td class="desc"></td></tr>
-<tr id="row_38_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structSolver_1_1SolutionInfo.html" target="_self">SolutionInfo</a></td><td class="desc"></td></tr>
-<tr id="row_39_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver__NU.html" target="_self">Solver_NU</a></td><td class="desc"></td></tr>
-<tr id="row_40_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVC__Q.html" target="_self">SVC_Q</a></td><td class="desc"></td></tr>
-<tr id="row_41_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__model.html" target="_self">svm_model</a></td><td class="desc"></td></tr>
-<tr id="row_42_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__node.html" target="_self">svm_node</a></td><td class="desc"></td></tr>
-<tr id="row_43_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__parameter.html" target="_self">svm_parameter</a></td><td class="desc"></td></tr>
-<tr id="row_44_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__problem.html" target="_self">svm_problem</a></td><td class="desc"></td></tr>
-<tr id="row_45_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVR__Q.html" target="_self">SVR_Q</a></td><td class="desc"></td></tr>
-<tr id="row_46_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi__MainWindow.html" target="_self">Ui_MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_47_"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d</a></td><td class="desc"></td></tr>
+<tr id="row_23_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgRasterGdal.html" target="_self">ImgRasterGdal</a></td><td class="desc"></td></tr>
+<tr id="row_24_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderGdal.html" target="_self">ImgReaderGdal</a></td><td class="desc"></td></tr>
+<tr id="row_25_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderOgr.html" target="_self">ImgReaderOgr</a></td><td class="desc"></td></tr>
+<tr id="row_26_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgUpdaterGdal.html" target="_self">ImgUpdaterGdal</a></td><td class="desc"></td></tr>
+<tr id="row_27_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterGdal.html" target="_self">ImgWriterGdal</a></td><td class="desc"></td></tr>
+<tr id="row_28_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterOgr.html" target="_self">ImgWriterOgr</a></td><td class="desc"></td></tr>
+<tr id="row_29_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__IndexValue.html" target="_self">Increase_IndexValue</a></td><td class="desc"></td></tr>
+<tr id="row_30_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__PosValue.html" target="_self">Increase_PosValue</a></td><td class="desc"></td></tr>
+<tr id="row_31_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structIndexValue.html" target="_self">IndexValue</a></td><td class="desc"></td></tr>
+<tr id="row_32_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classKernel.html" target="_self">Kernel</a></td><td class="desc"></td></tr>
+<tr id="row_33_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classLastReturnFilter.html" target="_self">LastReturnFilter</a></td><td class="desc"></td></tr>
+<tr id="row_34_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_35_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classONE__CLASS__Q.html" target="_self">ONE_CLASS_Q</a></td><td class="desc"></td></tr>
+<tr id="row_36_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptFactory.html" target="_self">OptFactory</a></td><td class="desc"></td></tr>
+<tr id="row_37_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptionpk.html" target="_self">Optionpk</a></td><td class="desc"></td></tr>
+<tr id="row_38_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structPosValue.html" target="_self">PosValue</a></td><td class="desc"></td></tr>
+<tr id="row_39_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classQMatrix.html" target="_self">QMatrix</a></td><td class="desc"></td></tr>
+<tr id="row_40_"><td class="entry"><img id="arr_40_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('40_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver.html" target="_self">Solver</a></td><td class="desc"></td></tr>
+<tr id="row_40_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structSolver_1_1SolutionInfo.html" target="_self">SolutionInfo</a></td><td class="desc"></td></tr>
+<tr id="row_41_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver__NU.html" target="_self">Solver_NU</a></td><td class="desc"></td></tr>
+<tr id="row_42_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVC__Q.html" target="_self">SVC_Q</a></td><td class="desc"></td></tr>
+<tr id="row_43_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__model.html" target="_self">svm_model</a></td><td class="desc"></td></tr>
+<tr id="row_44_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__node.html" target="_self">svm_node</a></td><td class="desc"></td></tr>
+<tr id="row_45_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__parameter.html" target="_self">svm_parameter</a></td><td class="desc"></td></tr>
+<tr id="row_46_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__problem.html" target="_self">svm_problem</a></td><td class="desc"></td></tr>
+<tr id="row_47_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVR__Q.html" target="_self">SVR_Q</a></td><td class="desc"></td></tr>
+<tr id="row_48_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi__MainWindow.html" target="_self">Ui_MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_49_"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcomposite__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkcomposite__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
index db39b7a..e0ac86c 100644
--- a/doc/html/build-pkcomposite__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkcomposite__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -186,7 +186,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcomposite__gui-gcc-Debug_2ui__mainwindow_8h_source.html b/doc/html/build-pkcomposite__gui-gcc-Debug_2ui__mainwindow_8h_source.html
index 8d8a034..aef513c 100644
--- a/doc/html/build-pkcomposite__gui-gcc-Debug_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkcomposite__gui-gcc-Debug_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -766,7 +766,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcomposite__gui-gcc-Release_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkcomposite__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
index e341439..3e8e934 100644
--- a/doc/html/build-pkcomposite__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkcomposite__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -186,7 +186,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcomposite__gui-gcc-Release_2ui__mainwindow_8h_source.html b/doc/html/build-pkcomposite__gui-gcc-Release_2ui__mainwindow_8h_source.html
index 5c5a677..f764de0 100644
--- a/doc/html/build-pkcomposite__gui-gcc-Release_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkcomposite__gui-gcc-Release_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -765,7 +765,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcrop__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkcrop__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
index 4bc1b0a..ad5f9fd 100644
--- a/doc/html/build-pkcrop__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkcrop__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -190,7 +190,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcrop__gui-gcc-Debug_2ui__mainwindow_8h_source.html b/doc/html/build-pkcrop__gui-gcc-Debug_2ui__mainwindow_8h_source.html
index 5279608..9b4e536 100644
--- a/doc/html/build-pkcrop__gui-gcc-Debug_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkcrop__gui-gcc-Debug_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -786,7 +786,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcrop__gui-gcc-Release_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkcrop__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
index 2e43db9..7b4be37 100644
--- a/doc/html/build-pkcrop__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkcrop__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -190,7 +190,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcrop__gui-gcc-Release_2ui__mainwindow_8h_source.html b/doc/html/build-pkcrop__gui-gcc-Release_2ui__mainwindow_8h_source.html
index 340d03d..5b11477 100644
--- a/doc/html/build-pkcrop__gui-gcc-Release_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkcrop__gui-gcc-Release_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -786,7 +786,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkdiff__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkdiff__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
index d0672ff..bfab362 100644
--- a/doc/html/build-pkdiff__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkdiff__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -180,7 +180,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkdiff__gui-gcc-Debug_2ui__mainwindow_8h_source.html b/doc/html/build-pkdiff__gui-gcc-Debug_2ui__mainwindow_8h_source.html
index 9bfa8eb..992cdf2 100644
--- a/doc/html/build-pkdiff__gui-gcc-Debug_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkdiff__gui-gcc-Debug_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -499,7 +499,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkdiff__gui-gcc-Release_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkdiff__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
index 22ed84b..e7e5d2f 100644
--- a/doc/html/build-pkdiff__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkdiff__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -180,7 +180,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkdiff__gui-gcc-Release_2ui__mainwindow_8h_source.html b/doc/html/build-pkdiff__gui-gcc-Release_2ui__mainwindow_8h_source.html
index 9de4ba7..b3f330c 100644
--- a/doc/html/build-pkdiff__gui-gcc-Release_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkdiff__gui-gcc-Release_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -499,7 +499,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkextract__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkextract__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
index f359add..9675565 100644
--- a/doc/html/build-pkextract__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkextract__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -174,7 +174,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkextract__gui-gcc-Debug_2ui__mainwindow_8h_source.html b/doc/html/build-pkextract__gui-gcc-Debug_2ui__mainwindow_8h_source.html
index d641e6d..eb50454 100644
--- a/doc/html/build-pkextract__gui-gcc-Debug_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkextract__gui-gcc-Debug_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -574,7 +574,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkextract__gui-gcc-Release_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkextract__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
index 8786911..f155729 100644
--- a/doc/html/build-pkextract__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkextract__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -174,7 +174,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkextract__gui-gcc-Release_2ui__mainwindow_8h_source.html b/doc/html/build-pkextract__gui-gcc-Release_2ui__mainwindow_8h_source.html
index 5ecd607..69d734f 100644
--- a/doc/html/build-pkextract__gui-gcc-Release_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkextract__gui-gcc-Release_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -574,7 +574,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pksvm__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html b/doc/html/build-pksvm__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
index ce6ef50..9e2aa4b 100644
--- a/doc/html/build-pksvm__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pksvm__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -189,7 +189,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pksvm__gui-gcc-Debug_2ui__mainwindow_8h_source.html b/doc/html/build-pksvm__gui-gcc-Debug_2ui__mainwindow_8h_source.html
index 338b467..f4d40db 100644
--- a/doc/html/build-pksvm__gui-gcc-Debug_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pksvm__gui-gcc-Debug_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -724,7 +724,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pksvm__gui-gcc-Release_2moc__mainwindow_8cpp_source.html b/doc/html/build-pksvm__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
index 8b2f7a9..fa08163 100644
--- a/doc/html/build-pksvm__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pksvm__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -189,7 +189,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pksvm__gui-gcc-Release_2ui__mainwindow_8h_source.html b/doc/html/build-pksvm__gui-gcc-Release_2ui__mainwindow_8h_source.html
index 6b7545c..9f41b42 100644
--- a/doc/html/build-pksvm__gui-gcc-Release_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pksvm__gui-gcc-Release_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -724,7 +724,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classBadConversion-members.html b/doc/html/classBadConversion-members.html
index 498f9b4..4b8733c 100644
--- a/doc/html/classBadConversion-members.html
+++ b/doc/html/classBadConversion-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classBadConversion.html b/doc/html/classBadConversion.html
index 5e2b2ae..c712b2d 100644
--- a/doc/html/classBadConversion.html
+++ b/doc/html/classBadConversion.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -91,7 +91,7 @@ Public Member Functions</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCache-members.html b/doc/html/classCache-members.html
index 9515509..ae3e3b6 100644
--- a/doc/html/classCache-members.html
+++ b/doc/html/classCache-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -62,7 +62,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCache.html b/doc/html/classCache.html
index c3aecb5..a48031f 100644
--- a/doc/html/classCache.html
+++ b/doc/html/classCache.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@ void </td><td class="memItemRight" valign="bottom"><b>swap_index</b> (int i
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCompare__IndexValue-members.html b/doc/html/classCompare__IndexValue-members.html
index 1c1b7d3..7bc5795 100644
--- a/doc/html/classCompare__IndexValue-members.html
+++ b/doc/html/classCompare__IndexValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCompare__IndexValue.html b/doc/html/classCompare__IndexValue.html
index 2c7c237..7ab25fd 100644
--- a/doc/html/classCompare__IndexValue.html
+++ b/doc/html/classCompare__IndexValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCompare__PosValue-members.html b/doc/html/classCompare__PosValue-members.html
index f2cbcab..44157c6 100644
--- a/doc/html/classCompare__PosValue-members.html
+++ b/doc/html/classCompare__PosValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCompare__PosValue.html b/doc/html/classCompare__PosValue.html
index 4fe107f..2698678 100644
--- a/doc/html/classCompare__PosValue.html
+++ b/doc/html/classCompare__PosValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactory-members.html b/doc/html/classCostFactory-members.html
index 34d6885..c14336d 100644
--- a/doc/html/classCostFactory-members.html
+++ b/doc/html/classCostFactory-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -80,7 +80,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactory.html b/doc/html/classCostFactory.html
index 58493db..10a9eba 100644
--- a/doc/html/classCostFactory.html
+++ b/doc/html/classCostFactory.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -146,7 +146,7 @@ short </td><td class="memItemRight" valign="bottom"><b>m_verbose</b></td></
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactoryANN-members.html b/doc/html/classCostFactoryANN-members.html
index 2ffbd5b..d769a4f 100644
--- a/doc/html/classCostFactoryANN-members.html
+++ b/doc/html/classCostFactoryANN-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -83,7 +83,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactoryANN.html b/doc/html/classCostFactoryANN.html
index 58ff49c..aa47b9b 100644
--- a/doc/html/classCostFactoryANN.html
+++ b/doc/html/classCostFactoryANN.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -151,7 +151,7 @@ short </td><td class="memItemRight" valign="bottom"><b>m_verbose</b></td></
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactorySVM-members.html b/doc/html/classCostFactorySVM-members.html
index 77daf4e..cab37c1 100644
--- a/doc/html/classCostFactorySVM-members.html
+++ b/doc/html/classCostFactorySVM-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -83,7 +83,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactorySVM.html b/doc/html/classCostFactorySVM.html
index 28aadd5..3799abc 100644
--- a/doc/html/classCostFactorySVM.html
+++ b/doc/html/classCostFactorySVM.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -151,7 +151,7 @@ short </td><td class="memItemRight" valign="bottom"><b>m_verbose</b></td></
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDataModel-members.html b/doc/html/classDataModel-members.html
index 5127847..c4b18f8 100644
--- a/doc/html/classDataModel-members.html
+++ b/doc/html/classDataModel-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -81,7 +81,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDataModel.html b/doc/html/classDataModel.html
index b9a4061..ce40baf 100644
--- a/doc/html/classDataModel.html
+++ b/doc/html/classDataModel.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -131,7 +131,7 @@ void </td><td class="memItemRight" valign="bottom"><b>setBoresightAtt</b> (
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDecrease__IndexValue-members.html b/doc/html/classDecrease__IndexValue-members.html
index 432ffa7..3614372 100644
--- a/doc/html/classDecrease__IndexValue-members.html
+++ b/doc/html/classDecrease__IndexValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDecrease__IndexValue.html b/doc/html/classDecrease__IndexValue.html
index 268abb1..ed1f658 100644
--- a/doc/html/classDecrease__IndexValue.html
+++ b/doc/html/classDecrease__IndexValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDecrease__PosValue-members.html b/doc/html/classDecrease__PosValue-members.html
index 485ac3c..f312e7f 100644
--- a/doc/html/classDecrease__PosValue-members.html
+++ b/doc/html/classDecrease__PosValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDecrease__PosValue.html b/doc/html/classDecrease__PosValue.html
index 36c0eb0..465f241 100644
--- a/doc/html/classDecrease__PosValue.html
+++ b/doc/html/classDecrease__PosValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classEgcs-members.html b/doc/html/classEgcs-members.html
index 7f2e0ea..556ddf5 100644
--- a/doc/html/classEgcs-members.html
+++ b/doc/html/classEgcs-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classEgcs.html b/doc/html/classEgcs.html
index 6b946d0..9a2fe3e 100644
--- a/doc/html/classEgcs.html
+++ b/doc/html/classEgcs.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -102,7 +102,7 @@ void </td><td class="memItemRight" valign="bottom"><b>cell2mid</b> (const s
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFANN_1_1neural__net-members.html b/doc/html/classFANN_1_1neural__net-members.html
index 9f7d41f..e017069 100644
--- a/doc/html/classFANN_1_1neural__net-members.html
+++ b/doc/html/classFANN_1_1neural__net-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -188,7 +188,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFANN_1_1neural__net.html b/doc/html/classFANN_1_1neural__net.html
index 1203659..f75ac0e 100644
--- a/doc/html/classFANN_1_1neural__net.html
+++ b/doc/html/classFANN_1_1neural__net.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -449,7 +449,7 @@ struct fann * </td><td class="memItemRight" valign="bottom"><b>ann</b></td>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFANN_1_1training__data-members.html b/doc/html/classFANN_1_1training__data-members.html
index 80ce22c..f8327ed 100644
--- a/doc/html/classFANN_1_1training__data-members.html
+++ b/doc/html/classFANN_1_1training__data-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFANN_1_1training__data.html b/doc/html/classFANN_1_1training__data.html
index 63c66bc..e5a9ddc 100644
--- a/doc/html/classFANN_1_1training__data.html
+++ b/doc/html/classFANN_1_1training__data.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -149,7 +149,7 @@ class </td><td class="memItemRight" valign="bottom"><b>neural_net</b></td><
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFeatureSelector-members.html b/doc/html/classFeatureSelector-members.html
index 7e98315..391d04a 100644
--- a/doc/html/classFeatureSelector-members.html
+++ b/doc/html/classFeatureSelector-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -64,7 +64,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFeatureSelector.html b/doc/html/classFeatureSelector.html
index 5285b1f..21c8e9d 100644
--- a/doc/html/classFeatureSelector.html
+++ b/doc/html/classFeatureSelector.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -84,7 +84,7 @@ template<class T > </td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFileReaderAscii-members.html b/doc/html/classFileReaderAscii-members.html
index 0d7dd73..b3fdfbd 100644
--- a/doc/html/classFileReaderAscii-members.html
+++ b/doc/html/classFileReaderAscii-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -81,7 +81,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFileReaderAscii.html b/doc/html/classFileReaderAscii.html
index f075b6d..ac17166 100644
--- a/doc/html/classFileReaderAscii.html
+++ b/doc/html/classFileReaderAscii.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -145,7 +145,7 @@ int </td><td class="memItemRight" valign="bottom"><b>m_maxRow</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFileReaderLas-members.html b/doc/html/classFileReaderLas-members.html
index 78fd7f2..aab74df 100644
--- a/doc/html/classFileReaderLas-members.html
+++ b/doc/html/classFileReaderLas-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -84,7 +84,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFileReaderLas.html b/doc/html/classFileReaderLas.html
index 5c8b034..3c10e96 100644
--- a/doc/html/classFileReaderLas.html
+++ b/doc/html/classFileReaderLas.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -157,7 +157,7 @@ std::vector< liblas::FilterPtr > </td><td class="memItemRight" valign
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgRasterGdal-members.html b/doc/html/classImgRasterGdal-members.html
new file mode 100644
index 0000000..d0ba943
--- /dev/null
+++ b/doc/html/classImgRasterGdal-members.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.6</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">ImgRasterGdal Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>close</b>(void) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>covers</b>(double x, double y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>covers</b>(double ulx, double uly, double lrx, double lry) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>GDALSetNoDataValue</b>(double noDataValue, int band=0) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>geo2image</b>(double x, double y, double &i, double &j) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getBoundingBox</b>(double &ulx, double &uly, double &lrx, double &lry) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getCenterPos</b>(double &x, double &y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getColorTable</b>(int band=0) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getCompression</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDataset</b>() (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDataType</b>(int band=0) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDeltaX</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDeltaY</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDriverDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getFileName</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getGeoTransform</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getGeoTransform</b>(double *gt) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getImageDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getImageType</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getInterleave</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getLrx</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getLry</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMetadata</b>() (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMetadata</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMetadata</b>(std::list< std::string > &metadata) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMetadataItem</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getNoDataValues</b>(std::vector< double > &noDataValues) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getProjection</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getProjectionRef</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getRasterBand</b>(int band=0) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getUlx</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getUly</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>image2geo</b>(double i, double j, double &x, double &y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ImgRasterGdal</b>(void) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>ImgReaderGdal</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">friend</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ImgWriterGdal</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">friend</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>isGeoRef</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>isNoData</b>(double value) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_filename</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_gds</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_gt</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_nband</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_ncol</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_noDataValues</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_nrow</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nrOfBand</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>nrOfCol</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nrOfRow</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>pushNoDataValue</b>(double noDataValue) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setNoData</b>(const std::vector< double > nodata) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>~ImgRasterGdal</b>(void) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classImgRasterGdal.html b/doc/html/classImgRasterGdal.html
new file mode 100644
index 0000000..cf229df
--- /dev/null
+++ b/doc/html/classImgRasterGdal.html
@@ -0,0 +1,257 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: ImgRasterGdal Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.6</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pro-attribs">Protected Attributes</a> |
+<a href="#friends">Friends</a> |
+<a href="classImgRasterGdal-members.html">List of all members</a>  </div>
+  <div class="headertitle">
+<div class="title">ImgRasterGdal Class Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for ImgRasterGdal:</div>
+<div class="dyncontent">
+<div class="center"><img src="classImgRasterGdal__inherit__graph.png" border="0" usemap="#ImgRasterGdal_inherit__map" alt="Inheritance graph"/></div>
+<map name="ImgRasterGdal_inherit__map" id="ImgRasterGdal_inherit__map">
+<area shape="rect" id="node2" href="classImgReaderGdal.html" title="ImgReaderGdal" alt="" coords="5,80,117,107"/><area shape="rect" id="node4" href="classImgWriterGdal.html" title="ImgWriterGdal" alt="" coords="143,80,249,107"/><area shape="rect" id="node3" href="classImgUpdaterGdal.html" title="ImgUpdaterGdal" alt="" coords="69,155,185,181"/></map>
+<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
+<div class="dynheader">
+Collaboration diagram for ImgRasterGdal:</div>
+<div class="dyncontent">
+<div class="center"><img src="classImgRasterGdal__coll__graph.png" border="0" usemap="#ImgRasterGdal_coll__map" alt="Collaboration graph"/></div>
+<map name="ImgRasterGdal_coll__map" id="ImgRasterGdal_coll__map">
+<area shape="rect" id="node2" title="STL class. " alt="" coords="28,99,107,125"/><area shape="rect" id="node3" title="STL class. " alt="" coords="5,6,131,47"/></map>
+<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a0ccbeeacbc0839f9203bafeffacf7caa"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0ccbeeacbc0839f9203bafeffacf7caa"></a>
+virtual void </td><td class="memItemRight" valign="bottom"><b>close</b> (void)</td></tr>
+<tr class="separator:a0ccbeeacbc0839f9203bafeffacf7caa"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4f5933f910448127c56479957cb97fd7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4f5933f910448127c56479957cb97fd7"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getFileName</b> () const </td></tr>
+<tr class="separator:a4f5933f910448127c56479957cb97fd7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1d03f1b73f8ca8efd9961da7450ed709"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1d03f1b73f8ca8efd9961da7450ed709"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfCol</b> (void) const </td></tr>
+<tr class="separator:a1d03f1b73f8ca8efd9961da7450ed709"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8faa9b6f13e729ae113c09549ebdae11"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8faa9b6f13e729ae113c09549ebdae11"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfRow</b> (void) const </td></tr>
+<tr class="separator:a8faa9b6f13e729ae113c09549ebdae11"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a11ed4fea3a57a37a622853dbbe5451b4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a11ed4fea3a57a37a622853dbbe5451b4"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfBand</b> (void) const </td></tr>
+<tr class="separator:a11ed4fea3a57a37a622853dbbe5451b4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab06ab3cd707396a4c587119e2e644946"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab06ab3cd707396a4c587119e2e644946"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>isGeoRef</b> () const </td></tr>
+<tr class="separator:ab06ab3cd707396a4c587119e2e644946"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aff912cb70261b8e466386fd48e44edb0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aff912cb70261b8e466386fd48e44edb0"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getProjection</b> (void) const </td></tr>
+<tr class="separator:aff912cb70261b8e466386fd48e44edb0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a29cfeaaff15425671904d03b92494e2f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a29cfeaaff15425671904d03b92494e2f"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getProjectionRef</b> (void) const </td></tr>
+<tr class="separator:a29cfeaaff15425671904d03b92494e2f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7bc9c3b0c68a33aee68d79b26b2b38c5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7bc9c3b0c68a33aee68d79b26b2b38c5"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> () const </td></tr>
+<tr class="separator:a7bc9c3b0c68a33aee68d79b26b2b38c5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac95256e22afd8e841deb4eb62716d169"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac95256e22afd8e841deb4eb62716d169"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> (double *gt) const </td></tr>
+<tr class="separator:ac95256e22afd8e841deb4eb62716d169"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad529323a7b1470f88fcb76aebd1ae799"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad529323a7b1470f88fcb76aebd1ae799"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>getBoundingBox</b> (double &ulx, double &uly, double &lrx, double &lry) const </td></tr>
+<tr class="separator:ad529323a7b1470f88fcb76aebd1ae799"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1e618ae325f433cd0ecd84252b4abee0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1e618ae325f433cd0ecd84252b4abee0"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>getCenterPos</b> (double &x, double &y) const </td></tr>
+<tr class="separator:a1e618ae325f433cd0ecd84252b4abee0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a89aca8db1d2e0a7a6ab005ba3c71a2da"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a89aca8db1d2e0a7a6ab005ba3c71a2da"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getUlx</b> () const </td></tr>
+<tr class="separator:a89aca8db1d2e0a7a6ab005ba3c71a2da"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab4e5ec5a64ecc151445417eeecdab859"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab4e5ec5a64ecc151445417eeecdab859"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getUly</b> () const </td></tr>
+<tr class="separator:ab4e5ec5a64ecc151445417eeecdab859"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad354468d74356bc066426564f0d6dcc2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad354468d74356bc066426564f0d6dcc2"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getLrx</b> () const </td></tr>
+<tr class="separator:ad354468d74356bc066426564f0d6dcc2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac8fb5d16ecdd6ffb21f0cb5e0aa3775e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac8fb5d16ecdd6ffb21f0cb5e0aa3775e"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getLry</b> () const </td></tr>
+<tr class="separator:ac8fb5d16ecdd6ffb21f0cb5e0aa3775e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3f5882d5b3544bf5fcd353705d24d1a6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3f5882d5b3544bf5fcd353705d24d1a6"></a>
+int </td><td class="memItemRight" valign="bottom"><b>getNoDataValues</b> (std::vector< double > &noDataValues) const </td></tr>
+<tr class="separator:a3f5882d5b3544bf5fcd353705d24d1a6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a17693949c5bbd2fed20f0289dd62ff1e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a17693949c5bbd2fed20f0289dd62ff1e"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>isNoData</b> (double value) const </td></tr>
+<tr class="separator:a17693949c5bbd2fed20f0289dd62ff1e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa8c6781d58167b8c64618a0bb070889d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa8c6781d58167b8c64618a0bb070889d"></a>
+int </td><td class="memItemRight" valign="bottom"><b>pushNoDataValue</b> (double noDataValue)</td></tr>
+<tr class="separator:aa8c6781d58167b8c64618a0bb070889d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0c029d2179aec1f96dbcd3e403fa3bed"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0c029d2179aec1f96dbcd3e403fa3bed"></a>
+int </td><td class="memItemRight" valign="bottom"><b>setNoData</b> (const std::vector< double > nodata)</td></tr>
+<tr class="separator:a0c029d2179aec1f96dbcd3e403fa3bed"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab29f4dc977529bd5b12ee8a82a6ba325"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab29f4dc977529bd5b12ee8a82a6ba325"></a>
+CPLErr </td><td class="memItemRight" valign="bottom"><b>GDALSetNoDataValue</b> (double noDataValue, int band=0)</td></tr>
+<tr class="separator:ab29f4dc977529bd5b12ee8a82a6ba325"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab3bf668fc2bbfc75cffb31be86782e3e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab3bf668fc2bbfc75cffb31be86782e3e"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double x, double y) const </td></tr>
+<tr class="separator:ab3bf668fc2bbfc75cffb31be86782e3e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2b9c235dac00eb642c7fb357900bb4ea"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2b9c235dac00eb642c7fb357900bb4ea"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double ulx, double uly, double lrx, double lry) const </td></tr>
+<tr class="separator:a2b9c235dac00eb642c7fb357900bb4ea"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa5adb11c20fc7544b864a57cf1dfae72"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa5adb11c20fc7544b864a57cf1dfae72"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>geo2image</b> (double x, double y, double &i, double &j) const </td></tr>
+<tr class="separator:aa5adb11c20fc7544b864a57cf1dfae72"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab401949cc9faf0d8dbfca300b50d3812"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab401949cc9faf0d8dbfca300b50d3812"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>image2geo</b> (double i, double j, double &x, double &y) const </td></tr>
+<tr class="separator:ab401949cc9faf0d8dbfca300b50d3812"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a07442232ef794eaa96cf0f96538c3a76"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a07442232ef794eaa96cf0f96538c3a76"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getDeltaX</b> (void) const </td></tr>
+<tr class="separator:a07442232ef794eaa96cf0f96538c3a76"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a43746347238dadb4e18dffd77c0aecd8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a43746347238dadb4e18dffd77c0aecd8"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getDeltaY</b> (void) const </td></tr>
+<tr class="separator:a43746347238dadb4e18dffd77c0aecd8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a82a8664dd3281cbd6cb710116f9fce38"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a82a8664dd3281cbd6cb710116f9fce38"></a>
+GDALDataType </td><td class="memItemRight" valign="bottom"><b>getDataType</b> (int band=0) const </td></tr>
+<tr class="separator:a82a8664dd3281cbd6cb710116f9fce38"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a355771835d7a0c941d3a42e76dd0f4ae"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a355771835d7a0c941d3a42e76dd0f4ae"></a>
+GDALRasterBand * </td><td class="memItemRight" valign="bottom"><b>getRasterBand</b> (int band=0)</td></tr>
+<tr class="separator:a355771835d7a0c941d3a42e76dd0f4ae"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a24ded5779fef37794008f519a6638f63"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a24ded5779fef37794008f519a6638f63"></a>
+GDALColorTable * </td><td class="memItemRight" valign="bottom"><b>getColorTable</b> (int band=0) const </td></tr>
+<tr class="separator:a24ded5779fef37794008f519a6638f63"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a069d7a03c4c4cbb311534b1e061a59c9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a069d7a03c4c4cbb311534b1e061a59c9"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getDriverDescription</b> () const </td></tr>
+<tr class="separator:a069d7a03c4c4cbb311534b1e061a59c9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab84afa6974996363f4f004c9e8ed6c9a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab84afa6974996363f4f004c9e8ed6c9a"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getImageType</b> () const </td></tr>
+<tr class="separator:ab84afa6974996363f4f004c9e8ed6c9a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac648aeea3051b17663c1666bfb7b9ba2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac648aeea3051b17663c1666bfb7b9ba2"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getInterleave</b> () const </td></tr>
+<tr class="separator:ac648aeea3051b17663c1666bfb7b9ba2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3d6931927354087f333f68f5d70197c8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3d6931927354087f333f68f5d70197c8"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getCompression</b> () const </td></tr>
+<tr class="separator:a3d6931927354087f333f68f5d70197c8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a129dff26f65af24f6d006dae9f43dbba"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a129dff26f65af24f6d006dae9f43dbba"></a>
+GDALDataset * </td><td class="memItemRight" valign="bottom"><b>getDataset</b> ()</td></tr>
+<tr class="separator:a129dff26f65af24f6d006dae9f43dbba"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a412899cba08baf1a1630951afffdc6dd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a412899cba08baf1a1630951afffdc6dd"></a>
+char ** </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> ()</td></tr>
+<tr class="separator:a412899cba08baf1a1630951afffdc6dd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a43f9dfcb1724e88c86f7bb1f0a5fe236"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a43f9dfcb1724e88c86f7bb1f0a5fe236"></a>
+char ** </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> () const </td></tr>
+<tr class="separator:a43f9dfcb1724e88c86f7bb1f0a5fe236"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0c1a1664962b9ccd05ed9bcf7a118011"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0c1a1664962b9ccd05ed9bcf7a118011"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> (std::list< std::string > &metadata) const </td></tr>
+<tr class="separator:a0c1a1664962b9ccd05ed9bcf7a118011"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab599dad8573f2ac24302fdb339b1005a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab599dad8573f2ac24302fdb339b1005a"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getDescription</b> () const </td></tr>
+<tr class="separator:ab599dad8573f2ac24302fdb339b1005a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a592538d7aeb7622acb20cc3d81ed1dcc"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a592538d7aeb7622acb20cc3d81ed1dcc"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getMetadataItem</b> () const </td></tr>
+<tr class="separator:a592538d7aeb7622acb20cc3d81ed1dcc"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a057a5b1bc4bd5bc391962f154b2bb747"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a057a5b1bc4bd5bc391962f154b2bb747"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getImageDescription</b> () const </td></tr>
+<tr class="separator:a057a5b1bc4bd5bc391962f154b2bb747"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-attribs"></a>
+Protected Attributes</h2></td></tr>
+<tr class="memitem:a3257f4db7418fde0a0d3caf2a1d179a1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3257f4db7418fde0a0d3caf2a1d179a1"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>m_filename</b></td></tr>
+<tr class="separator:a3257f4db7418fde0a0d3caf2a1d179a1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a49ef42e3d2cde64af9cfc00646b28f3b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a49ef42e3d2cde64af9cfc00646b28f3b"></a>
+GDALDataset * </td><td class="memItemRight" valign="bottom"><b>m_gds</b></td></tr>
+<tr class="separator:a49ef42e3d2cde64af9cfc00646b28f3b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a28f5fd5bdcd3e50ddd5f1b68ad8d31d7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a28f5fd5bdcd3e50ddd5f1b68ad8d31d7"></a>
+int </td><td class="memItemRight" valign="bottom"><b>m_ncol</b></td></tr>
+<tr class="separator:a28f5fd5bdcd3e50ddd5f1b68ad8d31d7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a78b8a391b58e4268da9b4c88e7ecf962"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a78b8a391b58e4268da9b4c88e7ecf962"></a>
+int </td><td class="memItemRight" valign="bottom"><b>m_nrow</b></td></tr>
+<tr class="separator:a78b8a391b58e4268da9b4c88e7ecf962"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a208157846765615d4495a73bada30740"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a208157846765615d4495a73bada30740"></a>
+int </td><td class="memItemRight" valign="bottom"><b>m_nband</b></td></tr>
+<tr class="separator:a208157846765615d4495a73bada30740"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ade28d4208d3a77f112aa6a190b9e38f6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ade28d4208d3a77f112aa6a190b9e38f6"></a>
+double </td><td class="memItemRight" valign="bottom"><b>m_gt</b> [6]</td></tr>
+<tr class="separator:ade28d4208d3a77f112aa6a190b9e38f6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9154b4b3d6ef24dd1d922b3caab9b295"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9154b4b3d6ef24dd1d922b3caab9b295"></a>
+std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_noDataValues</b></td></tr>
+<tr class="separator:a9154b4b3d6ef24dd1d922b3caab9b295"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="friends"></a>
+Friends</h2></td></tr>
+<tr class="memitem:a1ec466419b00f89d4f3f7e40b01133e0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1ec466419b00f89d4f3f7e40b01133e0"></a>
+class </td><td class="memItemRight" valign="bottom"><b>ImgReaderGdal</b></td></tr>
+<tr class="separator:a1ec466419b00f89d4f3f7e40b01133e0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a62edd8747cdf0432b983352769a7cd67"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a62edd8747cdf0432b983352769a7cd67"></a>
+class </td><td class="memItemRight" valign="bottom"><b>ImgWriterGdal</b></td></tr>
+<tr class="separator:a62edd8747cdf0432b983352769a7cd67"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock">
+<p>Definition at line <a class="el" href="ImgRasterGdal_8h_source.html#l00035">35</a> of file <a class="el" href="ImgRasterGdal_8h_source.html">ImgRasterGdal.h</a>.</p>
+</div><hr/>The documentation for this class was generated from the following files:<ul>
+<li>/home/kempenep/pktools/src/imageclasses/<a class="el" href="ImgRasterGdal_8h_source.html">ImgRasterGdal.h</a></li>
+<li>/home/kempenep/pktools/src/imageclasses/<a class="el" href="ImgRasterGdal_8cc_source.html">ImgRasterGdal.cc</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classImgReaderGdal__coll__graph.map b/doc/html/classImgRasterGdal__coll__graph.map
similarity index 78%
copy from doc/html/classImgReaderGdal__coll__graph.map
copy to doc/html/classImgRasterGdal__coll__graph.map
index 3bddeb4..0279384 100644
--- a/doc/html/classImgReaderGdal__coll__graph.map
+++ b/doc/html/classImgRasterGdal__coll__graph.map
@@ -1,4 +1,4 @@
-<map id="ImgReaderGdal" name="ImgReaderGdal">
+<map id="ImgRasterGdal" name="ImgRasterGdal">
 <area shape="rect" id="node2" title="STL class. " alt="" coords="28,99,107,125"/>
 <area shape="rect" id="node3" title="STL class. " alt="" coords="5,6,131,47"/>
 </map>
diff --git a/doc/html/classImgRasterGdal__coll__graph.md5 b/doc/html/classImgRasterGdal__coll__graph.md5
new file mode 100644
index 0000000..4bf16fe
--- /dev/null
+++ b/doc/html/classImgRasterGdal__coll__graph.md5
@@ -0,0 +1 @@
+5b5c3a71fa87a01e9c39c0db77fd07fd
\ No newline at end of file
diff --git a/doc/html/classImgRasterGdal__coll__graph.png b/doc/html/classImgRasterGdal__coll__graph.png
new file mode 100644
index 0000000..4168048
Binary files /dev/null and b/doc/html/classImgRasterGdal__coll__graph.png differ
diff --git a/doc/html/classImgRasterGdal__inherit__graph.map b/doc/html/classImgRasterGdal__inherit__graph.map
new file mode 100644
index 0000000..f4c104a
--- /dev/null
+++ b/doc/html/classImgRasterGdal__inherit__graph.map
@@ -0,0 +1,5 @@
+<map id="ImgRasterGdal" name="ImgRasterGdal">
+<area shape="rect" id="node2" href="$classImgReaderGdal.html" title="ImgReaderGdal" alt="" coords="5,80,117,107"/>
+<area shape="rect" id="node4" href="$classImgWriterGdal.html" title="ImgWriterGdal" alt="" coords="143,80,249,107"/>
+<area shape="rect" id="node3" href="$classImgUpdaterGdal.html" title="ImgUpdaterGdal" alt="" coords="69,155,185,181"/>
+</map>
diff --git a/doc/html/classImgRasterGdal__inherit__graph.md5 b/doc/html/classImgRasterGdal__inherit__graph.md5
new file mode 100644
index 0000000..03a0204
--- /dev/null
+++ b/doc/html/classImgRasterGdal__inherit__graph.md5
@@ -0,0 +1 @@
+6107fee37f4417b85195e24e883a7da3
\ No newline at end of file
diff --git a/doc/html/classImgRasterGdal__inherit__graph.png b/doc/html/classImgRasterGdal__inherit__graph.png
new file mode 100644
index 0000000..c6d7831
Binary files /dev/null and b/doc/html/classImgRasterGdal__inherit__graph.png differ
diff --git a/doc/html/classImgReaderGdal-members.html b/doc/html/classImgReaderGdal-members.html
index 7c05998..c8611a4 100644
--- a/doc/html/classImgReaderGdal-members.html
+++ b/doc/html/classImgReaderGdal-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -54,83 +54,85 @@
 
 <p>This is the complete list of members for <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>, including all inherited members.</p>
 <table class="directory">
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>close</b>(void) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>covers</b>(double x, double y) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>covers</b>(double ulx, double uly, double lrx, double lry) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>GDALSetNoDataValue</b>(double noDataValue, int band=0) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>geo2image</b>(double x, double y, double &i, double &j) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getBoundingBox</b>(double &ulx, double &uly, double &lrx, double &lry) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getCenterPos</b>(double &x, double &y) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getColorTable</b>(int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getCompression</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDataset</b>() (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDataType</b>(int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDeltaX</b>(void) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDeltaY</b>(void) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDescription</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDriverDescription</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getFileName</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getGeoTransform</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getGeoTransform</b>(double *gt) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>close</b>(void) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>covers</b>(double x, double y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>covers</b>(double ulx, double uly, double lrx, double lry) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>GDALSetNoDataValue</b>(double noDataValue, int band=0) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>geo2image</b>(double x, double y, double &i, double &j) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getBoundingBox</b>(double &ulx, double &uly, double &lrx, double &lry) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getCenterPos</b>(double &x, double &y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getColorTable</b>(int band=0) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getCompression</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDataset</b>() (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDataType</b>(int band=0) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDeltaX</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDeltaY</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDriverDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getFileName</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getGeoTransform</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getGeoTransform</b>(double *gt) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getHistogram</b>(std::vector< double > &histvector, double &min, double &max, unsigned int &nbin, int theBand=0, bool kde=false) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getImageDescription</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getImageType</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getInterleave</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getLrx</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getLry</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getImageDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getImageType</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getInterleave</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getLrx</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getLry</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMax</b>(int &col, int &row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMetadata</b>() (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMetadata</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMetadata</b>(std::list< std::string > &metadata) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMetadataItem</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMetadata</b>() (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMetadata</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMetadata</b>(std::list< std::string > &metadata) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMetadataItem</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>getMin</b>(int &col, int &row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMinMax</b>(int startCol, int endCol, int startRow, int endRow, int band, double &minValue, double &maxValue) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMinMax</b>(double &minValue, double &maxValue, int band=0, bool exhaustiveSearch=true) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getNoDataValues</b>(std::vector< double > &noDataValues) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMinMax</b>(double &minValue, double &maxValue, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getNoDataValues</b>(std::vector< double > &noDataValues) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>getNvalid</b>(int band) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getProjection</b>(void) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getProjectionRef</b>(void) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getProjection</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getProjectionRef</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getRange</b>(std::vector< short > &range, int Band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getRasterBand</b>(int band=0) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getRasterBand</b>(int band=0) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getRefPix</b>(double &refX, double &refY, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getUlx</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getUly</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>image2geo</b>(double i, double j, double &x, double &y) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ImgReaderGdal</b>(void) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>ImgReaderGdal</b>(const std::string &filename) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>isGeoRef</b>() const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>isNoData</b>(double value) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_filename</b> (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_gds</b> (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_gt</b> (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_nband</b> (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_ncol</b> (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_noDataValues</b> (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_nrow</b> (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_offset</b> (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_scale</b> (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>nrOfBand</b>(void) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nrOfCol</b>(void) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>nrOfRow</b>(void) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>open</b>(const std::string &filename) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>pushNoDataValue</b>(double noDataValue) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readData</b>(T &value, const GDALDataType &dataType, int col, int row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, double row, int band=0, RESAMPLE resample=NEAR) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, double row, int band=0, RESAMPLE resample=NEAR) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>readDataBlock</b>(Vector2d< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readDataBlock</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setCodec</b>() (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setNoData</b>(const std::vector< double > nodata) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setOffset</b>(double theOffset, int band=0) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setScale</b>(double theScale, int band=0) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getUlx</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getUly</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>image2geo</b>(double i, double j, double &x, double &y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ImgRasterGdal</b>(void) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>ImgReaderGdal</b>(void) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ImgReaderGdal</b>(const std::string &filename, const GDALAccess &readMode=GA_ReadOnly) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>isGeoRef</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>isNoData</b>(double value) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_filename</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_gds</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_gt</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_nband</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_ncol</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_noDataValues</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_nrow</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_offset</b> (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_scale</b> (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nrOfBand</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>nrOfCol</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nrOfRow</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>open</b>(const std::string &filename, const GDALAccess &readMode=GA_ReadOnly) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>pushNoDataValue</b>(double noDataValue) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>readData</b>(T &value, const GDALDataType &dataType, int col, int row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, double row, int band=0, RESAMPLE resample=NEAR) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, double row, int band=0, RESAMPLE resample=NEAR) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readDataBlock</b>(Vector2d< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>readDataBlock</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setCodec</b>(const GDALAccess &readMode=GA_ReadOnly) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setNoData</b>(const std::vector< double > nodata) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setOffset</b>(double theOffset, int band=0) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setScale</b>(double theScale, int band=0) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>~ImgRasterGdal</b>(void) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>~ImgReaderGdal</b>(void) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
 </table></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgReaderGdal.html b/doc/html/classImgReaderGdal.html
index 2f3f4cc..dc3fafd 100644
--- a/doc/html/classImgReaderGdal.html
+++ b/doc/html/classImgReaderGdal.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -57,117 +57,37 @@
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
+Inheritance diagram for ImgReaderGdal:</div>
+<div class="dyncontent">
+<div class="center"><img src="classImgReaderGdal__inherit__graph.png" border="0" usemap="#ImgReaderGdal_inherit__map" alt="Inheritance graph"/></div>
+<map name="ImgReaderGdal_inherit__map" id="ImgReaderGdal_inherit__map">
+<area shape="rect" id="node3" href="classImgUpdaterGdal.html" title="ImgUpdaterGdal" alt="" coords="4,155,120,181"/><area shape="rect" id="node2" href="classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="7,5,117,32"/></map>
+<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
+<div class="dynheader">
 Collaboration diagram for ImgReaderGdal:</div>
 <div class="dyncontent">
 <div class="center"><img src="classImgReaderGdal__coll__graph.png" border="0" usemap="#ImgReaderGdal_coll__map" alt="Collaboration graph"/></div>
 <map name="ImgReaderGdal_coll__map" id="ImgReaderGdal_coll__map">
-<area shape="rect" id="node2" title="STL class. " alt="" coords="28,99,107,125"/><area shape="rect" id="node3" title="STL class. " alt="" coords="5,6,131,47"/></map>
+<area shape="rect" id="node2" href="classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="115,191,225,217"/><area shape="rect" id="node3" title="STL class. " alt="" coords="28,99,107,125"/><area shape="rect" id="node4" title="STL class. " alt="" coords="5,6,131,47"/></map>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a1434683e356b17c9974a44047129b382"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1434683e356b17c9974a44047129b382"></a>
- </td><td class="memItemRight" valign="bottom"><b>ImgReaderGdal</b> (const std::string &filename)</td></tr>
-<tr class="separator:a1434683e356b17c9974a44047129b382"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7daef788857fde9254c08f347324002e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7daef788857fde9254c08f347324002e"></a>
-void </td><td class="memItemRight" valign="bottom"><b>open</b> (const std::string &filename)</td></tr>
-<tr class="separator:a7daef788857fde9254c08f347324002e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae716a3d2335a4ed5fed24d9c27a252a0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae716a3d2335a4ed5fed24d9c27a252a0"></a>
+ </td><td class="memItemRight" valign="bottom"><b>ImgReaderGdal</b> (const std::string &filename, const GDALAccess &readMode=GA_ReadOnly)</td></tr>
+<tr class="separator:ae716a3d2335a4ed5fed24d9c27a252a0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7f708e38ed0670d8f300ea323c3b7044"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7f708e38ed0670d8f300ea323c3b7044"></a>
+void </td><td class="memItemRight" valign="bottom"><b>open</b> (const std::string &filename, const GDALAccess &readMode=GA_ReadOnly)</td></tr>
+<tr class="separator:a7f708e38ed0670d8f300ea323c3b7044"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a514f33e43765374b9599891fae12a6c5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a514f33e43765374b9599891fae12a6c5"></a>
 void </td><td class="memItemRight" valign="bottom"><b>close</b> (void)</td></tr>
 <tr class="separator:a514f33e43765374b9599891fae12a6c5"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:afaf7f5cc088d5e82963ccbe71cf3b629"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afaf7f5cc088d5e82963ccbe71cf3b629"></a>
-std::string </td><td class="memItemRight" valign="bottom"><b>getFileName</b> () const </td></tr>
-<tr class="separator:afaf7f5cc088d5e82963ccbe71cf3b629"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aac7e9e480c2a5898eacf5cf9f3b2d33e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aac7e9e480c2a5898eacf5cf9f3b2d33e"></a>
-int </td><td class="memItemRight" valign="bottom"><b>nrOfCol</b> (void) const </td></tr>
-<tr class="separator:aac7e9e480c2a5898eacf5cf9f3b2d33e"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a6c71db92761ae0885e63c8c8cd308606"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6c71db92761ae0885e63c8c8cd308606"></a>
-int </td><td class="memItemRight" valign="bottom"><b>nrOfRow</b> (void) const </td></tr>
-<tr class="separator:a6c71db92761ae0885e63c8c8cd308606"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac158ca3c033290683d8c81f1666f14fa"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac158ca3c033290683d8c81f1666f14fa"></a>
-int </td><td class="memItemRight" valign="bottom"><b>nrOfBand</b> (void) const </td></tr>
-<tr class="separator:ac158ca3c033290683d8c81f1666f14fa"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a6835a9858ceea7a73cd87fc16b506dd1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6835a9858ceea7a73cd87fc16b506dd1"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>isGeoRef</b> () const </td></tr>
-<tr class="separator:a6835a9858ceea7a73cd87fc16b506dd1"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a712541cca0b8c995686475c0da799496"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a712541cca0b8c995686475c0da799496"></a>
-std::string </td><td class="memItemRight" valign="bottom"><b>getProjection</b> (void) const </td></tr>
-<tr class="separator:a712541cca0b8c995686475c0da799496"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a04d950356cc9e54c286323db00bf176b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a04d950356cc9e54c286323db00bf176b"></a>
-std::string </td><td class="memItemRight" valign="bottom"><b>getProjectionRef</b> (void) const </td></tr>
-<tr class="separator:a04d950356cc9e54c286323db00bf176b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad4bd44b085efdd27548e38210769882a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad4bd44b085efdd27548e38210769882a"></a>
-std::string </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> () const </td></tr>
-<tr class="separator:ad4bd44b085efdd27548e38210769882a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:afeb6857f4adcced355ec23613b6aff70"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afeb6857f4adcced355ec23613b6aff70"></a>
-void </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> (double *gt) const </td></tr>
-<tr class="separator:afeb6857f4adcced355ec23613b6aff70"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a91e20bd6f2a35f0a769b9047ed1ffdae"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a91e20bd6f2a35f0a769b9047ed1ffdae"></a>
-std::string </td><td class="memItemRight" valign="bottom"><b>getDescription</b> () const </td></tr>
-<tr class="separator:a91e20bd6f2a35f0a769b9047ed1ffdae"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a39c9880c1f9877778dcacbe241cf1320"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a39c9880c1f9877778dcacbe241cf1320"></a>
-std::string </td><td class="memItemRight" valign="bottom"><b>getMetadataItem</b> () const </td></tr>
-<tr class="separator:a39c9880c1f9877778dcacbe241cf1320"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab83c36c95f6cfbf033eba5cb4c89e60d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab83c36c95f6cfbf033eba5cb4c89e60d"></a>
-std::string </td><td class="memItemRight" valign="bottom"><b>getImageDescription</b> () const </td></tr>
-<tr class="separator:ab83c36c95f6cfbf033eba5cb4c89e60d"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a72c9b9178bbe6625a757dad8a24b0971"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a72c9b9178bbe6625a757dad8a24b0971"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>getBoundingBox</b> (double &ulx, double &uly, double &lrx, double &lry) const </td></tr>
-<tr class="separator:a72c9b9178bbe6625a757dad8a24b0971"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aace5556eef281ba2ea88cc1cc814bbe4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aace5556eef281ba2ea88cc1cc814bbe4"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>getCenterPos</b> (double &x, double &y) const </td></tr>
-<tr class="separator:aace5556eef281ba2ea88cc1cc814bbe4"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7f35f2f55bf76c1a4968ce998601c576"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7f35f2f55bf76c1a4968ce998601c576"></a>
-double </td><td class="memItemRight" valign="bottom"><b>getUlx</b> () const </td></tr>
-<tr class="separator:a7f35f2f55bf76c1a4968ce998601c576"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af58a0598022c7a2a13f2e3af7da1da67"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af58a0598022c7a2a13f2e3af7da1da67"></a>
-double </td><td class="memItemRight" valign="bottom"><b>getUly</b> () const </td></tr>
-<tr class="separator:af58a0598022c7a2a13f2e3af7da1da67"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7fcba7dbe42b93f65adbd7096f38c4b9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7fcba7dbe42b93f65adbd7096f38c4b9"></a>
-double </td><td class="memItemRight" valign="bottom"><b>getLrx</b> () const </td></tr>
-<tr class="separator:a7fcba7dbe42b93f65adbd7096f38c4b9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a192a3bf43bbd0f546eca84db2561eae3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a192a3bf43bbd0f546eca84db2561eae3"></a>
-double </td><td class="memItemRight" valign="bottom"><b>getLry</b> () const </td></tr>
-<tr class="separator:a192a3bf43bbd0f546eca84db2561eae3"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:afac21441e51d39beb3ab5d282cd9f12e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afac21441e51d39beb3ab5d282cd9f12e"></a>
 void </td><td class="memItemRight" valign="bottom"><b>setScale</b> (double theScale, int band=0)</td></tr>
 <tr class="separator:afac21441e51d39beb3ab5d282cd9f12e"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a332975068d99166b81001a5c656022bf"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a332975068d99166b81001a5c656022bf"></a>
 void </td><td class="memItemRight" valign="bottom"><b>setOffset</b> (double theOffset, int band=0)</td></tr>
 <tr class="separator:a332975068d99166b81001a5c656022bf"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a74e4d4918fdd0fd1a0e1753a5823d578"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a74e4d4918fdd0fd1a0e1753a5823d578"></a>
-int </td><td class="memItemRight" valign="bottom"><b>getNoDataValues</b> (std::vector< double > &noDataValues) const </td></tr>
-<tr class="separator:a74e4d4918fdd0fd1a0e1753a5823d578"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa0708feaaf3e61736a1618d88e47b486"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa0708feaaf3e61736a1618d88e47b486"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>isNoData</b> (double value) const </td></tr>
-<tr class="separator:aa0708feaaf3e61736a1618d88e47b486"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af1a4c9373d77f6feeac06f80e28632b2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af1a4c9373d77f6feeac06f80e28632b2"></a>
-int </td><td class="memItemRight" valign="bottom"><b>pushNoDataValue</b> (double noDataValue)</td></tr>
-<tr class="separator:af1a4c9373d77f6feeac06f80e28632b2"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a4d05b02fd8230f06a84a05c5528948cd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4d05b02fd8230f06a84a05c5528948cd"></a>
-int </td><td class="memItemRight" valign="bottom"><b>setNoData</b> (const std::vector< double > nodata)</td></tr>
-<tr class="separator:a4d05b02fd8230f06a84a05c5528948cd"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a523e669bf091c8439d9b9e23d2e1326a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a523e669bf091c8439d9b9e23d2e1326a"></a>
-CPLErr </td><td class="memItemRight" valign="bottom"><b>GDALSetNoDataValue</b> (double noDataValue, int band=0)</td></tr>
-<tr class="separator:a523e669bf091c8439d9b9e23d2e1326a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af35b0f371e8da5080678689b86405f03"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af35b0f371e8da5080678689b86405f03"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double x, double y) const </td></tr>
-<tr class="separator:af35b0f371e8da5080678689b86405f03"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a8f36a57c0f8be2a16b33d84a64d795d1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8f36a57c0f8be2a16b33d84a64d795d1"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double ulx, double uly, double lrx, double lry) const </td></tr>
-<tr class="separator:a8f36a57c0f8be2a16b33d84a64d795d1"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a2c73b4e8f745bd6798ed64839a339d9f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2c73b4e8f745bd6798ed64839a339d9f"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>geo2image</b> (double x, double y, double &i, double &j) const </td></tr>
-<tr class="separator:a2c73b4e8f745bd6798ed64839a339d9f"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac1460f59f7b13f60eb08ef9313a30502"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac1460f59f7b13f60eb08ef9313a30502"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>image2geo</b> (double i, double j, double &x, double &y) const </td></tr>
-<tr class="separator:ac1460f59f7b13f60eb08ef9313a30502"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a71e468d5e410b868dba59953729ef637"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a71e468d5e410b868dba59953729ef637"></a>
-double </td><td class="memItemRight" valign="bottom"><b>getDeltaX</b> (void) const </td></tr>
-<tr class="separator:a71e468d5e410b868dba59953729ef637"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af3db8345555c9e1ba3753bc30b876e7c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af3db8345555c9e1ba3753bc30b876e7c"></a>
-double </td><td class="memItemRight" valign="bottom"><b>getDeltaY</b> (void) const </td></tr>
-<tr class="separator:af3db8345555c9e1ba3753bc30b876e7c"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:aba4280eff30003c827bb2567a6bc3400"><td class="memTemplParams" colspan="2"><a class="anchor" id="aba4280eff30003c827bb2567a6bc3400"></a>
 template<typename T > </td></tr>
 <tr class="memitem:aba4280eff30003c827bb2567a6bc3400"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>readData</b> (T &value, const GDALDataType &dataType, int col, int row, int band=0) const </td></tr>
@@ -199,9 +119,9 @@ template<typename T > </td></tr>
 <tr class="memitem:a591b1f2f78eacc0fd0d772e24996c6b9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a591b1f2f78eacc0fd0d772e24996c6b9"></a>
 void </td><td class="memItemRight" valign="bottom"><b>getMinMax</b> (int startCol, int endCol, int startRow, int endRow, int band, double &minValue, double &maxValue) const </td></tr>
 <tr class="separator:a591b1f2f78eacc0fd0d772e24996c6b9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:adf6f92f4428a212e2dbdef95fa789f70"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adf6f92f4428a212e2dbdef95fa789f70"></a>
-void </td><td class="memItemRight" valign="bottom"><b>getMinMax</b> (double &minValue, double &maxValue, int band=0, bool exhaustiveSearch=true) const </td></tr>
-<tr class="separator:adf6f92f4428a212e2dbdef95fa789f70"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a933dc688de9cc87eeae20530412a82d9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a933dc688de9cc87eeae20530412a82d9"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getMinMax</b> (double &minValue, double &maxValue, int band=0) const </td></tr>
+<tr class="separator:a933dc688de9cc87eeae20530412a82d9"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a40a36fbaa00190aa5a758ec034369d3d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a40a36fbaa00190aa5a758ec034369d3d"></a>
 double </td><td class="memItemRight" valign="bottom"><b>getMin</b> (int &col, int &row, int band=0) const </td></tr>
 <tr class="separator:a40a36fbaa00190aa5a758ec034369d3d"><td class="memSeparator" colspan="2"> </td></tr>
@@ -220,79 +140,168 @@ void </td><td class="memItemRight" valign="bottom"><b>getRange</b> (std::ve
 <tr class="memitem:a864413c529506b8753c450e5316a814b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a864413c529506b8753c450e5316a814b"></a>
 unsigned long int </td><td class="memItemRight" valign="bottom"><b>getNvalid</b> (int band) const </td></tr>
 <tr class="separator:a864413c529506b8753c450e5316a814b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a5591c9e50736c1553ec94a1254a290a6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5591c9e50736c1553ec94a1254a290a6"></a>
+<tr class="inherit_header pub_methods_classImgRasterGdal"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classImgRasterGdal')"><img src="closed.png" alt="-"/> Public Member Functions inherited from <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td></tr>
+<tr class="memitem:a4f5933f910448127c56479957cb97fd7 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4f5933f910448127c56479957cb97fd7"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getFileName</b> () const </td></tr>
+<tr class="separator:a4f5933f910448127c56479957cb97fd7 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1d03f1b73f8ca8efd9961da7450ed709 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1d03f1b73f8ca8efd9961da7450ed709"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfCol</b> (void) const </td></tr>
+<tr class="separator:a1d03f1b73f8ca8efd9961da7450ed709 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8faa9b6f13e729ae113c09549ebdae11 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8faa9b6f13e729ae113c09549ebdae11"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfRow</b> (void) const </td></tr>
+<tr class="separator:a8faa9b6f13e729ae113c09549ebdae11 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a11ed4fea3a57a37a622853dbbe5451b4 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a11ed4fea3a57a37a622853dbbe5451b4"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfBand</b> (void) const </td></tr>
+<tr class="separator:a11ed4fea3a57a37a622853dbbe5451b4 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab06ab3cd707396a4c587119e2e644946 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab06ab3cd707396a4c587119e2e644946"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>isGeoRef</b> () const </td></tr>
+<tr class="separator:ab06ab3cd707396a4c587119e2e644946 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aff912cb70261b8e466386fd48e44edb0 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aff912cb70261b8e466386fd48e44edb0"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getProjection</b> (void) const </td></tr>
+<tr class="separator:aff912cb70261b8e466386fd48e44edb0 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a29cfeaaff15425671904d03b92494e2f inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a29cfeaaff15425671904d03b92494e2f"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getProjectionRef</b> (void) const </td></tr>
+<tr class="separator:a29cfeaaff15425671904d03b92494e2f inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7bc9c3b0c68a33aee68d79b26b2b38c5 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7bc9c3b0c68a33aee68d79b26b2b38c5"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> () const </td></tr>
+<tr class="separator:a7bc9c3b0c68a33aee68d79b26b2b38c5 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac95256e22afd8e841deb4eb62716d169 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac95256e22afd8e841deb4eb62716d169"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> (double *gt) const </td></tr>
+<tr class="separator:ac95256e22afd8e841deb4eb62716d169 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad529323a7b1470f88fcb76aebd1ae799 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad529323a7b1470f88fcb76aebd1ae799"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>getBoundingBox</b> (double &ulx, double &uly, double &lrx, double &lry) const </td></tr>
+<tr class="separator:ad529323a7b1470f88fcb76aebd1ae799 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1e618ae325f433cd0ecd84252b4abee0 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1e618ae325f433cd0ecd84252b4abee0"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>getCenterPos</b> (double &x, double &y) const </td></tr>
+<tr class="separator:a1e618ae325f433cd0ecd84252b4abee0 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a89aca8db1d2e0a7a6ab005ba3c71a2da inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a89aca8db1d2e0a7a6ab005ba3c71a2da"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getUlx</b> () const </td></tr>
+<tr class="separator:a89aca8db1d2e0a7a6ab005ba3c71a2da inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab4e5ec5a64ecc151445417eeecdab859 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab4e5ec5a64ecc151445417eeecdab859"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getUly</b> () const </td></tr>
+<tr class="separator:ab4e5ec5a64ecc151445417eeecdab859 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad354468d74356bc066426564f0d6dcc2 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad354468d74356bc066426564f0d6dcc2"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getLrx</b> () const </td></tr>
+<tr class="separator:ad354468d74356bc066426564f0d6dcc2 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac8fb5d16ecdd6ffb21f0cb5e0aa3775e inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac8fb5d16ecdd6ffb21f0cb5e0aa3775e"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getLry</b> () const </td></tr>
+<tr class="separator:ac8fb5d16ecdd6ffb21f0cb5e0aa3775e inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3f5882d5b3544bf5fcd353705d24d1a6 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3f5882d5b3544bf5fcd353705d24d1a6"></a>
+int </td><td class="memItemRight" valign="bottom"><b>getNoDataValues</b> (std::vector< double > &noDataValues) const </td></tr>
+<tr class="separator:a3f5882d5b3544bf5fcd353705d24d1a6 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a17693949c5bbd2fed20f0289dd62ff1e inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a17693949c5bbd2fed20f0289dd62ff1e"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>isNoData</b> (double value) const </td></tr>
+<tr class="separator:a17693949c5bbd2fed20f0289dd62ff1e inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa8c6781d58167b8c64618a0bb070889d inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa8c6781d58167b8c64618a0bb070889d"></a>
+int </td><td class="memItemRight" valign="bottom"><b>pushNoDataValue</b> (double noDataValue)</td></tr>
+<tr class="separator:aa8c6781d58167b8c64618a0bb070889d inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0c029d2179aec1f96dbcd3e403fa3bed inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0c029d2179aec1f96dbcd3e403fa3bed"></a>
+int </td><td class="memItemRight" valign="bottom"><b>setNoData</b> (const std::vector< double > nodata)</td></tr>
+<tr class="separator:a0c029d2179aec1f96dbcd3e403fa3bed inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab29f4dc977529bd5b12ee8a82a6ba325 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab29f4dc977529bd5b12ee8a82a6ba325"></a>
+CPLErr </td><td class="memItemRight" valign="bottom"><b>GDALSetNoDataValue</b> (double noDataValue, int band=0)</td></tr>
+<tr class="separator:ab29f4dc977529bd5b12ee8a82a6ba325 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab3bf668fc2bbfc75cffb31be86782e3e inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab3bf668fc2bbfc75cffb31be86782e3e"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double x, double y) const </td></tr>
+<tr class="separator:ab3bf668fc2bbfc75cffb31be86782e3e inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2b9c235dac00eb642c7fb357900bb4ea inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2b9c235dac00eb642c7fb357900bb4ea"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double ulx, double uly, double lrx, double lry) const </td></tr>
+<tr class="separator:a2b9c235dac00eb642c7fb357900bb4ea inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa5adb11c20fc7544b864a57cf1dfae72 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa5adb11c20fc7544b864a57cf1dfae72"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>geo2image</b> (double x, double y, double &i, double &j) const </td></tr>
+<tr class="separator:aa5adb11c20fc7544b864a57cf1dfae72 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab401949cc9faf0d8dbfca300b50d3812 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab401949cc9faf0d8dbfca300b50d3812"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>image2geo</b> (double i, double j, double &x, double &y) const </td></tr>
+<tr class="separator:ab401949cc9faf0d8dbfca300b50d3812 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a07442232ef794eaa96cf0f96538c3a76 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a07442232ef794eaa96cf0f96538c3a76"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getDeltaX</b> (void) const </td></tr>
+<tr class="separator:a07442232ef794eaa96cf0f96538c3a76 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a43746347238dadb4e18dffd77c0aecd8 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a43746347238dadb4e18dffd77c0aecd8"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getDeltaY</b> (void) const </td></tr>
+<tr class="separator:a43746347238dadb4e18dffd77c0aecd8 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a82a8664dd3281cbd6cb710116f9fce38 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a82a8664dd3281cbd6cb710116f9fce38"></a>
 GDALDataType </td><td class="memItemRight" valign="bottom"><b>getDataType</b> (int band=0) const </td></tr>
-<tr class="separator:a5591c9e50736c1553ec94a1254a290a6"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a3166cf2a6639b2a36f6830c9f8c37b6a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3166cf2a6639b2a36f6830c9f8c37b6a"></a>
+<tr class="separator:a82a8664dd3281cbd6cb710116f9fce38 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a355771835d7a0c941d3a42e76dd0f4ae inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a355771835d7a0c941d3a42e76dd0f4ae"></a>
 GDALRasterBand * </td><td class="memItemRight" valign="bottom"><b>getRasterBand</b> (int band=0)</td></tr>
-<tr class="separator:a3166cf2a6639b2a36f6830c9f8c37b6a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a0bfe81609a710a9d47947838cf5af8b9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0bfe81609a710a9d47947838cf5af8b9"></a>
+<tr class="separator:a355771835d7a0c941d3a42e76dd0f4ae inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a24ded5779fef37794008f519a6638f63 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a24ded5779fef37794008f519a6638f63"></a>
 GDALColorTable * </td><td class="memItemRight" valign="bottom"><b>getColorTable</b> (int band=0) const </td></tr>
-<tr class="separator:a0bfe81609a710a9d47947838cf5af8b9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a853ffedadc2fcc0efb303c149a45907b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a853ffedadc2fcc0efb303c149a45907b"></a>
+<tr class="separator:a24ded5779fef37794008f519a6638f63 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a069d7a03c4c4cbb311534b1e061a59c9 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a069d7a03c4c4cbb311534b1e061a59c9"></a>
 std::string </td><td class="memItemRight" valign="bottom"><b>getDriverDescription</b> () const </td></tr>
-<tr class="separator:a853ffedadc2fcc0efb303c149a45907b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac0108fc8cddf5522e4e6ca27c9d62240"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac0108fc8cddf5522e4e6ca27c9d62240"></a>
+<tr class="separator:a069d7a03c4c4cbb311534b1e061a59c9 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab84afa6974996363f4f004c9e8ed6c9a inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab84afa6974996363f4f004c9e8ed6c9a"></a>
 std::string </td><td class="memItemRight" valign="bottom"><b>getImageType</b> () const </td></tr>
-<tr class="separator:ac0108fc8cddf5522e4e6ca27c9d62240"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af1c51175ac5eb0e815411a5c875f0b1d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af1c51175ac5eb0e815411a5c875f0b1d"></a>
+<tr class="separator:ab84afa6974996363f4f004c9e8ed6c9a inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac648aeea3051b17663c1666bfb7b9ba2 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac648aeea3051b17663c1666bfb7b9ba2"></a>
 std::string </td><td class="memItemRight" valign="bottom"><b>getInterleave</b> () const </td></tr>
-<tr class="separator:af1c51175ac5eb0e815411a5c875f0b1d"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a9ed77fcfd0d7787eb5c6046c72289855"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9ed77fcfd0d7787eb5c6046c72289855"></a>
+<tr class="separator:ac648aeea3051b17663c1666bfb7b9ba2 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3d6931927354087f333f68f5d70197c8 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3d6931927354087f333f68f5d70197c8"></a>
 std::string </td><td class="memItemRight" valign="bottom"><b>getCompression</b> () const </td></tr>
-<tr class="separator:a9ed77fcfd0d7787eb5c6046c72289855"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7d8821df9c42d24811c8e21d2bba4340"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7d8821df9c42d24811c8e21d2bba4340"></a>
+<tr class="separator:a3d6931927354087f333f68f5d70197c8 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a129dff26f65af24f6d006dae9f43dbba inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a129dff26f65af24f6d006dae9f43dbba"></a>
 GDALDataset * </td><td class="memItemRight" valign="bottom"><b>getDataset</b> ()</td></tr>
-<tr class="separator:a7d8821df9c42d24811c8e21d2bba4340"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac97f73469d27ec904e73fb597eb163e6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac97f73469d27ec904e73fb597eb163e6"></a>
+<tr class="separator:a129dff26f65af24f6d006dae9f43dbba inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a412899cba08baf1a1630951afffdc6dd inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a412899cba08baf1a1630951afffdc6dd"></a>
 char ** </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> ()</td></tr>
-<tr class="separator:ac97f73469d27ec904e73fb597eb163e6"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aed2782ce8510531de43550701cfc6bb2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aed2782ce8510531de43550701cfc6bb2"></a>
+<tr class="separator:a412899cba08baf1a1630951afffdc6dd inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a43f9dfcb1724e88c86f7bb1f0a5fe236 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a43f9dfcb1724e88c86f7bb1f0a5fe236"></a>
 char ** </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> () const </td></tr>
-<tr class="separator:aed2782ce8510531de43550701cfc6bb2"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a59750d918c65b91b43e0d5f93379750d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a59750d918c65b91b43e0d5f93379750d"></a>
+<tr class="separator:a43f9dfcb1724e88c86f7bb1f0a5fe236 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0c1a1664962b9ccd05ed9bcf7a118011 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0c1a1664962b9ccd05ed9bcf7a118011"></a>
 void </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> (std::list< std::string > &metadata) const </td></tr>
-<tr class="separator:a59750d918c65b91b43e0d5f93379750d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a0c1a1664962b9ccd05ed9bcf7a118011 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab599dad8573f2ac24302fdb339b1005a inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab599dad8573f2ac24302fdb339b1005a"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getDescription</b> () const </td></tr>
+<tr class="separator:ab599dad8573f2ac24302fdb339b1005a inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a592538d7aeb7622acb20cc3d81ed1dcc inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a592538d7aeb7622acb20cc3d81ed1dcc"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getMetadataItem</b> () const </td></tr>
+<tr class="separator:a592538d7aeb7622acb20cc3d81ed1dcc inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a057a5b1bc4bd5bc391962f154b2bb747 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a057a5b1bc4bd5bc391962f154b2bb747"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getImageDescription</b> () const </td></tr>
+<tr class="separator:a057a5b1bc4bd5bc391962f154b2bb747 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
 Protected Member Functions</h2></td></tr>
-<tr class="memitem:a45bc57f58e04a49044a307b6a0480207"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a45bc57f58e04a49044a307b6a0480207"></a>
-void </td><td class="memItemRight" valign="bottom"><b>setCodec</b> ()</td></tr>
-<tr class="separator:a45bc57f58e04a49044a307b6a0480207"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0ef3ab9026b7370331af948828b0f0a7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0ef3ab9026b7370331af948828b0f0a7"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setCodec</b> (const GDALAccess &readMode=GA_ReadOnly)</td></tr>
+<tr class="separator:a0ef3ab9026b7370331af948828b0f0a7"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-attribs"></a>
 Protected Attributes</h2></td></tr>
-<tr class="memitem:a66e3da5cf14ee01d98f718da08ca3951"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a66e3da5cf14ee01d98f718da08ca3951"></a>
+<tr class="memitem:a7f327201ee3ee410786afb86109c66c2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7f327201ee3ee410786afb86109c66c2"></a>
+std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_scale</b></td></tr>
+<tr class="separator:a7f327201ee3ee410786afb86109c66c2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa7d02f9e74d645875c68486fd1cfee9f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa7d02f9e74d645875c68486fd1cfee9f"></a>
+std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_offset</b></td></tr>
+<tr class="separator:aa7d02f9e74d645875c68486fd1cfee9f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="inherit_header pro_attribs_classImgRasterGdal"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classImgRasterGdal')"><img src="closed.png" alt="-"/> Protected Attributes inherited from <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td></tr>
+<tr class="memitem:a3257f4db7418fde0a0d3caf2a1d179a1 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3257f4db7418fde0a0d3caf2a1d179a1"></a>
 std::string </td><td class="memItemRight" valign="bottom"><b>m_filename</b></td></tr>
-<tr class="separator:a66e3da5cf14ee01d98f718da08ca3951"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a804e326105d65f5b39e49f174192d9e0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a804e326105d65f5b39e49f174192d9e0"></a>
+<tr class="separator:a3257f4db7418fde0a0d3caf2a1d179a1 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a49ef42e3d2cde64af9cfc00646b28f3b inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a49ef42e3d2cde64af9cfc00646b28f3b"></a>
 GDALDataset * </td><td class="memItemRight" valign="bottom"><b>m_gds</b></td></tr>
-<tr class="separator:a804e326105d65f5b39e49f174192d9e0"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:afa4e58b4fb0835f8dc2cec13e614c8af"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afa4e58b4fb0835f8dc2cec13e614c8af"></a>
+<tr class="separator:a49ef42e3d2cde64af9cfc00646b28f3b inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a28f5fd5bdcd3e50ddd5f1b68ad8d31d7 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a28f5fd5bdcd3e50ddd5f1b68ad8d31d7"></a>
 int </td><td class="memItemRight" valign="bottom"><b>m_ncol</b></td></tr>
-<tr class="separator:afa4e58b4fb0835f8dc2cec13e614c8af"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a395ceefd4ca79cf2db23eba1628d975b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a395ceefd4ca79cf2db23eba1628d975b"></a>
+<tr class="separator:a28f5fd5bdcd3e50ddd5f1b68ad8d31d7 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a78b8a391b58e4268da9b4c88e7ecf962 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a78b8a391b58e4268da9b4c88e7ecf962"></a>
 int </td><td class="memItemRight" valign="bottom"><b>m_nrow</b></td></tr>
-<tr class="separator:a395ceefd4ca79cf2db23eba1628d975b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a854b58f7be9f49b51b530f890b5b1ee6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a854b58f7be9f49b51b530f890b5b1ee6"></a>
+<tr class="separator:a78b8a391b58e4268da9b4c88e7ecf962 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a208157846765615d4495a73bada30740 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a208157846765615d4495a73bada30740"></a>
 int </td><td class="memItemRight" valign="bottom"><b>m_nband</b></td></tr>
-<tr class="separator:a854b58f7be9f49b51b530f890b5b1ee6"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:adbf44f5365ca329ddbc435ec303a7bea"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adbf44f5365ca329ddbc435ec303a7bea"></a>
+<tr class="separator:a208157846765615d4495a73bada30740 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ade28d4208d3a77f112aa6a190b9e38f6 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ade28d4208d3a77f112aa6a190b9e38f6"></a>
 double </td><td class="memItemRight" valign="bottom"><b>m_gt</b> [6]</td></tr>
-<tr class="separator:adbf44f5365ca329ddbc435ec303a7bea"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:abccf0d1e621a857e436feb83cb05c301"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="abccf0d1e621a857e436feb83cb05c301"></a>
+<tr class="separator:ade28d4208d3a77f112aa6a190b9e38f6 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9154b4b3d6ef24dd1d922b3caab9b295 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9154b4b3d6ef24dd1d922b3caab9b295"></a>
 std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_noDataValues</b></td></tr>
-<tr class="separator:abccf0d1e621a857e436feb83cb05c301"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7f327201ee3ee410786afb86109c66c2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7f327201ee3ee410786afb86109c66c2"></a>
-std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_scale</b></td></tr>
-<tr class="separator:a7f327201ee3ee410786afb86109c66c2"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa7d02f9e74d645875c68486fd1cfee9f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa7d02f9e74d645875c68486fd1cfee9f"></a>
-std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_offset</b></td></tr>
-<tr class="separator:aa7d02f9e74d645875c68486fd1cfee9f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a9154b4b3d6ef24dd1d922b3caab9b295 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="ImgReaderGdal_8h_source.html#l00033">33</a> of file <a class="el" href="ImgReaderGdal_8h_source.html">ImgReaderGdal.h</a>.</p>
+<p>Definition at line <a class="el" href="ImgReaderGdal_8h_source.html#l00032">32</a> of file <a class="el" href="ImgReaderGdal_8h_source.html">ImgReaderGdal.h</a>.</p>
 </div><hr/>The documentation for this class was generated from the following files:<ul>
 <li>/home/kempenep/pktools/src/imageclasses/<a class="el" href="ImgReaderGdal_8h_source.html">ImgReaderGdal.h</a></li>
 <li>/home/kempenep/pktools/src/imageclasses/<a class="el" href="ImgReaderGdal_8cc_source.html">ImgReaderGdal.cc</a></li>
@@ -301,7 +310,7 @@ std::vector< double > </td><td class="memItemRight" valign="bottom"><
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgReaderGdal__coll__graph.map b/doc/html/classImgReaderGdal__coll__graph.map
index 3bddeb4..d891e9d 100644
--- a/doc/html/classImgReaderGdal__coll__graph.map
+++ b/doc/html/classImgReaderGdal__coll__graph.map
@@ -1,4 +1,5 @@
 <map id="ImgReaderGdal" name="ImgReaderGdal">
-<area shape="rect" id="node2" title="STL class. " alt="" coords="28,99,107,125"/>
-<area shape="rect" id="node3" title="STL class. " alt="" coords="5,6,131,47"/>
+<area shape="rect" id="node2" href="$classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="115,191,225,217"/>
+<area shape="rect" id="node3" title="STL class. " alt="" coords="28,99,107,125"/>
+<area shape="rect" id="node4" title="STL class. " alt="" coords="5,6,131,47"/>
 </map>
diff --git a/doc/html/classImgReaderGdal__coll__graph.md5 b/doc/html/classImgReaderGdal__coll__graph.md5
index 2aca7b9..9e29f48 100644
--- a/doc/html/classImgReaderGdal__coll__graph.md5
+++ b/doc/html/classImgReaderGdal__coll__graph.md5
@@ -1 +1 @@
-39c12e7ae08720121b34733ddc358801
\ No newline at end of file
+f678d91443c884ac22b260f318d6676b
\ No newline at end of file
diff --git a/doc/html/classImgReaderGdal__coll__graph.png b/doc/html/classImgReaderGdal__coll__graph.png
index 567a5ee..243510e 100644
Binary files a/doc/html/classImgReaderGdal__coll__graph.png and b/doc/html/classImgReaderGdal__coll__graph.png differ
diff --git a/doc/html/classImgReaderGdal__inherit__graph.map b/doc/html/classImgReaderGdal__inherit__graph.map
new file mode 100644
index 0000000..85c37ba
--- /dev/null
+++ b/doc/html/classImgReaderGdal__inherit__graph.map
@@ -0,0 +1,4 @@
+<map id="ImgReaderGdal" name="ImgReaderGdal">
+<area shape="rect" id="node3" href="$classImgUpdaterGdal.html" title="ImgUpdaterGdal" alt="" coords="4,155,120,181"/>
+<area shape="rect" id="node2" href="$classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="7,5,117,32"/>
+</map>
diff --git a/doc/html/classImgReaderGdal__inherit__graph.md5 b/doc/html/classImgReaderGdal__inherit__graph.md5
new file mode 100644
index 0000000..4ef7d9c
--- /dev/null
+++ b/doc/html/classImgReaderGdal__inherit__graph.md5
@@ -0,0 +1 @@
+9e99f02914c34ccf4dabd913c84e35b4
\ No newline at end of file
diff --git a/doc/html/classImgReaderGdal__inherit__graph.png b/doc/html/classImgReaderGdal__inherit__graph.png
new file mode 100644
index 0000000..c060a0c
Binary files /dev/null and b/doc/html/classImgReaderGdal__inherit__graph.png differ
diff --git a/doc/html/classImgReaderOgr-members.html b/doc/html/classImgReaderOgr-members.html
index 8995329..d052c46 100644
--- a/doc/html/classImgReaderOgr-members.html
+++ b/doc/html/classImgReaderOgr-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -95,7 +95,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgReaderOgr.html b/doc/html/classImgReaderOgr.html
index 2b40cb3..59f85f7 100644
--- a/doc/html/classImgReaderOgr.html
+++ b/doc/html/classImgReaderOgr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -203,7 +203,7 @@ std::ostream & </td><td class="memItemRight" valign="bottom"><b>operato
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgUpdaterGdal-members.html b/doc/html/classImgUpdaterGdal-members.html
new file mode 100644
index 0000000..a798287
--- /dev/null
+++ b/doc/html/classImgUpdaterGdal-members.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.6</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">ImgUpdaterGdal Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>close</b>(void) (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>close</b>(void) (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>copyGeoTransform</b>(const ImgReaderGdal &imgSrc) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>covers</b>(double x, double y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>covers</b>(double ulx, double uly, double lrx, double lry) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>GDALSetNoDataValue</b>(double noDataValue, int band=0) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>geo2image</b>(double x, double y, double &i, double &j) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getBoundingBox</b>(double &ulx, double &uly, double &lrx, double &lry) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getCenterPos</b>(double &x, double &y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getColorTable</b>(int band=0) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getCompression</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDataset</b>() (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDataType</b>(int band=0) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDeltaX</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDeltaY</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDriverDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getFileName</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getGeoTransform</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getGeoTransform</b>(double *gt) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getHistogram</b>(std::vector< double > &histvector, double &min, double &max, unsigned int &nbin, int theBand=0, bool kde=false) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getImageDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getImageType</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getInterleave</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getLrx</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getLry</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMax</b>(int &col, int &row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMetadata</b>() (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMetadata</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMetadata</b>(std::list< std::string > &metadata) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMetadataItem</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMin</b>(int &col, int &row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMinMax</b>(int startCol, int endCol, int startRow, int endRow, int band, double &minValue, double &maxValue) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMinMax</b>(double &minValue, double &maxValue, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getNoDataValues</b>(std::vector< double > &noDataValues) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getNvalid</b>(int band) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getProjection</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getProjectionRef</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getRange</b>(std::vector< short > &range, int Band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getRasterBand</b>(int band=0) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getRefPix</b>(double &refX, double &refY, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getUlx</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getUly</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>image2geo</b>(double i, double j, double &x, double &y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ImgRasterGdal</b>(void) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>ImgReaderGdal</b>(void) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ImgReaderGdal</b>(const std::string &filename, const GDALAccess &readMode=GA_ReadOnly) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>ImgUpdaterGdal</b>(void) (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ImgUpdaterGdal</b>(const std::string &filename) (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>ImgUpdaterGdal</b>(void) (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ImgUpdaterGdal</b>(const std::string &filename, const GDALAccess &readMode=GA_Update) (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>ImgWriterGdal</b>(void) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>isGeoRef</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>isNoData</b>(double value) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_filename</b> (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_gds</b> (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_gt</b> (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_nband</b> (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_ncol</b> (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_noDataValues</b> (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_nrow</b> (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_offset</b> (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_options</b> (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_scale</b> (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nrOfBand</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>nrOfCol</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nrOfRow</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>open</b>(const std::string &filename) (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>open</b>(const std::string &filename, const GDALAccess &readMode=GA_Update) (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>open</b>(const std::string &filename, const ImgReaderGdal &imgSrc, const std::vector< std::string > &options=std::vector< std::string >()) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>open</b>(const std::string &filename, int ncol, int nrow, int nband, const GDALDataType &dataType, const std::string &imageType, const std::vector< std::string > &options=std::vector< std::string >()) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>pushNoDataValue</b>(double noDataValue) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>rasterizeOgr</b>(ImgReaderOgr &ogrReader, const std::vector< double > &burnValues=std::vector< double >(), const std::vector< std::string > &layernames=std::vector< std::string >()) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>readData</b>(T &value, const GDALDataType &dataType, int col, int row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, double row, int band=0, RESAMPLE resample=NEAR) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int row, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>readData</b>(std::vector< T > &buffer, const GDALDataType &dataType, double row, int band=0, RESAMPLE resample=NEAR) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readDataBlock</b>(Vector2d< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>readDataBlock</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const  (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setCodec</b>() (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setCodec</b>(const GDALAccess &readMode=GA_ReadOnly) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setCodec</b>(const GDALDataType &dataType, const std::string &imageType) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setCodec</b>(const ImgReaderGdal &ImgSrc) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setColorTable</b>(const std::string &filename, int band=0) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setColorTable</b>(GDALColorTable *colorTable, int band=0) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setGeoTransform</b>(double *gt) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setImageDescription</b>(const std::string &imageDescription) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setMetadata</b>(char **metadata) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setNoData</b>(const std::vector< double > nodata) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setOffset</b>(double theOffset, int band=0) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setProjection</b>(const std::string &projection) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setProjectionProj4</b>(const std::string &projection) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setScale</b>(double theScale, int band=0) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>writeData</b>(T &value, const GDALDataType &dataType, int col, int row, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>writeData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int row, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>writeData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int row, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>writeData</b>(void *pdata, const GDALDataType &dataType, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>writeDataBlock</b>(Vector2d< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>~ImgRasterGdal</b>(void) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>~ImgReaderGdal</b>(void) (defined in <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>)</td><td class="entry"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>~ImgUpdaterGdal</b>(void) (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>~ImgUpdaterGdal</b>(void) (defined in <a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>)</td><td class="entry"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>~ImgWriterGdal</b>(void) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classImgUpdaterGdal.html b/doc/html/classImgUpdaterGdal.html
new file mode 100644
index 0000000..3c2591e
--- /dev/null
+++ b/doc/html/classImgUpdaterGdal.html
@@ -0,0 +1,445 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: ImgUpdaterGdal Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.6</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pro-methods">Protected Member Functions</a> |
+<a href="#pro-attribs">Protected Attributes</a> |
+<a href="classImgUpdaterGdal-members.html">List of all members</a>  </div>
+  <div class="headertitle">
+<div class="title">ImgUpdaterGdal Class Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for ImgUpdaterGdal:</div>
+<div class="dyncontent">
+<div class="center"><img src="classImgUpdaterGdal__inherit__graph.png" border="0" usemap="#ImgUpdaterGdal_inherit__map" alt="Inheritance graph"/></div>
+<map name="ImgUpdaterGdal_inherit__map" id="ImgUpdaterGdal_inherit__map">
+<area shape="rect" id="node2" href="classImgReaderGdal.html" title="ImgReaderGdal" alt="" coords="5,80,117,107"/><area shape="rect" id="node3" href="classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="73,5,183,32"/><area shape="rect" id="node4" href="classImgWriterGdal.html" title="ImgWriterGdal" alt="" coords="143,80,249,107"/></map>
+<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
+<div class="dynheader">
+Collaboration diagram for ImgUpdaterGdal:</div>
+<div class="dyncontent">
+<div class="center"><img src="classImgUpdaterGdal__coll__graph.png" border="0" usemap="#ImgUpdaterGdal_coll__map" alt="Collaboration graph"/></div>
+<map name="ImgUpdaterGdal_coll__map" id="ImgUpdaterGdal_coll__map">
+<area shape="rect" id="node2" href="classImgReaderGdal.html" title="ImgReaderGdal" alt="" coords="281,312,393,339"/><area shape="rect" id="node3" href="classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="214,191,324,217"/><area shape="rect" id="node7" href="classImgWriterGdal.html" title="ImgWriterGdal" alt="" coords="149,312,256,339"/><area shape="rect" id="node4" title="STL class. " alt="" coords="28,99,107,125"/><area shape="rect" id="node5" title="STL class. " alt="" coords [...]
+<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:abd42c2447fffb5554e2b517a1bf6eaf8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="abd42c2447fffb5554e2b517a1bf6eaf8"></a>
+ </td><td class="memItemRight" valign="bottom"><b>ImgUpdaterGdal</b> (const std::string &filename)</td></tr>
+<tr class="separator:abd42c2447fffb5554e2b517a1bf6eaf8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a460a250235ffece49986bcfb977a8af3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a460a250235ffece49986bcfb977a8af3"></a>
+void </td><td class="memItemRight" valign="bottom"><b>open</b> (const std::string &filename)</td></tr>
+<tr class="separator:a460a250235ffece49986bcfb977a8af3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa8a6458b1155efc61d2146b9144da83c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa8a6458b1155efc61d2146b9144da83c"></a>
+void </td><td class="memItemRight" valign="bottom"><b>close</b> (void)</td></tr>
+<tr class="separator:aa8a6458b1155efc61d2146b9144da83c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4a29103edf0aa5ee644498eb9ca572ba"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4a29103edf0aa5ee644498eb9ca572ba"></a>
+ </td><td class="memItemRight" valign="bottom"><b>ImgUpdaterGdal</b> (const std::string &filename, const GDALAccess &readMode=GA_Update)</td></tr>
+<tr class="separator:a4a29103edf0aa5ee644498eb9ca572ba"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8830491ea40f9217f1a19e5ef7ab7efc"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8830491ea40f9217f1a19e5ef7ab7efc"></a>
+void </td><td class="memItemRight" valign="bottom"><b>open</b> (const std::string &filename, const GDALAccess &readMode=GA_Update)</td></tr>
+<tr class="separator:a8830491ea40f9217f1a19e5ef7ab7efc"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa8a6458b1155efc61d2146b9144da83c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa8a6458b1155efc61d2146b9144da83c"></a>
+void </td><td class="memItemRight" valign="bottom"><b>close</b> (void)</td></tr>
+<tr class="separator:aa8a6458b1155efc61d2146b9144da83c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="inherit_header pub_methods_classImgReaderGdal"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classImgReaderGdal')"><img src="closed.png" alt="-"/> Public Member Functions inherited from <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td></tr>
+<tr class="memitem:ae716a3d2335a4ed5fed24d9c27a252a0 inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae716a3d2335a4ed5fed24d9c27a252a0"></a>
+ </td><td class="memItemRight" valign="bottom"><b>ImgReaderGdal</b> (const std::string &filename, const GDALAccess &readMode=GA_ReadOnly)</td></tr>
+<tr class="separator:ae716a3d2335a4ed5fed24d9c27a252a0 inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7f708e38ed0670d8f300ea323c3b7044 inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7f708e38ed0670d8f300ea323c3b7044"></a>
+void </td><td class="memItemRight" valign="bottom"><b>open</b> (const std::string &filename, const GDALAccess &readMode=GA_ReadOnly)</td></tr>
+<tr class="separator:a7f708e38ed0670d8f300ea323c3b7044 inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afac21441e51d39beb3ab5d282cd9f12e inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afac21441e51d39beb3ab5d282cd9f12e"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setScale</b> (double theScale, int band=0)</td></tr>
+<tr class="separator:afac21441e51d39beb3ab5d282cd9f12e inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a332975068d99166b81001a5c656022bf inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a332975068d99166b81001a5c656022bf"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setOffset</b> (double theOffset, int band=0)</td></tr>
+<tr class="separator:a332975068d99166b81001a5c656022bf inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aba4280eff30003c827bb2567a6bc3400 inherit pub_methods_classImgReaderGdal"><td class="memTemplParams" colspan="2"><a class="anchor" id="aba4280eff30003c827bb2567a6bc3400"></a>
+template<typename T > </td></tr>
+<tr class="memitem:aba4280eff30003c827bb2567a6bc3400 inherit pub_methods_classImgReaderGdal"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>readData</b> (T &value, const GDALDataType &dataType, int col, int row, int band=0) const </td></tr>
+<tr class="separator:aba4280eff30003c827bb2567a6bc3400 inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a682f256062b021ee5771346e2fda2d1d inherit pub_methods_classImgReaderGdal"><td class="memTemplParams" colspan="2"><a class="anchor" id="a682f256062b021ee5771346e2fda2d1d"></a>
+template<typename T > </td></tr>
+<tr class="memitem:a682f256062b021ee5771346e2fda2d1d inherit pub_methods_classImgReaderGdal"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>readData</b> (std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int row, int band=0) const </td></tr>
+<tr class="separator:a682f256062b021ee5771346e2fda2d1d inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a349279f8b3511dada0faa9924fbcabbb inherit pub_methods_classImgReaderGdal"><td class="memTemplParams" colspan="2"><a class="anchor" id="a349279f8b3511dada0faa9924fbcabbb"></a>
+template<typename T > </td></tr>
+<tr class="memitem:a349279f8b3511dada0faa9924fbcabbb inherit pub_methods_classImgReaderGdal"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>readData</b> (std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, double row, int band=0, RESAMPLE resample=NEAR) const </td></tr>
+<tr class="separator:a349279f8b3511dada0faa9924fbcabbb inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae7a60c67b86a4355af5a59c1e66be9cd inherit pub_methods_classImgReaderGdal"><td class="memTemplParams" colspan="2"><a class="anchor" id="ae7a60c67b86a4355af5a59c1e66be9cd"></a>
+template<typename T > </td></tr>
+<tr class="memitem:ae7a60c67b86a4355af5a59c1e66be9cd inherit pub_methods_classImgReaderGdal"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>readDataBlock</b> (<a class="el" href="classVector2d.html">Vector2d</a>< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const </td></tr>
+<tr class="separator:ae7a60c67b86a4355af5a59c1e66be9cd inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3d95ea1de4434d7a5051c9f03aaac884 inherit pub_methods_classImgReaderGdal"><td class="memTemplParams" colspan="2"><a class="anchor" id="a3d95ea1de4434d7a5051c9f03aaac884"></a>
+template<typename T > </td></tr>
+<tr class="memitem:a3d95ea1de4434d7a5051c9f03aaac884 inherit pub_methods_classImgReaderGdal"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>readDataBlock</b> (std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const </td></tr>
+<tr class="separator:a3d95ea1de4434d7a5051c9f03aaac884 inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7ac0d1bc28c4fd320c22f18ef602455c inherit pub_methods_classImgReaderGdal"><td class="memTemplParams" colspan="2"><a class="anchor" id="a7ac0d1bc28c4fd320c22f18ef602455c"></a>
+template<typename T > </td></tr>
+<tr class="memitem:a7ac0d1bc28c4fd320c22f18ef602455c inherit pub_methods_classImgReaderGdal"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>readData</b> (std::vector< T > &buffer, const GDALDataType &dataType, int row, int band=0) const </td></tr>
+<tr class="separator:a7ac0d1bc28c4fd320c22f18ef602455c inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aad577cce450bb39b8ff7507bc0d86651 inherit pub_methods_classImgReaderGdal"><td class="memTemplParams" colspan="2"><a class="anchor" id="aad577cce450bb39b8ff7507bc0d86651"></a>
+template<typename T > </td></tr>
+<tr class="memitem:aad577cce450bb39b8ff7507bc0d86651 inherit pub_methods_classImgReaderGdal"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>readData</b> (std::vector< T > &buffer, const GDALDataType &dataType, double row, int band=0, RESAMPLE resample=NEAR) const </td></tr>
+<tr class="separator:aad577cce450bb39b8ff7507bc0d86651 inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a591b1f2f78eacc0fd0d772e24996c6b9 inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a591b1f2f78eacc0fd0d772e24996c6b9"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getMinMax</b> (int startCol, int endCol, int startRow, int endRow, int band, double &minValue, double &maxValue) const </td></tr>
+<tr class="separator:a591b1f2f78eacc0fd0d772e24996c6b9 inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a933dc688de9cc87eeae20530412a82d9 inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a933dc688de9cc87eeae20530412a82d9"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getMinMax</b> (double &minValue, double &maxValue, int band=0) const </td></tr>
+<tr class="separator:a933dc688de9cc87eeae20530412a82d9 inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a40a36fbaa00190aa5a758ec034369d3d inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a40a36fbaa00190aa5a758ec034369d3d"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getMin</b> (int &col, int &row, int band=0) const </td></tr>
+<tr class="separator:a40a36fbaa00190aa5a758ec034369d3d inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa4c5fb8c1132c2a52d97681d9f272387 inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa4c5fb8c1132c2a52d97681d9f272387"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getHistogram</b> (std::vector< double > &histvector, double &min, double &max, unsigned int &nbin, int theBand=0, bool kde=false)</td></tr>
+<tr class="separator:aa4c5fb8c1132c2a52d97681d9f272387 inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a44ca88cd5917979f184bb14f9c7f6eed inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a44ca88cd5917979f184bb14f9c7f6eed"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getMax</b> (int &col, int &row, int band=0) const </td></tr>
+<tr class="separator:a44ca88cd5917979f184bb14f9c7f6eed inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4ded019b9c6ef1b13feef6b9a08d92ab inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4ded019b9c6ef1b13feef6b9a08d92ab"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getRefPix</b> (double &refX, double &refY, int band=0) const </td></tr>
+<tr class="separator:a4ded019b9c6ef1b13feef6b9a08d92ab inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a906d020847b442de59059c99c8ec7cfb inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a906d020847b442de59059c99c8ec7cfb"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getRange</b> (std::vector< short > &range, int Band=0) const </td></tr>
+<tr class="separator:a906d020847b442de59059c99c8ec7cfb inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a864413c529506b8753c450e5316a814b inherit pub_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a864413c529506b8753c450e5316a814b"></a>
+unsigned long int </td><td class="memItemRight" valign="bottom"><b>getNvalid</b> (int band) const </td></tr>
+<tr class="separator:a864413c529506b8753c450e5316a814b inherit pub_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="inherit_header pub_methods_classImgRasterGdal"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classImgRasterGdal')"><img src="closed.png" alt="-"/> Public Member Functions inherited from <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td></tr>
+<tr class="memitem:a4f5933f910448127c56479957cb97fd7 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4f5933f910448127c56479957cb97fd7"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getFileName</b> () const </td></tr>
+<tr class="separator:a4f5933f910448127c56479957cb97fd7 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1d03f1b73f8ca8efd9961da7450ed709 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1d03f1b73f8ca8efd9961da7450ed709"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfCol</b> (void) const </td></tr>
+<tr class="separator:a1d03f1b73f8ca8efd9961da7450ed709 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8faa9b6f13e729ae113c09549ebdae11 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8faa9b6f13e729ae113c09549ebdae11"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfRow</b> (void) const </td></tr>
+<tr class="separator:a8faa9b6f13e729ae113c09549ebdae11 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a11ed4fea3a57a37a622853dbbe5451b4 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a11ed4fea3a57a37a622853dbbe5451b4"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfBand</b> (void) const </td></tr>
+<tr class="separator:a11ed4fea3a57a37a622853dbbe5451b4 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab06ab3cd707396a4c587119e2e644946 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab06ab3cd707396a4c587119e2e644946"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>isGeoRef</b> () const </td></tr>
+<tr class="separator:ab06ab3cd707396a4c587119e2e644946 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aff912cb70261b8e466386fd48e44edb0 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aff912cb70261b8e466386fd48e44edb0"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getProjection</b> (void) const </td></tr>
+<tr class="separator:aff912cb70261b8e466386fd48e44edb0 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a29cfeaaff15425671904d03b92494e2f inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a29cfeaaff15425671904d03b92494e2f"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getProjectionRef</b> (void) const </td></tr>
+<tr class="separator:a29cfeaaff15425671904d03b92494e2f inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7bc9c3b0c68a33aee68d79b26b2b38c5 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7bc9c3b0c68a33aee68d79b26b2b38c5"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> () const </td></tr>
+<tr class="separator:a7bc9c3b0c68a33aee68d79b26b2b38c5 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac95256e22afd8e841deb4eb62716d169 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac95256e22afd8e841deb4eb62716d169"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> (double *gt) const </td></tr>
+<tr class="separator:ac95256e22afd8e841deb4eb62716d169 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad529323a7b1470f88fcb76aebd1ae799 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad529323a7b1470f88fcb76aebd1ae799"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>getBoundingBox</b> (double &ulx, double &uly, double &lrx, double &lry) const </td></tr>
+<tr class="separator:ad529323a7b1470f88fcb76aebd1ae799 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1e618ae325f433cd0ecd84252b4abee0 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1e618ae325f433cd0ecd84252b4abee0"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>getCenterPos</b> (double &x, double &y) const </td></tr>
+<tr class="separator:a1e618ae325f433cd0ecd84252b4abee0 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a89aca8db1d2e0a7a6ab005ba3c71a2da inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a89aca8db1d2e0a7a6ab005ba3c71a2da"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getUlx</b> () const </td></tr>
+<tr class="separator:a89aca8db1d2e0a7a6ab005ba3c71a2da inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab4e5ec5a64ecc151445417eeecdab859 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab4e5ec5a64ecc151445417eeecdab859"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getUly</b> () const </td></tr>
+<tr class="separator:ab4e5ec5a64ecc151445417eeecdab859 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad354468d74356bc066426564f0d6dcc2 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad354468d74356bc066426564f0d6dcc2"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getLrx</b> () const </td></tr>
+<tr class="separator:ad354468d74356bc066426564f0d6dcc2 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac8fb5d16ecdd6ffb21f0cb5e0aa3775e inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac8fb5d16ecdd6ffb21f0cb5e0aa3775e"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getLry</b> () const </td></tr>
+<tr class="separator:ac8fb5d16ecdd6ffb21f0cb5e0aa3775e inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3f5882d5b3544bf5fcd353705d24d1a6 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3f5882d5b3544bf5fcd353705d24d1a6"></a>
+int </td><td class="memItemRight" valign="bottom"><b>getNoDataValues</b> (std::vector< double > &noDataValues) const </td></tr>
+<tr class="separator:a3f5882d5b3544bf5fcd353705d24d1a6 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a17693949c5bbd2fed20f0289dd62ff1e inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a17693949c5bbd2fed20f0289dd62ff1e"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>isNoData</b> (double value) const </td></tr>
+<tr class="separator:a17693949c5bbd2fed20f0289dd62ff1e inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa8c6781d58167b8c64618a0bb070889d inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa8c6781d58167b8c64618a0bb070889d"></a>
+int </td><td class="memItemRight" valign="bottom"><b>pushNoDataValue</b> (double noDataValue)</td></tr>
+<tr class="separator:aa8c6781d58167b8c64618a0bb070889d inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0c029d2179aec1f96dbcd3e403fa3bed inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0c029d2179aec1f96dbcd3e403fa3bed"></a>
+int </td><td class="memItemRight" valign="bottom"><b>setNoData</b> (const std::vector< double > nodata)</td></tr>
+<tr class="separator:a0c029d2179aec1f96dbcd3e403fa3bed inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab29f4dc977529bd5b12ee8a82a6ba325 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab29f4dc977529bd5b12ee8a82a6ba325"></a>
+CPLErr </td><td class="memItemRight" valign="bottom"><b>GDALSetNoDataValue</b> (double noDataValue, int band=0)</td></tr>
+<tr class="separator:ab29f4dc977529bd5b12ee8a82a6ba325 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab3bf668fc2bbfc75cffb31be86782e3e inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab3bf668fc2bbfc75cffb31be86782e3e"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double x, double y) const </td></tr>
+<tr class="separator:ab3bf668fc2bbfc75cffb31be86782e3e inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2b9c235dac00eb642c7fb357900bb4ea inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2b9c235dac00eb642c7fb357900bb4ea"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double ulx, double uly, double lrx, double lry) const </td></tr>
+<tr class="separator:a2b9c235dac00eb642c7fb357900bb4ea inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa5adb11c20fc7544b864a57cf1dfae72 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa5adb11c20fc7544b864a57cf1dfae72"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>geo2image</b> (double x, double y, double &i, double &j) const </td></tr>
+<tr class="separator:aa5adb11c20fc7544b864a57cf1dfae72 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab401949cc9faf0d8dbfca300b50d3812 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab401949cc9faf0d8dbfca300b50d3812"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>image2geo</b> (double i, double j, double &x, double &y) const </td></tr>
+<tr class="separator:ab401949cc9faf0d8dbfca300b50d3812 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a07442232ef794eaa96cf0f96538c3a76 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a07442232ef794eaa96cf0f96538c3a76"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getDeltaX</b> (void) const </td></tr>
+<tr class="separator:a07442232ef794eaa96cf0f96538c3a76 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a43746347238dadb4e18dffd77c0aecd8 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a43746347238dadb4e18dffd77c0aecd8"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getDeltaY</b> (void) const </td></tr>
+<tr class="separator:a43746347238dadb4e18dffd77c0aecd8 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a82a8664dd3281cbd6cb710116f9fce38 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a82a8664dd3281cbd6cb710116f9fce38"></a>
+GDALDataType </td><td class="memItemRight" valign="bottom"><b>getDataType</b> (int band=0) const </td></tr>
+<tr class="separator:a82a8664dd3281cbd6cb710116f9fce38 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a355771835d7a0c941d3a42e76dd0f4ae inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a355771835d7a0c941d3a42e76dd0f4ae"></a>
+GDALRasterBand * </td><td class="memItemRight" valign="bottom"><b>getRasterBand</b> (int band=0)</td></tr>
+<tr class="separator:a355771835d7a0c941d3a42e76dd0f4ae inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a24ded5779fef37794008f519a6638f63 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a24ded5779fef37794008f519a6638f63"></a>
+GDALColorTable * </td><td class="memItemRight" valign="bottom"><b>getColorTable</b> (int band=0) const </td></tr>
+<tr class="separator:a24ded5779fef37794008f519a6638f63 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a069d7a03c4c4cbb311534b1e061a59c9 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a069d7a03c4c4cbb311534b1e061a59c9"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getDriverDescription</b> () const </td></tr>
+<tr class="separator:a069d7a03c4c4cbb311534b1e061a59c9 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab84afa6974996363f4f004c9e8ed6c9a inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab84afa6974996363f4f004c9e8ed6c9a"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getImageType</b> () const </td></tr>
+<tr class="separator:ab84afa6974996363f4f004c9e8ed6c9a inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac648aeea3051b17663c1666bfb7b9ba2 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac648aeea3051b17663c1666bfb7b9ba2"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getInterleave</b> () const </td></tr>
+<tr class="separator:ac648aeea3051b17663c1666bfb7b9ba2 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3d6931927354087f333f68f5d70197c8 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3d6931927354087f333f68f5d70197c8"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getCompression</b> () const </td></tr>
+<tr class="separator:a3d6931927354087f333f68f5d70197c8 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a129dff26f65af24f6d006dae9f43dbba inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a129dff26f65af24f6d006dae9f43dbba"></a>
+GDALDataset * </td><td class="memItemRight" valign="bottom"><b>getDataset</b> ()</td></tr>
+<tr class="separator:a129dff26f65af24f6d006dae9f43dbba inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a412899cba08baf1a1630951afffdc6dd inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a412899cba08baf1a1630951afffdc6dd"></a>
+char ** </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> ()</td></tr>
+<tr class="separator:a412899cba08baf1a1630951afffdc6dd inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a43f9dfcb1724e88c86f7bb1f0a5fe236 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a43f9dfcb1724e88c86f7bb1f0a5fe236"></a>
+char ** </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> () const </td></tr>
+<tr class="separator:a43f9dfcb1724e88c86f7bb1f0a5fe236 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0c1a1664962b9ccd05ed9bcf7a118011 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0c1a1664962b9ccd05ed9bcf7a118011"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> (std::list< std::string > &metadata) const </td></tr>
+<tr class="separator:a0c1a1664962b9ccd05ed9bcf7a118011 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab599dad8573f2ac24302fdb339b1005a inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab599dad8573f2ac24302fdb339b1005a"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getDescription</b> () const </td></tr>
+<tr class="separator:ab599dad8573f2ac24302fdb339b1005a inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a592538d7aeb7622acb20cc3d81ed1dcc inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a592538d7aeb7622acb20cc3d81ed1dcc"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getMetadataItem</b> () const </td></tr>
+<tr class="separator:a592538d7aeb7622acb20cc3d81ed1dcc inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a057a5b1bc4bd5bc391962f154b2bb747 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a057a5b1bc4bd5bc391962f154b2bb747"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getImageDescription</b> () const </td></tr>
+<tr class="separator:a057a5b1bc4bd5bc391962f154b2bb747 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="inherit_header pub_methods_classImgWriterGdal"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classImgWriterGdal')"><img src="closed.png" alt="-"/> Public Member Functions inherited from <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td></tr>
+<tr class="memitem:a39eece0dfdf9f748d5a3efb14c04b223 inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a39eece0dfdf9f748d5a3efb14c04b223"></a>
+void </td><td class="memItemRight" valign="bottom"><b>open</b> (const std::string &filename)</td></tr>
+<tr class="separator:a39eece0dfdf9f748d5a3efb14c04b223 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5e3f6d15a12434de5003133b5a1dce46 inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5e3f6d15a12434de5003133b5a1dce46"></a>
+void </td><td class="memItemRight" valign="bottom"><b>open</b> (const std::string &filename, const <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a> &imgSrc, const std::vector< std::string > &options=std::vector< std::string >())</td></tr>
+<tr class="separator:a5e3f6d15a12434de5003133b5a1dce46 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a42163b49a345a54dd53bc7cfbe2cdf41 inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a42163b49a345a54dd53bc7cfbe2cdf41"></a>
+void </td><td class="memItemRight" valign="bottom"><b>open</b> (const std::string &filename, int ncol, int nrow, int nband, const GDALDataType &dataType, const std::string &imageType, const std::vector< std::string > &options=std::vector< std::string >())</td></tr>
+<tr class="separator:a42163b49a345a54dd53bc7cfbe2cdf41 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a29f36d8b5c6f004a0b44413bc593a06c inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a29f36d8b5c6f004a0b44413bc593a06c"></a>
+void </td><td class="memItemRight" valign="bottom"><b>close</b> (void)</td></tr>
+<tr class="separator:a29f36d8b5c6f004a0b44413bc593a06c inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aaf54fe7f5fc54e17f235e6c20d788ed9 inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aaf54fe7f5fc54e17f235e6c20d788ed9"></a>
+void </td><td class="memItemRight" valign="bottom"><b>copyGeoTransform</b> (const <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a> &imgSrc)</td></tr>
+<tr class="separator:aaf54fe7f5fc54e17f235e6c20d788ed9 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:accdb98bddf68438d9e4716a70899c00b inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="accdb98bddf68438d9e4716a70899c00b"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setProjection</b> (const std::string &projection)</td></tr>
+<tr class="separator:accdb98bddf68438d9e4716a70899c00b inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a46aaabf3510de2a613d20246d6dc8074 inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a46aaabf3510de2a613d20246d6dc8074"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>setProjectionProj4</b> (const std::string &projection)</td></tr>
+<tr class="separator:a46aaabf3510de2a613d20246d6dc8074 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac108a7ab4faddda5279766251da4e980 inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac108a7ab4faddda5279766251da4e980"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setImageDescription</b> (const std::string &imageDescription)</td></tr>
+<tr class="separator:ac108a7ab4faddda5279766251da4e980 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a614042cd8c0fea041c1de282e8c21ce5 inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a614042cd8c0fea041c1de282e8c21ce5"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setGeoTransform</b> (double *gt)</td></tr>
+<tr class="separator:a614042cd8c0fea041c1de282e8c21ce5 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a12acdd8869b7546d8d46041e8882ecbd inherit pub_methods_classImgWriterGdal"><td class="memTemplParams" colspan="2"><a class="anchor" id="a12acdd8869b7546d8d46041e8882ecbd"></a>
+template<typename T > </td></tr>
+<tr class="memitem:a12acdd8869b7546d8d46041e8882ecbd inherit pub_methods_classImgWriterGdal"><td class="memTemplItemLeft" align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>writeData</b> (T &value, const GDALDataType &dataType, int col, int row, int band=0) const </td></tr>
+<tr class="separator:a12acdd8869b7546d8d46041e8882ecbd inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:acb5f9887d42599250adab013843779f2 inherit pub_methods_classImgWriterGdal"><td class="memTemplParams" colspan="2"><a class="anchor" id="acb5f9887d42599250adab013843779f2"></a>
+template<typename T > </td></tr>
+<tr class="memitem:acb5f9887d42599250adab013843779f2 inherit pub_methods_classImgWriterGdal"><td class="memTemplItemLeft" align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>writeData</b> (std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int row, int band=0) const </td></tr>
+<tr class="separator:acb5f9887d42599250adab013843779f2 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa25cd22a4f6c8f5b6874e4181352a488 inherit pub_methods_classImgWriterGdal"><td class="memTemplParams" colspan="2"><a class="anchor" id="aa25cd22a4f6c8f5b6874e4181352a488"></a>
+template<typename T > </td></tr>
+<tr class="memitem:aa25cd22a4f6c8f5b6874e4181352a488 inherit pub_methods_classImgWriterGdal"><td class="memTemplItemLeft" align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>writeData</b> (std::vector< T > &buffer, const GDALDataType &dataType, int row, int band=0) const </td></tr>
+<tr class="separator:aa25cd22a4f6c8f5b6874e4181352a488 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a210a845c2a1c27c377f9b7ec3bfb5445 inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a210a845c2a1c27c377f9b7ec3bfb5445"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>writeData</b> (void *pdata, const GDALDataType &dataType, int band=0) const </td></tr>
+<tr class="separator:a210a845c2a1c27c377f9b7ec3bfb5445 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae87b86ecee4ef2de22aa6b8274f51bb4 inherit pub_methods_classImgWriterGdal"><td class="memTemplParams" colspan="2"><a class="anchor" id="ae87b86ecee4ef2de22aa6b8274f51bb4"></a>
+template<typename T > </td></tr>
+<tr class="memitem:ae87b86ecee4ef2de22aa6b8274f51bb4 inherit pub_methods_classImgWriterGdal"><td class="memTemplItemLeft" align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>writeDataBlock</b> (<a class="el" href="classVector2d.html">Vector2d</a>< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const </td></tr>
+<tr class="separator:ae87b86ecee4ef2de22aa6b8274f51bb4 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aba7218154ec7485df3cc7b31d4fe1cbc inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aba7218154ec7485df3cc7b31d4fe1cbc"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setColorTable</b> (const std::string &filename, int band=0)</td></tr>
+<tr class="separator:aba7218154ec7485df3cc7b31d4fe1cbc inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a05696bec20682ef5f4087cde533ffaa1 inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a05696bec20682ef5f4087cde533ffaa1"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setColorTable</b> (GDALColorTable *colorTable, int band=0)</td></tr>
+<tr class="separator:a05696bec20682ef5f4087cde533ffaa1 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a35425fab3a863cb624d674e67c8bf03c inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a35425fab3a863cb624d674e67c8bf03c"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setMetadata</b> (char **metadata)</td></tr>
+<tr class="separator:a35425fab3a863cb624d674e67c8bf03c inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a90e4fdd42f8fe95d11bc3627bb2bb949 inherit pub_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a90e4fdd42f8fe95d11bc3627bb2bb949"></a>
+void </td><td class="memItemRight" valign="bottom"><b>rasterizeOgr</b> (<a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a> &ogrReader, const std::vector< double > &burnValues=std::vector< double >(), const std::vector< std::string > &layernames=std::vector< std::string >())</td></tr>
+<tr class="separator:a90e4fdd42f8fe95d11bc3627bb2bb949 inherit pub_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a3e5cb4a9d676c79d1d0a17d271f23907"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3e5cb4a9d676c79d1d0a17d271f23907"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setCodec</b> ()</td></tr>
+<tr class="separator:a3e5cb4a9d676c79d1d0a17d271f23907"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="inherit_header pro_methods_classImgReaderGdal"><td colspan="2" onclick="javascript:toggleInherit('pro_methods_classImgReaderGdal')"><img src="closed.png" alt="-"/> Protected Member Functions inherited from <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td></tr>
+<tr class="memitem:a0ef3ab9026b7370331af948828b0f0a7 inherit pro_methods_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0ef3ab9026b7370331af948828b0f0a7"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setCodec</b> (const GDALAccess &readMode=GA_ReadOnly)</td></tr>
+<tr class="separator:a0ef3ab9026b7370331af948828b0f0a7 inherit pro_methods_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="inherit_header pro_methods_classImgWriterGdal"><td colspan="2" onclick="javascript:toggleInherit('pro_methods_classImgWriterGdal')"><img src="closed.png" alt="-"/> Protected Member Functions inherited from <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td></tr>
+<tr class="memitem:ad00e7ae82d5f2342159e5c62b4637bf8 inherit pro_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad00e7ae82d5f2342159e5c62b4637bf8"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setCodec</b> (const GDALDataType &dataType, const std::string &imageType)</td></tr>
+<tr class="separator:ad00e7ae82d5f2342159e5c62b4637bf8 inherit pro_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1d084ba67f72031fa75047434ec74779 inherit pro_methods_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1d084ba67f72031fa75047434ec74779"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setCodec</b> (const <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a> &ImgSrc)</td></tr>
+<tr class="separator:a1d084ba67f72031fa75047434ec74779 inherit pro_methods_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-attribs"></a>
+Protected Attributes</h2></td></tr>
+<tr class="memitem:a12fa76efae1b9b17f0fe5b16ddff4d89"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a12fa76efae1b9b17f0fe5b16ddff4d89"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>m_filename</b></td></tr>
+<tr class="separator:a12fa76efae1b9b17f0fe5b16ddff4d89"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:adb5df748efeb5f1b099633d2af632019"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adb5df748efeb5f1b099633d2af632019"></a>
+GDALDataset * </td><td class="memItemRight" valign="bottom"><b>m_gds</b></td></tr>
+<tr class="separator:adb5df748efeb5f1b099633d2af632019"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af78cf491ddb61aeb0ae22c7827347623"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af78cf491ddb61aeb0ae22c7827347623"></a>
+int </td><td class="memItemRight" valign="bottom"><b>m_ncol</b></td></tr>
+<tr class="separator:af78cf491ddb61aeb0ae22c7827347623"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0bd3202698706f83afcab960ca5a0eae"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0bd3202698706f83afcab960ca5a0eae"></a>
+int </td><td class="memItemRight" valign="bottom"><b>m_nrow</b></td></tr>
+<tr class="separator:a0bd3202698706f83afcab960ca5a0eae"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1b8b977b3144e8933117710e902f016f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1b8b977b3144e8933117710e902f016f"></a>
+int </td><td class="memItemRight" valign="bottom"><b>m_nband</b></td></tr>
+<tr class="separator:a1b8b977b3144e8933117710e902f016f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4703839469438f1887141ba55cc45ed1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4703839469438f1887141ba55cc45ed1"></a>
+double </td><td class="memItemRight" valign="bottom"><b>m_gt</b> [6]</td></tr>
+<tr class="separator:a4703839469438f1887141ba55cc45ed1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab3f08a5710afddc0c4cbadbbb09f52ad"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab3f08a5710afddc0c4cbadbbb09f52ad"></a>
+std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_noDataValues</b></td></tr>
+<tr class="separator:ab3f08a5710afddc0c4cbadbbb09f52ad"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:abd5b43c31006cb2ea38ddc07b468a290"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="abd5b43c31006cb2ea38ddc07b468a290"></a>
+std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_scale</b></td></tr>
+<tr class="separator:abd5b43c31006cb2ea38ddc07b468a290"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a870ed8e2315de2b08a83645d1e5878a2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a870ed8e2315de2b08a83645d1e5878a2"></a>
+std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_offset</b></td></tr>
+<tr class="separator:a870ed8e2315de2b08a83645d1e5878a2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="inherit_header pro_attribs_classImgReaderGdal"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classImgReaderGdal')"><img src="closed.png" alt="-"/> Protected Attributes inherited from <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a></td></tr>
+<tr class="memitem:a7f327201ee3ee410786afb86109c66c2 inherit pro_attribs_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7f327201ee3ee410786afb86109c66c2"></a>
+std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_scale</b></td></tr>
+<tr class="separator:a7f327201ee3ee410786afb86109c66c2 inherit pro_attribs_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa7d02f9e74d645875c68486fd1cfee9f inherit pro_attribs_classImgReaderGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa7d02f9e74d645875c68486fd1cfee9f"></a>
+std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_offset</b></td></tr>
+<tr class="separator:aa7d02f9e74d645875c68486fd1cfee9f inherit pro_attribs_classImgReaderGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="inherit_header pro_attribs_classImgRasterGdal"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classImgRasterGdal')"><img src="closed.png" alt="-"/> Protected Attributes inherited from <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td></tr>
+<tr class="memitem:a3257f4db7418fde0a0d3caf2a1d179a1 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3257f4db7418fde0a0d3caf2a1d179a1"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>m_filename</b></td></tr>
+<tr class="separator:a3257f4db7418fde0a0d3caf2a1d179a1 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a49ef42e3d2cde64af9cfc00646b28f3b inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a49ef42e3d2cde64af9cfc00646b28f3b"></a>
+GDALDataset * </td><td class="memItemRight" valign="bottom"><b>m_gds</b></td></tr>
+<tr class="separator:a49ef42e3d2cde64af9cfc00646b28f3b inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a28f5fd5bdcd3e50ddd5f1b68ad8d31d7 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a28f5fd5bdcd3e50ddd5f1b68ad8d31d7"></a>
+int </td><td class="memItemRight" valign="bottom"><b>m_ncol</b></td></tr>
+<tr class="separator:a28f5fd5bdcd3e50ddd5f1b68ad8d31d7 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a78b8a391b58e4268da9b4c88e7ecf962 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a78b8a391b58e4268da9b4c88e7ecf962"></a>
+int </td><td class="memItemRight" valign="bottom"><b>m_nrow</b></td></tr>
+<tr class="separator:a78b8a391b58e4268da9b4c88e7ecf962 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a208157846765615d4495a73bada30740 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a208157846765615d4495a73bada30740"></a>
+int </td><td class="memItemRight" valign="bottom"><b>m_nband</b></td></tr>
+<tr class="separator:a208157846765615d4495a73bada30740 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ade28d4208d3a77f112aa6a190b9e38f6 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ade28d4208d3a77f112aa6a190b9e38f6"></a>
+double </td><td class="memItemRight" valign="bottom"><b>m_gt</b> [6]</td></tr>
+<tr class="separator:ade28d4208d3a77f112aa6a190b9e38f6 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9154b4b3d6ef24dd1d922b3caab9b295 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9154b4b3d6ef24dd1d922b3caab9b295"></a>
+std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_noDataValues</b></td></tr>
+<tr class="separator:a9154b4b3d6ef24dd1d922b3caab9b295 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="inherit_header pro_attribs_classImgWriterGdal"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classImgWriterGdal')"><img src="closed.png" alt="-"/> Protected Attributes inherited from <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td></tr>
+<tr class="memitem:a74dd6523b3f607f31e2f35baf45bfbd8 inherit pro_attribs_classImgWriterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a74dd6523b3f607f31e2f35baf45bfbd8"></a>
+std::vector< std::string > </td><td class="memItemRight" valign="bottom"><b>m_options</b></td></tr>
+<tr class="separator:a74dd6523b3f607f31e2f35baf45bfbd8 inherit pro_attribs_classImgWriterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock">
+<p>Definition at line <a class="el" href="ImgGdal_8h_source.html#l00027">27</a> of file <a class="el" href="ImgGdal_8h_source.html">ImgGdal.h</a>.</p>
+</div><hr/>The documentation for this class was generated from the following files:<ul>
+<li>/home/kempenep/pktools/src/imageclasses/<a class="el" href="ImgGdal_8h_source.html">ImgGdal.h</a></li>
+<li>/home/kempenep/pktools/src/imageclasses/<a class="el" href="ImgUpdaterGdal_8h_source.html">ImgUpdaterGdal.h</a></li>
+<li>/home/kempenep/pktools/src/imageclasses/<a class="el" href="ImgUpdaterGdal_8cc_source.html">ImgUpdaterGdal.cc</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classImgUpdaterGdal__coll__graph.map b/doc/html/classImgUpdaterGdal__coll__graph.map
new file mode 100644
index 0000000..4a73674
--- /dev/null
+++ b/doc/html/classImgUpdaterGdal__coll__graph.map
@@ -0,0 +1,7 @@
+<map id="ImgUpdaterGdal" name="ImgUpdaterGdal">
+<area shape="rect" id="node2" href="$classImgReaderGdal.html" title="ImgReaderGdal" alt="" coords="281,312,393,339"/>
+<area shape="rect" id="node3" href="$classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="214,191,324,217"/>
+<area shape="rect" id="node7" href="$classImgWriterGdal.html" title="ImgWriterGdal" alt="" coords="149,312,256,339"/>
+<area shape="rect" id="node4" title="STL class. " alt="" coords="28,99,107,125"/>
+<area shape="rect" id="node5" title="STL class. " alt="" coords="5,6,131,47"/>
+</map>
diff --git a/doc/html/classImgUpdaterGdal__coll__graph.md5 b/doc/html/classImgUpdaterGdal__coll__graph.md5
new file mode 100644
index 0000000..a92bc20
--- /dev/null
+++ b/doc/html/classImgUpdaterGdal__coll__graph.md5
@@ -0,0 +1 @@
+c1ebade9b892249e50230e039cf1bb54
\ No newline at end of file
diff --git a/doc/html/classImgUpdaterGdal__coll__graph.png b/doc/html/classImgUpdaterGdal__coll__graph.png
new file mode 100644
index 0000000..042c06d
Binary files /dev/null and b/doc/html/classImgUpdaterGdal__coll__graph.png differ
diff --git a/doc/html/classImgUpdaterGdal__inherit__graph.map b/doc/html/classImgUpdaterGdal__inherit__graph.map
new file mode 100644
index 0000000..b6e445a
--- /dev/null
+++ b/doc/html/classImgUpdaterGdal__inherit__graph.map
@@ -0,0 +1,5 @@
+<map id="ImgUpdaterGdal" name="ImgUpdaterGdal">
+<area shape="rect" id="node2" href="$classImgReaderGdal.html" title="ImgReaderGdal" alt="" coords="5,80,117,107"/>
+<area shape="rect" id="node3" href="$classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="73,5,183,32"/>
+<area shape="rect" id="node4" href="$classImgWriterGdal.html" title="ImgWriterGdal" alt="" coords="143,80,249,107"/>
+</map>
diff --git a/doc/html/classImgUpdaterGdal__inherit__graph.md5 b/doc/html/classImgUpdaterGdal__inherit__graph.md5
new file mode 100644
index 0000000..ad6e702
--- /dev/null
+++ b/doc/html/classImgUpdaterGdal__inherit__graph.md5
@@ -0,0 +1 @@
+e80808390a870cde7c6e4ea4da955ab3
\ No newline at end of file
diff --git a/doc/html/classImgUpdaterGdal__inherit__graph.png b/doc/html/classImgUpdaterGdal__inherit__graph.png
new file mode 100644
index 0000000..430104d
Binary files /dev/null and b/doc/html/classImgUpdaterGdal__inherit__graph.png differ
diff --git a/doc/html/classImgWriterGdal-members.html b/doc/html/classImgWriterGdal-members.html
index 2c029b9..269a0a4 100644
--- a/doc/html/classImgWriterGdal-members.html
+++ b/doc/html/classImgWriterGdal-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -54,61 +54,83 @@
 
 <p>This is the complete list of members for <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>, including all inherited members.</p>
 <table class="directory">
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>close</b>(void) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>close</b>(void) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>copyGeoTransform</b>(const ImgReaderGdal &imgSrc) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>covers</b>(double x, double y) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>covers</b>(double ulx, double uly, double lrx, double lry) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>GDALSetNoDataValue</b>(double noDataValue, int band=0) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>geo2image</b>(double x, double y, double &i, double &j) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getBoundingBox</b>(double &ulx, double &uly, double &lrx, double &lry) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getCentrePos</b>(double &x, double &y) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDataType</b>(int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDeltaX</b>(void) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDeltaY</b>(void) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getFileName</b>() const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getGeoTransform</b>() const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getGeoTransform</b>(double *gt) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getProjection</b>(void) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getRasterBand</b>(int band) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>image2geo</b>(double i, double j, double &x, double &y) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>ImgWriterGdal</b>(void) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>isGeoRef</b>() const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_filename</b> (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_gds</b> (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_gt</b> (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_nband</b> (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_ncol</b> (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_nrow</b> (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_options</b> (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_type</b> (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>nrOfBand</b>(void) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nrOfCol</b>(void) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>nrOfRow</b>(void) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>covers</b>(double x, double y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>covers</b>(double ulx, double uly, double lrx, double lry) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>GDALSetNoDataValue</b>(double noDataValue, int band=0) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>geo2image</b>(double x, double y, double &i, double &j) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getBoundingBox</b>(double &ulx, double &uly, double &lrx, double &lry) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getCenterPos</b>(double &x, double &y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getColorTable</b>(int band=0) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getCompression</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDataset</b>() (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDataType</b>(int band=0) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDeltaX</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDeltaY</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDriverDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getFileName</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getGeoTransform</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getGeoTransform</b>(double *gt) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getImageDescription</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getImageType</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getInterleave</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getLrx</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getLry</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMetadata</b>() (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMetadata</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMetadata</b>(std::list< std::string > &metadata) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getMetadataItem</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getNoDataValues</b>(std::vector< double > &noDataValues) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getProjection</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getProjectionRef</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getRasterBand</b>(int band=0) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getUlx</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getUly</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>image2geo</b>(double i, double j, double &x, double &y) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>ImgRasterGdal</b>(void) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ImgWriterGdal</b>(void) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>isGeoRef</b>() const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>isNoData</b>(double value) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_filename</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_gds</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_gt</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_nband</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_ncol</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_noDataValues</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>m_nrow</b> (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>m_options</b> (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>nrOfBand</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nrOfCol</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>nrOfRow</b>(void) const  (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>open</b>(const std::string &filename) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>open</b>(const std::string &filename, const ImgReaderGdal &imgSrc, const std::vector< std::string > &options=std::vector< std::string >()) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>open</b>(const std::string &filename, int ncol, int nrow, int nband, const GDALDataType &dataType, const std::string &imageType, const std::vector< std::string > &options=std::vector< std::string >()) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>rasterizeOgr</b>(ImgReaderOgr &ogrReader, const std::vector< double > &burnValues=std::vector< double >(), const std::vector< std::string > &layernames=std::vector< std::string >()) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setCodec</b>(const std::string &imageType) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setCodec</b>(const ImgReaderGdal &ImgSrc) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setColorTable</b>(const std::string &filename, int band=0) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setColorTable</b>(GDALColorTable *colorTable, int band=0) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setGeoTransform</b>(double *gt) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setImageDescription</b>(const std::string &imageDescription) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setMetadata</b>(char **metadata) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setProjection</b>(void) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setProjection</b>(const std::string &projection) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setProjectionProj4</b>(const std::string &projection) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>writeData</b>(T &value, const GDALDataType &dataType, int col, int row, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>writeData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int row, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>writeData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int row, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>writeData</b>(void *pdata, const GDALDataType &dataType, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>writeDataBlock</b>(Vector2d< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>pushNoDataValue</b>(double noDataValue) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>rasterizeOgr</b>(ImgReaderOgr &ogrReader, const std::vector< double > &burnValues=std::vector< double >(), const std::vector< std::string > &layernames=std::vector< std::string >()) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setCodec</b>(const GDALDataType &dataType, const std::string &imageType) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setCodec</b>(const ImgReaderGdal &ImgSrc) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setColorTable</b>(const std::string &filename, int band=0) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setColorTable</b>(GDALColorTable *colorTable, int band=0) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setGeoTransform</b>(double *gt) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setImageDescription</b>(const std::string &imageDescription) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setMetadata</b>(char **metadata) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setNoData</b>(const std::vector< double > nodata) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setProjection</b>(const std::string &projection) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setProjectionProj4</b>(const std::string &projection) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>writeData</b>(T &value, const GDALDataType &dataType, int col, int row, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>writeData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int row, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>writeData</b>(std::vector< T > &buffer, const GDALDataType &dataType, int row, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>writeData</b>(void *pdata, const GDALDataType &dataType, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>writeDataBlock</b>(Vector2d< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const  (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>~ImgRasterGdal</b>(void) (defined in <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>)</td><td class="entry"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>~ImgWriterGdal</b>(void) (defined in <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>)</td><td class="entry"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a></td><td class="entry"></td></tr>
 </table></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgWriterGdal.html b/doc/html/classImgWriterGdal.html
index e064dfc..416f63e 100644
--- a/doc/html/classImgWriterGdal.html
+++ b/doc/html/classImgWriterGdal.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -57,11 +57,18 @@
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
+Inheritance diagram for ImgWriterGdal:</div>
+<div class="dyncontent">
+<div class="center"><img src="classImgWriterGdal__inherit__graph.png" border="0" usemap="#ImgWriterGdal_inherit__map" alt="Inheritance graph"/></div>
+<map name="ImgWriterGdal_inherit__map" id="ImgWriterGdal_inherit__map">
+<area shape="rect" id="node3" href="classImgUpdaterGdal.html" title="ImgUpdaterGdal" alt="" coords="4,155,120,181"/><area shape="rect" id="node2" href="classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="7,5,117,32"/></map>
+<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
+<div class="dynheader">
 Collaboration diagram for ImgWriterGdal:</div>
 <div class="dyncontent">
 <div class="center"><img src="classImgWriterGdal__coll__graph.png" border="0" usemap="#ImgWriterGdal_coll__map" alt="Collaboration graph"/></div>
 <map name="ImgWriterGdal_coll__map" id="ImgWriterGdal_coll__map">
-<area shape="rect" id="node2" title="STL class. " alt="" coords="28,99,107,125"/><area shape="rect" id="node3" title="STL class. " alt="" coords="5,6,131,47"/></map>
+<area shape="rect" id="node2" href="classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="195,189,305,216"/><area shape="rect" id="node3" title="STL class. " alt="" coords="75,99,153,125"/><area shape="rect" id="node4" title="STL class. " alt="" coords="51,6,177,47"/></map>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
@@ -78,24 +85,9 @@ void </td><td class="memItemRight" valign="bottom"><b>open</b> (const std::
 <tr class="memitem:a29f36d8b5c6f004a0b44413bc593a06c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a29f36d8b5c6f004a0b44413bc593a06c"></a>
 void </td><td class="memItemRight" valign="bottom"><b>close</b> (void)</td></tr>
 <tr class="separator:a29f36d8b5c6f004a0b44413bc593a06c"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a04c38f64c8de2fa7a6da0fd887673f65"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a04c38f64c8de2fa7a6da0fd887673f65"></a>
-std::string </td><td class="memItemRight" valign="bottom"><b>getFileName</b> () const </td></tr>
-<tr class="separator:a04c38f64c8de2fa7a6da0fd887673f65"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad908cd57791a94ae78c1bdacabee851b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad908cd57791a94ae78c1bdacabee851b"></a>
-int </td><td class="memItemRight" valign="bottom"><b>nrOfCol</b> (void) const </td></tr>
-<tr class="separator:ad908cd57791a94ae78c1bdacabee851b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a539b5cb2947010ec7d9d79aff685a6f8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a539b5cb2947010ec7d9d79aff685a6f8"></a>
-int </td><td class="memItemRight" valign="bottom"><b>nrOfRow</b> (void) const </td></tr>
-<tr class="separator:a539b5cb2947010ec7d9d79aff685a6f8"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a272a18a1ac026e8fc39f25518cc1640e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a272a18a1ac026e8fc39f25518cc1640e"></a>
-int </td><td class="memItemRight" valign="bottom"><b>nrOfBand</b> (void) const </td></tr>
-<tr class="separator:a272a18a1ac026e8fc39f25518cc1640e"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:aaf54fe7f5fc54e17f235e6c20d788ed9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aaf54fe7f5fc54e17f235e6c20d788ed9"></a>
 void </td><td class="memItemRight" valign="bottom"><b>copyGeoTransform</b> (const <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a> &imgSrc)</td></tr>
 <tr class="separator:aaf54fe7f5fc54e17f235e6c20d788ed9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a5cfa4c560e8f6e9bc443b3b482d1a10f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5cfa4c560e8f6e9bc443b3b482d1a10f"></a>
-std::string </td><td class="memItemRight" valign="bottom"><b>setProjection</b> (void)</td></tr>
-<tr class="separator:a5cfa4c560e8f6e9bc443b3b482d1a10f"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:accdb98bddf68438d9e4716a70899c00b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="accdb98bddf68438d9e4716a70899c00b"></a>
 void </td><td class="memItemRight" valign="bottom"><b>setProjection</b> (const std::string &projection)</td></tr>
 <tr class="separator:accdb98bddf68438d9e4716a70899c00b"><td class="memSeparator" colspan="2"> </td></tr>
@@ -105,48 +97,9 @@ std::string </td><td class="memItemRight" valign="bottom"><b>setProjectionP
 <tr class="memitem:ac108a7ab4faddda5279766251da4e980"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac108a7ab4faddda5279766251da4e980"></a>
 void </td><td class="memItemRight" valign="bottom"><b>setImageDescription</b> (const std::string &imageDescription)</td></tr>
 <tr class="separator:ac108a7ab4faddda5279766251da4e980"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab002f6e5275cbaa097e7160d370fc7b9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab002f6e5275cbaa097e7160d370fc7b9"></a>
-CPLErr </td><td class="memItemRight" valign="bottom"><b>GDALSetNoDataValue</b> (double noDataValue, int band=0)</td></tr>
-<tr class="separator:ab002f6e5275cbaa097e7160d370fc7b9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a119b7442988bd347eef4295aa7d5cac8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a119b7442988bd347eef4295aa7d5cac8"></a>
-std::string </td><td class="memItemRight" valign="bottom"><b>getProjection</b> (void) const </td></tr>
-<tr class="separator:a119b7442988bd347eef4295aa7d5cac8"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:acc12b112024ebd66c54e6961ccc60a01"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="acc12b112024ebd66c54e6961ccc60a01"></a>
-std::string </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> () const </td></tr>
-<tr class="separator:acc12b112024ebd66c54e6961ccc60a01"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a81e8f22ab036874ad3e90f15004721d0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a81e8f22ab036874ad3e90f15004721d0"></a>
-void </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> (double *gt) const </td></tr>
-<tr class="separator:a81e8f22ab036874ad3e90f15004721d0"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a614042cd8c0fea041c1de282e8c21ce5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a614042cd8c0fea041c1de282e8c21ce5"></a>
 void </td><td class="memItemRight" valign="bottom"><b>setGeoTransform</b> (double *gt)</td></tr>
 <tr class="separator:a614042cd8c0fea041c1de282e8c21ce5"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a06dcbe1567048f78e5f348940ba5d268"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a06dcbe1567048f78e5f348940ba5d268"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>getBoundingBox</b> (double &ulx, double &uly, double &lrx, double &lry) const </td></tr>
-<tr class="separator:a06dcbe1567048f78e5f348940ba5d268"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a8483cfc78bb8123be6280a8b09d6aeaa"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8483cfc78bb8123be6280a8b09d6aeaa"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>getCentrePos</b> (double &x, double &y) const </td></tr>
-<tr class="separator:a8483cfc78bb8123be6280a8b09d6aeaa"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a9683458e2178d4f051d6f24574b96f22"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9683458e2178d4f051d6f24574b96f22"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double x, double y) const </td></tr>
-<tr class="separator:a9683458e2178d4f051d6f24574b96f22"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a4cedc098d1733ef61845728aab4f9c56"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4cedc098d1733ef61845728aab4f9c56"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double ulx, double uly, double lrx, double lry) const </td></tr>
-<tr class="separator:a4cedc098d1733ef61845728aab4f9c56"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a1b44bab59936afa323174f111ad6228b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1b44bab59936afa323174f111ad6228b"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>geo2image</b> (double x, double y, double &i, double &j) const </td></tr>
-<tr class="separator:a1b44bab59936afa323174f111ad6228b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a135f141747bba7e4451332e5747a8515"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a135f141747bba7e4451332e5747a8515"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>image2geo</b> (double i, double j, double &x, double &y) const </td></tr>
-<tr class="separator:a135f141747bba7e4451332e5747a8515"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aef51bf244050ae1e342bbf60450e4774"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aef51bf244050ae1e342bbf60450e4774"></a>
-bool </td><td class="memItemRight" valign="bottom"><b>isGeoRef</b> () const </td></tr>
-<tr class="separator:aef51bf244050ae1e342bbf60450e4774"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a498d8e8dc2c469df3487a1c4463aad35"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a498d8e8dc2c469df3487a1c4463aad35"></a>
-double </td><td class="memItemRight" valign="bottom"><b>getDeltaX</b> (void) const </td></tr>
-<tr class="separator:a498d8e8dc2c469df3487a1c4463aad35"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af3817ffd87cbe91326d12f6de0d1e6cd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af3817ffd87cbe91326d12f6de0d1e6cd"></a>
-double </td><td class="memItemRight" valign="bottom"><b>getDeltaY</b> (void) const </td></tr>
-<tr class="separator:af3817ffd87cbe91326d12f6de0d1e6cd"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a12acdd8869b7546d8d46041e8882ecbd"><td class="memTemplParams" colspan="2"><a class="anchor" id="a12acdd8869b7546d8d46041e8882ecbd"></a>
 template<typename T > </td></tr>
 <tr class="memitem:a12acdd8869b7546d8d46041e8882ecbd"><td class="memTemplItemLeft" align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>writeData</b> (T &value, const GDALDataType &dataType, int col, int row, int band=0) const </td></tr>
@@ -166,12 +119,6 @@ bool </td><td class="memItemRight" valign="bottom"><b>writeData</b> (void *
 template<typename T > </td></tr>
 <tr class="memitem:ae87b86ecee4ef2de22aa6b8274f51bb4"><td class="memTemplItemLeft" align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>writeDataBlock</b> (<a class="el" href="classVector2d.html">Vector2d</a>< T > &buffer, const GDALDataType &dataType, int minCol, int maxCol, int minRow, int maxRow, int band=0) const </td></tr>
 <tr class="separator:ae87b86ecee4ef2de22aa6b8274f51bb4"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aaa482e0fc4e1536044a2caced4b9bb87"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aaa482e0fc4e1536044a2caced4b9bb87"></a>
-GDALDataType </td><td class="memItemRight" valign="bottom"><b>getDataType</b> (int band=0) const </td></tr>
-<tr class="separator:aaa482e0fc4e1536044a2caced4b9bb87"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac14abc49a02247046f2d16ce2daf8c1c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac14abc49a02247046f2d16ce2daf8c1c"></a>
-GDALRasterBand * </td><td class="memItemRight" valign="bottom"><b>getRasterBand</b> (int band)</td></tr>
-<tr class="separator:ac14abc49a02247046f2d16ce2daf8c1c"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:aba7218154ec7485df3cc7b31d4fe1cbc"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aba7218154ec7485df3cc7b31d4fe1cbc"></a>
 void </td><td class="memItemRight" valign="bottom"><b>setColorTable</b> (const std::string &filename, int band=0)</td></tr>
 <tr class="separator:aba7218154ec7485df3cc7b31d4fe1cbc"><td class="memSeparator" colspan="2"> </td></tr>
@@ -184,46 +131,168 @@ void </td><td class="memItemRight" valign="bottom"><b>setMetadata</b> (char
 <tr class="memitem:a90e4fdd42f8fe95d11bc3627bb2bb949"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a90e4fdd42f8fe95d11bc3627bb2bb949"></a>
 void </td><td class="memItemRight" valign="bottom"><b>rasterizeOgr</b> (<a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a> &ogrReader, const std::vector< double > &burnValues=std::vector< double >(), const std::vector< std::string > &layernames=std::vector< std::string >())</td></tr>
 <tr class="separator:a90e4fdd42f8fe95d11bc3627bb2bb949"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="inherit_header pub_methods_classImgRasterGdal"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classImgRasterGdal')"><img src="closed.png" alt="-"/> Public Member Functions inherited from <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td></tr>
+<tr class="memitem:a4f5933f910448127c56479957cb97fd7 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4f5933f910448127c56479957cb97fd7"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getFileName</b> () const </td></tr>
+<tr class="separator:a4f5933f910448127c56479957cb97fd7 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1d03f1b73f8ca8efd9961da7450ed709 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1d03f1b73f8ca8efd9961da7450ed709"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfCol</b> (void) const </td></tr>
+<tr class="separator:a1d03f1b73f8ca8efd9961da7450ed709 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8faa9b6f13e729ae113c09549ebdae11 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8faa9b6f13e729ae113c09549ebdae11"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfRow</b> (void) const </td></tr>
+<tr class="separator:a8faa9b6f13e729ae113c09549ebdae11 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a11ed4fea3a57a37a622853dbbe5451b4 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a11ed4fea3a57a37a622853dbbe5451b4"></a>
+int </td><td class="memItemRight" valign="bottom"><b>nrOfBand</b> (void) const </td></tr>
+<tr class="separator:a11ed4fea3a57a37a622853dbbe5451b4 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab06ab3cd707396a4c587119e2e644946 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab06ab3cd707396a4c587119e2e644946"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>isGeoRef</b> () const </td></tr>
+<tr class="separator:ab06ab3cd707396a4c587119e2e644946 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aff912cb70261b8e466386fd48e44edb0 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aff912cb70261b8e466386fd48e44edb0"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getProjection</b> (void) const </td></tr>
+<tr class="separator:aff912cb70261b8e466386fd48e44edb0 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a29cfeaaff15425671904d03b92494e2f inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a29cfeaaff15425671904d03b92494e2f"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getProjectionRef</b> (void) const </td></tr>
+<tr class="separator:a29cfeaaff15425671904d03b92494e2f inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7bc9c3b0c68a33aee68d79b26b2b38c5 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7bc9c3b0c68a33aee68d79b26b2b38c5"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> () const </td></tr>
+<tr class="separator:a7bc9c3b0c68a33aee68d79b26b2b38c5 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac95256e22afd8e841deb4eb62716d169 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac95256e22afd8e841deb4eb62716d169"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getGeoTransform</b> (double *gt) const </td></tr>
+<tr class="separator:ac95256e22afd8e841deb4eb62716d169 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad529323a7b1470f88fcb76aebd1ae799 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad529323a7b1470f88fcb76aebd1ae799"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>getBoundingBox</b> (double &ulx, double &uly, double &lrx, double &lry) const </td></tr>
+<tr class="separator:ad529323a7b1470f88fcb76aebd1ae799 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1e618ae325f433cd0ecd84252b4abee0 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1e618ae325f433cd0ecd84252b4abee0"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>getCenterPos</b> (double &x, double &y) const </td></tr>
+<tr class="separator:a1e618ae325f433cd0ecd84252b4abee0 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a89aca8db1d2e0a7a6ab005ba3c71a2da inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a89aca8db1d2e0a7a6ab005ba3c71a2da"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getUlx</b> () const </td></tr>
+<tr class="separator:a89aca8db1d2e0a7a6ab005ba3c71a2da inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab4e5ec5a64ecc151445417eeecdab859 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab4e5ec5a64ecc151445417eeecdab859"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getUly</b> () const </td></tr>
+<tr class="separator:ab4e5ec5a64ecc151445417eeecdab859 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad354468d74356bc066426564f0d6dcc2 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad354468d74356bc066426564f0d6dcc2"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getLrx</b> () const </td></tr>
+<tr class="separator:ad354468d74356bc066426564f0d6dcc2 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac8fb5d16ecdd6ffb21f0cb5e0aa3775e inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac8fb5d16ecdd6ffb21f0cb5e0aa3775e"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getLry</b> () const </td></tr>
+<tr class="separator:ac8fb5d16ecdd6ffb21f0cb5e0aa3775e inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3f5882d5b3544bf5fcd353705d24d1a6 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3f5882d5b3544bf5fcd353705d24d1a6"></a>
+int </td><td class="memItemRight" valign="bottom"><b>getNoDataValues</b> (std::vector< double > &noDataValues) const </td></tr>
+<tr class="separator:a3f5882d5b3544bf5fcd353705d24d1a6 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a17693949c5bbd2fed20f0289dd62ff1e inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a17693949c5bbd2fed20f0289dd62ff1e"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>isNoData</b> (double value) const </td></tr>
+<tr class="separator:a17693949c5bbd2fed20f0289dd62ff1e inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa8c6781d58167b8c64618a0bb070889d inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa8c6781d58167b8c64618a0bb070889d"></a>
+int </td><td class="memItemRight" valign="bottom"><b>pushNoDataValue</b> (double noDataValue)</td></tr>
+<tr class="separator:aa8c6781d58167b8c64618a0bb070889d inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0c029d2179aec1f96dbcd3e403fa3bed inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0c029d2179aec1f96dbcd3e403fa3bed"></a>
+int </td><td class="memItemRight" valign="bottom"><b>setNoData</b> (const std::vector< double > nodata)</td></tr>
+<tr class="separator:a0c029d2179aec1f96dbcd3e403fa3bed inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab29f4dc977529bd5b12ee8a82a6ba325 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab29f4dc977529bd5b12ee8a82a6ba325"></a>
+CPLErr </td><td class="memItemRight" valign="bottom"><b>GDALSetNoDataValue</b> (double noDataValue, int band=0)</td></tr>
+<tr class="separator:ab29f4dc977529bd5b12ee8a82a6ba325 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab3bf668fc2bbfc75cffb31be86782e3e inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab3bf668fc2bbfc75cffb31be86782e3e"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double x, double y) const </td></tr>
+<tr class="separator:ab3bf668fc2bbfc75cffb31be86782e3e inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2b9c235dac00eb642c7fb357900bb4ea inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2b9c235dac00eb642c7fb357900bb4ea"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>covers</b> (double ulx, double uly, double lrx, double lry) const </td></tr>
+<tr class="separator:a2b9c235dac00eb642c7fb357900bb4ea inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa5adb11c20fc7544b864a57cf1dfae72 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa5adb11c20fc7544b864a57cf1dfae72"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>geo2image</b> (double x, double y, double &i, double &j) const </td></tr>
+<tr class="separator:aa5adb11c20fc7544b864a57cf1dfae72 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab401949cc9faf0d8dbfca300b50d3812 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab401949cc9faf0d8dbfca300b50d3812"></a>
+bool </td><td class="memItemRight" valign="bottom"><b>image2geo</b> (double i, double j, double &x, double &y) const </td></tr>
+<tr class="separator:ab401949cc9faf0d8dbfca300b50d3812 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a07442232ef794eaa96cf0f96538c3a76 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a07442232ef794eaa96cf0f96538c3a76"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getDeltaX</b> (void) const </td></tr>
+<tr class="separator:a07442232ef794eaa96cf0f96538c3a76 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a43746347238dadb4e18dffd77c0aecd8 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a43746347238dadb4e18dffd77c0aecd8"></a>
+double </td><td class="memItemRight" valign="bottom"><b>getDeltaY</b> (void) const </td></tr>
+<tr class="separator:a43746347238dadb4e18dffd77c0aecd8 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a82a8664dd3281cbd6cb710116f9fce38 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a82a8664dd3281cbd6cb710116f9fce38"></a>
+GDALDataType </td><td class="memItemRight" valign="bottom"><b>getDataType</b> (int band=0) const </td></tr>
+<tr class="separator:a82a8664dd3281cbd6cb710116f9fce38 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a355771835d7a0c941d3a42e76dd0f4ae inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a355771835d7a0c941d3a42e76dd0f4ae"></a>
+GDALRasterBand * </td><td class="memItemRight" valign="bottom"><b>getRasterBand</b> (int band=0)</td></tr>
+<tr class="separator:a355771835d7a0c941d3a42e76dd0f4ae inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a24ded5779fef37794008f519a6638f63 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a24ded5779fef37794008f519a6638f63"></a>
+GDALColorTable * </td><td class="memItemRight" valign="bottom"><b>getColorTable</b> (int band=0) const </td></tr>
+<tr class="separator:a24ded5779fef37794008f519a6638f63 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a069d7a03c4c4cbb311534b1e061a59c9 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a069d7a03c4c4cbb311534b1e061a59c9"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getDriverDescription</b> () const </td></tr>
+<tr class="separator:a069d7a03c4c4cbb311534b1e061a59c9 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab84afa6974996363f4f004c9e8ed6c9a inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab84afa6974996363f4f004c9e8ed6c9a"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getImageType</b> () const </td></tr>
+<tr class="separator:ab84afa6974996363f4f004c9e8ed6c9a inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac648aeea3051b17663c1666bfb7b9ba2 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac648aeea3051b17663c1666bfb7b9ba2"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getInterleave</b> () const </td></tr>
+<tr class="separator:ac648aeea3051b17663c1666bfb7b9ba2 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3d6931927354087f333f68f5d70197c8 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3d6931927354087f333f68f5d70197c8"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getCompression</b> () const </td></tr>
+<tr class="separator:a3d6931927354087f333f68f5d70197c8 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a129dff26f65af24f6d006dae9f43dbba inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a129dff26f65af24f6d006dae9f43dbba"></a>
+GDALDataset * </td><td class="memItemRight" valign="bottom"><b>getDataset</b> ()</td></tr>
+<tr class="separator:a129dff26f65af24f6d006dae9f43dbba inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a412899cba08baf1a1630951afffdc6dd inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a412899cba08baf1a1630951afffdc6dd"></a>
+char ** </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> ()</td></tr>
+<tr class="separator:a412899cba08baf1a1630951afffdc6dd inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a43f9dfcb1724e88c86f7bb1f0a5fe236 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a43f9dfcb1724e88c86f7bb1f0a5fe236"></a>
+char ** </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> () const </td></tr>
+<tr class="separator:a43f9dfcb1724e88c86f7bb1f0a5fe236 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0c1a1664962b9ccd05ed9bcf7a118011 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0c1a1664962b9ccd05ed9bcf7a118011"></a>
+void </td><td class="memItemRight" valign="bottom"><b>getMetadata</b> (std::list< std::string > &metadata) const </td></tr>
+<tr class="separator:a0c1a1664962b9ccd05ed9bcf7a118011 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab599dad8573f2ac24302fdb339b1005a inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab599dad8573f2ac24302fdb339b1005a"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getDescription</b> () const </td></tr>
+<tr class="separator:ab599dad8573f2ac24302fdb339b1005a inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a592538d7aeb7622acb20cc3d81ed1dcc inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a592538d7aeb7622acb20cc3d81ed1dcc"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getMetadataItem</b> () const </td></tr>
+<tr class="separator:a592538d7aeb7622acb20cc3d81ed1dcc inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a057a5b1bc4bd5bc391962f154b2bb747 inherit pub_methods_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a057a5b1bc4bd5bc391962f154b2bb747"></a>
+std::string </td><td class="memItemRight" valign="bottom"><b>getImageDescription</b> () const </td></tr>
+<tr class="separator:a057a5b1bc4bd5bc391962f154b2bb747 inherit pub_methods_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
 Protected Member Functions</h2></td></tr>
-<tr class="memitem:a368aec4632a2877b30d5a895d5132012"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a368aec4632a2877b30d5a895d5132012"></a>
-void </td><td class="memItemRight" valign="bottom"><b>setCodec</b> (const std::string &imageType)</td></tr>
-<tr class="separator:a368aec4632a2877b30d5a895d5132012"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad00e7ae82d5f2342159e5c62b4637bf8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad00e7ae82d5f2342159e5c62b4637bf8"></a>
+void </td><td class="memItemRight" valign="bottom"><b>setCodec</b> (const GDALDataType &dataType, const std::string &imageType)</td></tr>
+<tr class="separator:ad00e7ae82d5f2342159e5c62b4637bf8"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a1d084ba67f72031fa75047434ec74779"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1d084ba67f72031fa75047434ec74779"></a>
 void </td><td class="memItemRight" valign="bottom"><b>setCodec</b> (const <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a> &ImgSrc)</td></tr>
 <tr class="separator:a1d084ba67f72031fa75047434ec74779"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-attribs"></a>
 Protected Attributes</h2></td></tr>
-<tr class="memitem:a77409489fab55ae32df94a6911c3459d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a77409489fab55ae32df94a6911c3459d"></a>
+<tr class="memitem:a74dd6523b3f607f31e2f35baf45bfbd8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a74dd6523b3f607f31e2f35baf45bfbd8"></a>
+std::vector< std::string > </td><td class="memItemRight" valign="bottom"><b>m_options</b></td></tr>
+<tr class="separator:a74dd6523b3f607f31e2f35baf45bfbd8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="inherit_header pro_attribs_classImgRasterGdal"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classImgRasterGdal')"><img src="closed.png" alt="-"/> Protected Attributes inherited from <a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a></td></tr>
+<tr class="memitem:a3257f4db7418fde0a0d3caf2a1d179a1 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3257f4db7418fde0a0d3caf2a1d179a1"></a>
 std::string </td><td class="memItemRight" valign="bottom"><b>m_filename</b></td></tr>
-<tr class="separator:a77409489fab55ae32df94a6911c3459d"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a348a776adc9d1f4c5eb89fb194f63eed"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a348a776adc9d1f4c5eb89fb194f63eed"></a>
+<tr class="separator:a3257f4db7418fde0a0d3caf2a1d179a1 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a49ef42e3d2cde64af9cfc00646b28f3b inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a49ef42e3d2cde64af9cfc00646b28f3b"></a>
 GDALDataset * </td><td class="memItemRight" valign="bottom"><b>m_gds</b></td></tr>
-<tr class="separator:a348a776adc9d1f4c5eb89fb194f63eed"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7e30c2d8b8696a3a20e85f507412821a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7e30c2d8b8696a3a20e85f507412821a"></a>
+<tr class="separator:a49ef42e3d2cde64af9cfc00646b28f3b inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a28f5fd5bdcd3e50ddd5f1b68ad8d31d7 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a28f5fd5bdcd3e50ddd5f1b68ad8d31d7"></a>
 int </td><td class="memItemRight" valign="bottom"><b>m_ncol</b></td></tr>
-<tr class="separator:a7e30c2d8b8696a3a20e85f507412821a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a46e42741630881692611a452b82cc408"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a46e42741630881692611a452b82cc408"></a>
+<tr class="separator:a28f5fd5bdcd3e50ddd5f1b68ad8d31d7 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a78b8a391b58e4268da9b4c88e7ecf962 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a78b8a391b58e4268da9b4c88e7ecf962"></a>
 int </td><td class="memItemRight" valign="bottom"><b>m_nrow</b></td></tr>
-<tr class="separator:a46e42741630881692611a452b82cc408"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a3502d2332d4a52a0a3efdb4f35a74be6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3502d2332d4a52a0a3efdb4f35a74be6"></a>
+<tr class="separator:a78b8a391b58e4268da9b4c88e7ecf962 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a208157846765615d4495a73bada30740 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a208157846765615d4495a73bada30740"></a>
 int </td><td class="memItemRight" valign="bottom"><b>m_nband</b></td></tr>
-<tr class="separator:a3502d2332d4a52a0a3efdb4f35a74be6"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa8b53c690c8c70627ac2710ef6abb3e2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa8b53c690c8c70627ac2710ef6abb3e2"></a>
-GDALDataType </td><td class="memItemRight" valign="bottom"><b>m_type</b></td></tr>
-<tr class="separator:aa8b53c690c8c70627ac2710ef6abb3e2"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:afa821eb63087da4a9cd84817416bfb27"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afa821eb63087da4a9cd84817416bfb27"></a>
+<tr class="separator:a208157846765615d4495a73bada30740 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ade28d4208d3a77f112aa6a190b9e38f6 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ade28d4208d3a77f112aa6a190b9e38f6"></a>
 double </td><td class="memItemRight" valign="bottom"><b>m_gt</b> [6]</td></tr>
-<tr class="separator:afa821eb63087da4a9cd84817416bfb27"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a74dd6523b3f607f31e2f35baf45bfbd8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a74dd6523b3f607f31e2f35baf45bfbd8"></a>
-std::vector< std::string > </td><td class="memItemRight" valign="bottom"><b>m_options</b></td></tr>
-<tr class="separator:a74dd6523b3f607f31e2f35baf45bfbd8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:ade28d4208d3a77f112aa6a190b9e38f6 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9154b4b3d6ef24dd1d922b3caab9b295 inherit pro_attribs_classImgRasterGdal"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9154b4b3d6ef24dd1d922b3caab9b295"></a>
+std::vector< double > </td><td class="memItemRight" valign="bottom"><b>m_noDataValues</b></td></tr>
+<tr class="separator:a9154b4b3d6ef24dd1d922b3caab9b295 inherit pro_attribs_classImgRasterGdal"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="ImgWriterGdal_8h_source.html#l00032">32</a> of file <a class="el" href="ImgWriterGdal_8h_source.html">ImgWriterGdal.h</a>.</p>
+<p>Definition at line <a class="el" href="ImgWriterGdal_8h_source.html#l00033">33</a> of file <a class="el" href="ImgWriterGdal_8h_source.html">ImgWriterGdal.h</a>.</p>
 </div><hr/>The documentation for this class was generated from the following files:<ul>
 <li>/home/kempenep/pktools/src/imageclasses/<a class="el" href="ImgWriterGdal_8h_source.html">ImgWriterGdal.h</a></li>
 <li>/home/kempenep/pktools/src/imageclasses/<a class="el" href="ImgWriterGdal_8cc_source.html">ImgWriterGdal.cc</a></li>
@@ -232,7 +301,7 @@ std::vector< std::string > </td><td class="memItemRight" valign="bott
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgWriterGdal__coll__graph.map b/doc/html/classImgWriterGdal__coll__graph.map
index 68e717c..51bfdb9 100644
--- a/doc/html/classImgWriterGdal__coll__graph.map
+++ b/doc/html/classImgWriterGdal__coll__graph.map
@@ -1,4 +1,5 @@
 <map id="ImgWriterGdal" name="ImgWriterGdal">
-<area shape="rect" id="node2" title="STL class. " alt="" coords="28,99,107,125"/>
-<area shape="rect" id="node3" title="STL class. " alt="" coords="5,6,131,47"/>
+<area shape="rect" id="node2" href="$classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="195,189,305,216"/>
+<area shape="rect" id="node3" title="STL class. " alt="" coords="75,99,153,125"/>
+<area shape="rect" id="node4" title="STL class. " alt="" coords="51,6,177,47"/>
 </map>
diff --git a/doc/html/classImgWriterGdal__coll__graph.md5 b/doc/html/classImgWriterGdal__coll__graph.md5
index 8bb0158..91d22e7 100644
--- a/doc/html/classImgWriterGdal__coll__graph.md5
+++ b/doc/html/classImgWriterGdal__coll__graph.md5
@@ -1 +1 @@
-5cd564b9171a1c3be7d2dbd374b25a04
\ No newline at end of file
+7ddb964c1097b77b2b96ff507bfe5907
\ No newline at end of file
diff --git a/doc/html/classImgWriterGdal__coll__graph.png b/doc/html/classImgWriterGdal__coll__graph.png
index 399f1fe..bb550de 100644
Binary files a/doc/html/classImgWriterGdal__coll__graph.png and b/doc/html/classImgWriterGdal__coll__graph.png differ
diff --git a/doc/html/classImgWriterGdal__inherit__graph.map b/doc/html/classImgWriterGdal__inherit__graph.map
new file mode 100644
index 0000000..1f56429
--- /dev/null
+++ b/doc/html/classImgWriterGdal__inherit__graph.map
@@ -0,0 +1,4 @@
+<map id="ImgWriterGdal" name="ImgWriterGdal">
+<area shape="rect" id="node3" href="$classImgUpdaterGdal.html" title="ImgUpdaterGdal" alt="" coords="4,155,120,181"/>
+<area shape="rect" id="node2" href="$classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="7,5,117,32"/>
+</map>
diff --git a/doc/html/classImgWriterGdal__inherit__graph.md5 b/doc/html/classImgWriterGdal__inherit__graph.md5
new file mode 100644
index 0000000..cf261be
--- /dev/null
+++ b/doc/html/classImgWriterGdal__inherit__graph.md5
@@ -0,0 +1 @@
+62769723e73af2a47d848657257143fc
\ No newline at end of file
diff --git a/doc/html/classImgWriterGdal__inherit__graph.png b/doc/html/classImgWriterGdal__inherit__graph.png
new file mode 100644
index 0000000..36ee75b
Binary files /dev/null and b/doc/html/classImgWriterGdal__inherit__graph.png differ
diff --git a/doc/html/classImgWriterOgr-members.html b/doc/html/classImgWriterOgr-members.html
index 0a8fa79..2f01b1f 100644
--- a/doc/html/classImgWriterOgr-members.html
+++ b/doc/html/classImgWriterOgr-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -91,7 +91,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgWriterOgr.html b/doc/html/classImgWriterOgr.html
index 1d6f8ff..fdbc544 100644
--- a/doc/html/classImgWriterOgr.html
+++ b/doc/html/classImgWriterOgr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -177,7 +177,7 @@ OGRDataSource * </td><td class="memItemRight" valign="bottom"><b>m_datasour
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classIncrease__IndexValue-members.html b/doc/html/classIncrease__IndexValue-members.html
index fc67425..118c96e 100644
--- a/doc/html/classIncrease__IndexValue-members.html
+++ b/doc/html/classIncrease__IndexValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classIncrease__IndexValue.html b/doc/html/classIncrease__IndexValue.html
index bef62a5..09fd01f 100644
--- a/doc/html/classIncrease__IndexValue.html
+++ b/doc/html/classIncrease__IndexValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classIncrease__PosValue-members.html b/doc/html/classIncrease__PosValue-members.html
index 7157a92..305bbab 100644
--- a/doc/html/classIncrease__PosValue-members.html
+++ b/doc/html/classIncrease__PosValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classIncrease__PosValue.html b/doc/html/classIncrease__PosValue.html
index 6cb5ec8..2fb9de7 100644
--- a/doc/html/classIncrease__PosValue.html
+++ b/doc/html/classIncrease__PosValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classKernel-members.html b/doc/html/classKernel-members.html
index d533475..2a4c261 100644
--- a/doc/html/classKernel-members.html
+++ b/doc/html/classKernel-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classKernel.html b/doc/html/classKernel.html
index 4b8ae61..63b2f38 100644
--- a/doc/html/classKernel.html
+++ b/doc/html/classKernel.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -108,7 +108,7 @@ double(Kernel::* </td><td class="memItemRight" valign="bottom"><b>kernel_fu
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classLastReturnFilter-members.html b/doc/html/classLastReturnFilter-members.html
index 8190c0e..a90fcec 100644
--- a/doc/html/classLastReturnFilter-members.html
+++ b/doc/html/classLastReturnFilter-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -60,7 +60,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classLastReturnFilter.html b/doc/html/classLastReturnFilter.html
index b1b95a1..fe6747a 100644
--- a/doc/html/classLastReturnFilter.html
+++ b/doc/html/classLastReturnFilter.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -82,7 +82,7 @@ bool </td><td class="memItemRight" valign="bottom"><b>filter</b> (const lib
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classMainWindow-members.html b/doc/html/classMainWindow-members.html
index c884a6d..7c132a9 100644
--- a/doc/html/classMainWindow-members.html
+++ b/doc/html/classMainWindow-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classMainWindow.html b/doc/html/classMainWindow.html
index 1c93ede..68a711f 100644
--- a/doc/html/classMainWindow.html
+++ b/doc/html/classMainWindow.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -95,7 +95,7 @@ Public Member Functions</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classONE__CLASS__Q-members.html b/doc/html/classONE__CLASS__Q-members.html
index 1cf7ee1..8c38ada 100644
--- a/doc/html/classONE__CLASS__Q-members.html
+++ b/doc/html/classONE__CLASS__Q-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classONE__CLASS__Q.html b/doc/html/classONE__CLASS__Q.html
index e1ee438..79f8a88 100644
--- a/doc/html/classONE__CLASS__Q.html
+++ b/doc/html/classONE__CLASS__Q.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -109,7 +109,7 @@ double(Kernel::* </td><td class="memItemRight" valign="bottom"><b>kernel_fu
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classOptFactory-members.html b/doc/html/classOptFactory-members.html
index 6ca3d43..7dd73c6 100644
--- a/doc/html/classOptFactory-members.html
+++ b/doc/html/classOptFactory-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -61,7 +61,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classOptFactory.html b/doc/html/classOptFactory.html
index ed2a6ef..f6242d4 100644
--- a/doc/html/classOptFactory.html
+++ b/doc/html/classOptFactory.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ static nlopt::opt </td><td class="memItemRight" valign="bottom"><b>getOptim
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classOptionpk-members.html b/doc/html/classOptionpk-members.html
index 36a8d6d..d42fc9d 100644
--- a/doc/html/classOptionpk-members.html
+++ b/doc/html/classOptionpk-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -56,28 +56,22 @@
 <table class="directory">
   <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#a092414f315f6b310fc88eaf5688b81f4">findSubstring</a>(const T &argument) const </td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>findSubstring</b>(const std::string &argument) const (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>findSubstring</b>(const std::string &argument) const (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDefaultValue</b>() const  (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#acb7e411ce6a318424bf2ad1f9dc846ff">getGPLv3License</a>()</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
-  <tr><td class="entry"><a class="el" href="classOptionpk.html#a6054c64a684a4aaba41787d9f8be031f">getHelp</a>() const </td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#af7ce0ff4dfe57f1e6685b67fb1d70b69">getLongName</a>() const </td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr><td class="entry"><a class="el" href="classOptionpk.html#ae0d0d55bac2456e6cbcec97892667742">getShortName</a>() const </td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#a4ab58d03540efa49fe3ebf6a58507f23">operator<<</a>(std::ostream &os, const Optionpk< T1 > &theOption)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">friend</span></td></tr>
-  <tr><td class="entry"><a class="el" href="classOptionpk.html#a0082d074d437413b3beefa06c0521644">Optionpk</a>()</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#a027b169ab11595296121c5e1b8499c6e">Optionpk</a>(const std::string &shortName, const std::string &longName, const std::string &helpInfo)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr><td class="entry"><a class="el" href="classOptionpk.html#a4356ce7db419ff66abd207028ff1e2fc">Optionpk</a>(const std::string &shortName, const std::string &longName, const std::string &helpInfo, const T &defaultValue, short hide=0)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>Optionpk</b>(const std::string &shortName, const std::string &longName, const std::string &helpInfo) (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>Optionpk</b>(const std::string &shortName, const std::string &longName, const std::string &helpInfo, const bool &defaultValue, short hide) (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDefaultValue</b>() const  (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr><td class="entry"><a class="el" href="classOptionpk.html#acb7e411ce6a318424bf2ad1f9dc846ff">getGPLv3License</a>()</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#a6054c64a684a4aaba41787d9f8be031f">getHelp</a>() const </td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr><td class="entry"><a class="el" href="classOptionpk.html#af7ce0ff4dfe57f1e6685b67fb1d70b69">getLongName</a>() const </td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#ae0d0d55bac2456e6cbcec97892667742">getShortName</a>() const </td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr><td class="entry"><a class="el" href="classOptionpk.html#a4ab58d03540efa49fe3ebf6a58507f23">operator<<</a>(std::ostream &os, const Optionpk< T1 > &theOption)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">friend</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#a0082d074d437413b3beefa06c0521644">Optionpk</a>()</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr><td class="entry"><a class="el" href="classOptionpk.html#a027b169ab11595296121c5e1b8499c6e">Optionpk</a>(const std::string &shortName, const std::string &longName, const std::string &helpInfo)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#a4356ce7db419ff66abd207028ff1e2fc">Optionpk</a>(const std::string &shortName, const std::string &longName, const std::string &helpInfo, const T &defaultValue, short hide=0)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>Optionpk</b>(const std::string &shortName, const std::string &longName, const std::string &helpInfo) (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>Optionpk</b>(const std::string &shortName, const std::string &longName, const std::string &helpInfo, const bool &defaultValue, short hide) (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr><td class="entry"><a class="el" href="classOptionpk.html#a7b788a1b8e5c738732a1733613065ef7">retrieveOption</a>(int argc, char **argv)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#affd58e09b1baaf0b1754fbf938eea11a">setAll</a>(const std::string &shortName, const std::string &longName, const std::string &helpInfo)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr><td class="entry"><a class="el" href="classOptionpk.html#a7fda7da55d4511d6868e86bd67a90aa9">setAll</a>(const std::string &shortName, const std::string &longName, const std::string &helpInfo, const T &defaultValue, short hide)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setAll</b>(const std::string &shortName, const std::string &longName, const std::string &helpInfo) (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>setAll</b>(const std::string &shortName, const std::string &longName, const std::string &helpInfo, const bool &defaultValue, short hide) (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setAll</b>(const std::string &shortName, const std::string &longName, const std::string &helpInfo) (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setAll</b>(const std::string &shortName, const std::string &longName, const std::string &helpInfo) (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setAll</b>(const std::string &shortName, const std::string &longName, const std::string &helpInfo, const bool &defaultValue, short hide) (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setAll</b>(const std::string &shortName, const std::string &longName, const std::string &helpInfo, const bool &defaultValue, short hide) (defined in <a class="el" href="classOptionpk.html">Optionpk< T ></a>)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#ae9dc2dafc605ed3e2a8a798063ce7187">setDefault</a>(const T &defaultValue)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"></td></tr>
   <tr><td class="entry"><a class="el" href="classOptionpk.html#afea9af606e15b12bc49bc25d0477fe8e">setHelp</a>(const std::string &helpInfo)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="classOptionpk.html#a95628f0f149cb9465468facfb3f0f915">setHide</a>(short hide)</td><td class="entry"><a class="el" href="classOptionpk.html">Optionpk< T ></a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
@@ -88,7 +82,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classOptionpk.html b/doc/html/classOptionpk.html
index 4891ec7..21167d7 100644
--- a/doc/html/classOptionpk.html
+++ b/doc/html/classOptionpk.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -158,31 +158,6 @@ template<> </td></tr>
 <tr class="memitem:a4c083ccb476747385cecbcacbc9d2296"><td class="memTemplItemLeft" align="right" valign="top">std::vector< std::string ><br class="typebreak"/>
 ::const_iterator </td><td class="memTemplItemRight" valign="bottom"><b>findSubstring</b> (const std::string &argument) const</td></tr>
 <tr class="separator:a4c083ccb476747385cecbcacbc9d2296"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad8494670a4fcd2e9a13f6329cce03c4a"><td class="memTemplParams" colspan="2"><a class="anchor" id="ad8494670a4fcd2e9a13f6329cce03c4a"></a>
-template<> </td></tr>
-<tr class="memitem:ad8494670a4fcd2e9a13f6329cce03c4a"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>setAll</b> (const std::string &shortName, const std::string &longName, const std::string &helpInfo)</td></tr>
-<tr class="separator:ad8494670a4fcd2e9a13f6329cce03c4a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad8494670a4fcd2e9a13f6329cce03c4a"><td class="memTemplParams" colspan="2"><a class="anchor" id="ad8494670a4fcd2e9a13f6329cce03c4a"></a>
-template<> </td></tr>
-<tr class="memitem:ad8494670a4fcd2e9a13f6329cce03c4a"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>setAll</b> (const std::string &shortName, const std::string &longName, const std::string &helpInfo)</td></tr>
-<tr class="separator:ad8494670a4fcd2e9a13f6329cce03c4a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a9c252508f70b8afb3f1d179f05a89852"><td class="memTemplParams" colspan="2"><a class="anchor" id="a9c252508f70b8afb3f1d179f05a89852"></a>
-template<> </td></tr>
-<tr class="memitem:a9c252508f70b8afb3f1d179f05a89852"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>setAll</b> (const std::string &shortName, const std::string &longName, const std::string &helpInfo, const bool &defaultValue, short hide)</td></tr>
-<tr class="separator:a9c252508f70b8afb3f1d179f05a89852"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a9c252508f70b8afb3f1d179f05a89852"><td class="memTemplParams" colspan="2"><a class="anchor" id="a9c252508f70b8afb3f1d179f05a89852"></a>
-template<> </td></tr>
-<tr class="memitem:a9c252508f70b8afb3f1d179f05a89852"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>setAll</b> (const std::string &shortName, const std::string &longName, const std::string &helpInfo, const bool &defaultValue, short hide)</td></tr>
-<tr class="separator:a9c252508f70b8afb3f1d179f05a89852"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:acb5ab11e1db7dc20bc9d07d17718c953"><td class="memTemplParams" colspan="2"><a class="anchor" id="acb5ab11e1db7dc20bc9d07d17718c953"></a>
-template<> </td></tr>
-<tr class="memitem:acb5ab11e1db7dc20bc9d07d17718c953"><td class="memTemplItemLeft" align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>Optionpk</b> (const std::string &shortName, const std::string &longName, const std::string &helpInfo, const bool &defaultValue, short hide)</td></tr>
-<tr class="separator:acb5ab11e1db7dc20bc9d07d17718c953"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a4c083ccb476747385cecbcacbc9d2296"><td class="memTemplParams" colspan="2"><a class="anchor" id="a4c083ccb476747385cecbcacbc9d2296"></a>
-template<> </td></tr>
-<tr class="memitem:a4c083ccb476747385cecbcacbc9d2296"><td class="memTemplItemLeft" align="right" valign="top">std::vector< std::string ><br class="typebreak"/>
-::const_iterator </td><td class="memTemplItemRight" valign="bottom"><b>findSubstring</b> (const std::string &argument) const</td></tr>
-<tr class="separator:a4c083ccb476747385cecbcacbc9d2296"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
 Static Public Member Functions</h2></td></tr>
@@ -504,7 +479,7 @@ template<class T > </div>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classQMatrix-members.html b/doc/html/classQMatrix-members.html
index 19e47a1..2c4af1d 100644
--- a/doc/html/classQMatrix-members.html
+++ b/doc/html/classQMatrix-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -62,7 +62,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classQMatrix.html b/doc/html/classQMatrix.html
index 423c5be..a00d120 100644
--- a/doc/html/classQMatrix.html
+++ b/doc/html/classQMatrix.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -84,7 +84,7 @@ virtual void </td><td class="memItemRight" valign="bottom"><b>swap_index</b
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSVC__Q-members.html b/doc/html/classSVC__Q-members.html
index e91e617..98cb6fb 100644
--- a/doc/html/classSVC__Q-members.html
+++ b/doc/html/classSVC__Q-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSVC__Q.html b/doc/html/classSVC__Q.html
index e8b9bca..59e71a2 100644
--- a/doc/html/classSVC__Q.html
+++ b/doc/html/classSVC__Q.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -109,7 +109,7 @@ double(Kernel::* </td><td class="memItemRight" valign="bottom"><b>kernel_fu
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSVR__Q-members.html b/doc/html/classSVR__Q-members.html
index 15c495f..dbfe458 100644
--- a/doc/html/classSVR__Q-members.html
+++ b/doc/html/classSVR__Q-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSVR__Q.html b/doc/html/classSVR__Q.html
index 33d0adb..d9c2a80 100644
--- a/doc/html/classSVR__Q.html
+++ b/doc/html/classSVR__Q.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -109,7 +109,7 @@ double(Kernel::* </td><td class="memItemRight" valign="bottom"><b>kernel_fu
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSolver-members.html b/doc/html/classSolver-members.html
index cb3e57d..4cba386 100644
--- a/doc/html/classSolver-members.html
+++ b/doc/html/classSolver-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -89,7 +89,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSolver.html b/doc/html/classSolver.html
index 806daf8..f4fe8bc 100644
--- a/doc/html/classSolver.html
+++ b/doc/html/classSolver.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -183,7 +183,7 @@ bool </td><td class="memItemRight" valign="bottom"><b>unshrink</b></td></tr
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSolver__NU-members.html b/doc/html/classSolver__NU-members.html
index 81505a4..f4e30e9 100644
--- a/doc/html/classSolver__NU-members.html
+++ b/doc/html/classSolver__NU-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSolver__NU.html b/doc/html/classSolver__NU.html
index c98ed44..e8def7b 100644
--- a/doc/html/classSolver__NU.html
+++ b/doc/html/classSolver__NU.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -166,7 +166,7 @@ bool </td><td class="memItemRight" valign="bottom"><b>unshrink</b></td></tr
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classUi_1_1MainWindow-members.html b/doc/html/classUi_1_1MainWindow-members.html
index e428432..21ceeea 100644
--- a/doc/html/classUi_1_1MainWindow-members.html
+++ b/doc/html/classUi_1_1MainWindow-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -246,7 +246,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classUi_1_1MainWindow.html b/doc/html/classUi_1_1MainWindow.html
index 8a72c14..6ab40c6 100644
--- a/doc/html/classUi_1_1MainWindow.html
+++ b/doc/html/classUi_1_1MainWindow.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -639,7 +639,7 @@ QComboBox * </td><td class="memItemRight" valign="bottom"><b>kerneltype</b>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classUi__MainWindow-members.html b/doc/html/classUi__MainWindow-members.html
index 06e3cc3..fde624b 100644
--- a/doc/html/classUi__MainWindow-members.html
+++ b/doc/html/classUi__MainWindow-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -242,7 +242,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classUi__MainWindow.html b/doc/html/classUi__MainWindow.html
index 2fa14e4..a431e76 100644
--- a/doc/html/classUi__MainWindow.html
+++ b/doc/html/classUi__MainWindow.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -631,7 +631,7 @@ QComboBox * </td><td class="memItemRight" valign="bottom"><b>kerneltype</b>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classVector2d-members.html b/doc/html/classVector2d-members.html
index 08cf4d8..1bced18 100644
--- a/doc/html/classVector2d-members.html
+++ b/doc/html/classVector2d-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -85,7 +85,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classVector2d.html b/doc/html/classVector2d.html
index d315fc1..a7ef89a 100644
--- a/doc/html/classVector2d.html
+++ b/doc/html/classVector2d.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -165,7 +165,7 @@ class Vector2d< T ></h3>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classconfusionmatrix_1_1ConfusionMatrix-members.html b/doc/html/classconfusionmatrix_1_1ConfusionMatrix-members.html
index c490811..88510ce 100644
--- a/doc/html/classconfusionmatrix_1_1ConfusionMatrix-members.html
+++ b/doc/html/classconfusionmatrix_1_1ConfusionMatrix-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -101,7 +101,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classconfusionmatrix_1_1ConfusionMatrix.html b/doc/html/classconfusionmatrix_1_1ConfusionMatrix.html
index 70a4fca..bb8e44d 100644
--- a/doc/html/classconfusionmatrix_1_1ConfusionMatrix.html
+++ b/doc/html/classconfusionmatrix_1_1ConfusionMatrix.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -192,7 +192,7 @@ std::ostream & </td><td class="memItemRight" valign="bottom"><b>operato
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classes.html b/doc/html/classes.html
index d9e1bfd..ab29eec 100644
--- a/doc/html/classes.html
+++ b/doc/html/classes.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -54,50 +54,52 @@
 <div class="qindex"><a class="qindex" href="#letter_B">B</a> | <a class="qindex" href="#letter_C">C</a> | <a class="qindex" href="#letter_D">D</a> | <a class="qindex" href="#letter_E">E</a> | <a class="qindex" href="#letter_F">F</a> | <a class="qindex" href="#letter_I">I</a> | <a class="qindex" href="#letter_K">K</a> | <a class="qindex" href="#letter_L">L</a> | <a class="qindex" href="#letter_M">M</a> |& [...]
 <table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
 <tr><td rowspan="2" valign="bottom"><a name="letter_B"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  B  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classFileReaderLas.html">FileReaderLas</a>   </td><td valign="top"><a class="el" href="classOptFactory.html">OptFactory</a>   </td><td rowspan="2" valign="bottom"><a name="letter_d"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  d  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a> (qgis.pktools.pkfilterdem)   </td></tr>
-<tr><td valign="top"><a class="el" href="classfilter_1_1Filter.html">Filter</a> (filter)   </td><td valign="top"><a class="el" href="classOptionpk.html">Optionpk</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a> (qgis.pkfilterdem)   </td></tr>
-<tr><td valign="top"><a class="el" href="classBadConversion.html">BadConversion</a>   </td><td valign="top"><a class="el" href="classfilter2d_1_1Filter2d.html">Filter2d</a> (filter2d)   </td><td rowspan="2" valign="bottom"><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  P  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="structdecision__function.html">decision_function</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a> (qgis.pkgetmask)   </td></tr>
+</td><td valign="top"><a class="el" href="classfilter_1_1Filter.html">Filter</a> (filter)   </td><td valign="top"><a class="el" href="classOptFactory.html">OptFactory</a>   </td><td rowspan="2" valign="bottom"><a name="letter_n"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  n  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">pklas2img</a> (qgis.pktools.pklas2img)   </td></tr>
+<tr><td valign="top"><a class="el" href="classfilter2d_1_1Filter2d.html">Filter2d</a> (filter2d)   </td><td valign="top"><a class="el" href="classOptionpk.html">Optionpk</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pklas2img_1_1pklas2img.html">pklas2img</a> (qgis.pklas2img)   </td></tr>
+<tr><td valign="top"><a class="el" href="classBadConversion.html">BadConversion</a>   </td><td rowspan="2" valign="bottom"><a name="letter_I"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  I  </div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  P  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classFANN_1_1neural__net.html">neural_net</a> (FANN)   </td><td valign="top"><a class="el" href="classqgis_1_1pkreclass_1_1pkreclass.html">pkreclass</a> (qgis.pkreclass)   </td></tr>
 <tr><td rowspan="2" valign="bottom"><a name="letter_C"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  C  </div></td></tr></table>
-</td><td rowspan="2" valign="bottom"><a name="letter_I"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  I  </div></td></tr></table>
-</td><td rowspan="2" valign="bottom"><a name="letter_n"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  n  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a> (qgis.pktools.pkgetmask)   </td></tr>
-<tr><td valign="top"><a class="el" href="structPosValue.html">PosValue</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">pklas2img</a> (qgis.pktools.pklas2img)   </td></tr>
-<tr><td valign="top"><a class="el" href="classCache.html">Cache</a>   </td><td valign="top"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">ProcessingPktoolsPlugin</a> (qgis.pktools.ProcessingPktoolsPlugin)   </td><td valign="top"><a class="el" href="classFANN_1_1neural__net.html">neural_net</a> (FANN)&#16 [...]
-<tr><td valign="top"><a class="el" href="classCompare__IndexValue.html">Compare_IndexValue</a>   </td><td valign="top"><a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>   </td><td valign="top"><a class="el" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">ProcessingPktoolsPlugin</a> (qgis.ProcessingPktoolsPlugin)   </td><td rowspan="2" valign="bottom"><a name="letter_p"></a><table border="0" cellspacing="0 [...]
-</td><td valign="top"><a class="el" href="classqgis_1_1pkreclass_1_1pkreclass.html">pkreclass</a> (qgis.pkreclass)   </td></tr>
-<tr><td valign="top"><a class="el" href="classCompare__PosValue.html">Compare_PosValue</a>   </td><td valign="top"><a class="el" href="classimgregression_1_1ImgRegression.html">ImgRegression</a> (imgregression)   </td><td rowspan="2" valign="bottom"><a name="letter_Q"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  Q  </div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_p"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  p  </div></td></tr></table>
 </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">pkreclass</a> (qgis.pktools.pkreclass)   </td></tr>
-<tr><td valign="top"><a class="el" href="classconfusionmatrix_1_1ConfusionMatrix.html">ConfusionMatrix</a> (confusionmatrix)   </td><td valign="top"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkcomposite_1_1pkcomposite.html">pkcomposite</a> (qgis.pkcomposite)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">pksetmask</a> [...]
-<tr><td valign="top"><a class="el" href="classCostFactory.html">CostFactory</a>   </td><td valign="top"><a class="el" href="classImgWriterOgr.html">ImgWriterOgr</a>   </td><td valign="top"><a class="el" href="classQMatrix.html">QMatrix</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">pkcomposite</a> (qgis.pktools.pkcomposite)   </td><td valign="top"><a class="el" href="clas [...]
-<tr><td valign="top"><a class="el" href="classCostFactoryANN.html">CostFactoryANN</a>   </td><td valign="top"><a class="el" href="classIncrease__IndexValue.html">Increase_IndexValue</a>   </td><td rowspan="2" valign="bottom"><a name="letter_S"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  S  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classqgis_1_1pkcrop_1_1pkcrop.html">pkcrop</a> (qgis.pkcrop)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">pksvm</a> (qgis.pktools.pksvm)   </td></tr>
-<tr><td valign="top"><a class="el" href="classCostFactorySVM.html">CostFactorySVM</a>   </td><td valign="top"><a class="el" href="classIncrease__PosValue.html">Increase_PosValue</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">pkcrop</a> (qgis.pktools.pkcrop)   </td><td valign="top"><a class="el" href="classqgis_1_1pksvm_1_1pksvm.html">pksvm</a> (qgis.pksvm)   </td></tr>
+<tr><td valign="top"><a class="el" href="classImgRasterGdal.html">ImgRasterGdal</a>   </td><td valign="top"><a class="el" href="structPosValue.html">PosValue</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">pksetmask</a> (qgis.pktools.pksetmask)   </td></tr>
+<tr><td valign="top"><a class="el" href="classCache.html">Cache</a>   </td><td valign="top"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">ProcessingPktoolsPlugin</a> (qgis.pktools.ProcessingPktoolsPlugin)   </td><td valign="top"><a class="el" href="classqgis_1_1pkcomposite_1_1pkcomposite.html">pkcomposit [...]
+<tr><td valign="top"><a class="el" href="classCompare__IndexValue.html">Compare_IndexValue</a>   </td><td valign="top"><a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>   </td><td valign="top"><a class="el" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">ProcessingPktoolsPlugin</a> (qgis.ProcessingPktoolsPlugin)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite [...]
+<tr><td valign="top"><a class="el" href="classCompare__PosValue.html">Compare_PosValue</a>   </td><td valign="top"><a class="el" href="classimgregression_1_1ImgRegression.html">ImgRegression</a> (imgregression)   </td><td rowspan="2" valign="bottom"><a name="letter_Q"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  Q  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pkcrop_1_1pkcrop.html">pkcrop</a> (qgis.pkcrop)   </td><td valign="top"><a class="el" href="classqgis_1_1pksvm_1_1pksvm.html">pksvm</a> (qgis.pksvm)   </td></tr>
+<tr><td valign="top"><a class="el" href="classconfusionmatrix_1_1ConfusionMatrix.html">ConfusionMatrix</a> (confusionmatrix)   </td><td valign="top"><a class="el" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">pkcrop</a> (qgis.pktools.pkcrop)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html [...]
+<tr><td valign="top"><a class="el" href="classCostFactory.html">CostFactory</a>   </td><td valign="top"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>   </td><td valign="top"><a class="el" href="classQMatrix.html">QMatrix</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a> (qgis.pkdiff_accuracy)   </td><td valign="top"><a class="el" href="cla [...]
+<tr><td valign="top"><a class="el" href="classCostFactoryANN.html">CostFactoryANN</a>   </td><td valign="top"><a class="el" href="classImgWriterOgr.html">ImgWriterOgr</a>   </td><td rowspan="2" valign="bottom"><a name="letter_S"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  S  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a> (qgis.pktools.pkdiff_accuracy)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html">pktoolsAlgorithmProvider</a> (qgis.pktools.pktoolsAlgorithmProvider)   </td></tr>
+<tr><td valign="top"><a class="el" href="classCostFactorySVM.html">CostFactorySVM</a>   </td><td valign="top"><a class="el" href="classIncrease__IndexValue.html">Increase_IndexValue</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkextract_1_1pkextract.html">pkextract</a> (qgis.pkextract)   </td><td valign="top"><a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html">pktoolsAlgorithmProvider</a> [...]
 <tr><td rowspan="2" valign="bottom"><a name="letter_D"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  D  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="structIndexValue.html">IndexValue</a>   </td><td valign="top"><a class="el" href="structSolver_1_1SolutionInfo.html">Solver::SolutionInfo</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a> (qgis.pkdiff_accuracy)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">pktoolsAl [...]
-<tr><td rowspan="2" valign="bottom"><a name="letter_K"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  K  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classSolver.html">Solver</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a> (qgis.pktools.pkdiff_accuracy)   </td><td valign="top"><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">pktoolsAlgorithm</a> (qgis.pktoolsAlgorithm)   </td></tr>
-<tr><td valign="top"><a class="el" href="classDataModel.html">DataModel</a>   </td><td valign="top"><a class="el" href="classSolver__NU.html">Solver_NU</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkextract_1_1pkextract.html">pkextract</a> (qgis.pkextract)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html">pktoolsAlgorithmProvider</a> (qgis.pktools.pkto [...]
-<tr><td valign="top"><a class="el" href="classDecrease__IndexValue.html">Decrease_IndexValue</a>   </td><td valign="top"><a class="el" href="classKernel.html">Kernel</a>   </td><td valign="top"><a class="el" href="classstatfactory_1_1StatFactory.html">StatFactory</a> (statfactory)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">pkextract</a> (qgis.pktools.pkextract)   </td><td val [...]
-<tr><td valign="top"><a class="el" href="classDecrease__PosValue.html">Decrease_PosValue</a>   </td><td rowspan="2" valign="bottom"><a name="letter_L"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  L  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classSVC__Q.html">SVC_Q</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a> (qgis.pkextract_grid)   </td><td valign="top"><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a> (qgis.pktoolsUtils)   </td></tr>
-<tr><td rowspan="2" valign="bottom"><a name="letter_E"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  E  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classSVR__Q.html">SVR_Q</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a> (qgis.pktools.pkextract_grid)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a> (qgis.pktools.pktoolsUtils)   </td></tr>
-<tr><td valign="top"><a class="el" href="classLastReturnFilter.html">LastReturnFilter</a>   </td><td rowspan="2" valign="bottom"><a name="letter_U"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  U  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classqgis_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a> (qgis.pkextract_random)   </td><td rowspan="2" valign="bottom"><a name="letter_s"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  s  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classIncrease__PosValue.html">Increase_PosValue</a>   </td><td valign="top"><a class="el" href="structSolver_1_1SolutionInfo.html">Solver::SolutionInfo</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">pkextract</a> (qgis.pktools.pkextract)   </td><td valign="top"><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a> (qgi [...]
+<tr><td valign="top"><a class="el" href="structIndexValue.html">IndexValue</a>   </td><td valign="top"><a class="el" href="classSolver.html">Solver</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a> (qgis.pktools.pkextract_grid)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a> (qgis.pktools.pkt [...]
+<tr><td valign="top"><a class="el" href="classDataModel.html">DataModel</a>   </td><td rowspan="2" valign="bottom"><a name="letter_K"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  K  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classSolver__NU.html">Solver_NU</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a> (qgis.pkextract_grid)   </td><td rowspan="2" valign="bottom"><a name="letter_s"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  s  </div></td></tr></table>
 </td></tr>
-<tr><td valign="top"><a class="el" href="classEgcs.html">Egcs</a>   </td><td rowspan="2" valign="bottom"><a name="letter_M"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  M  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a> (qgis.pktools.pkextract_random)   </td></tr>
+<tr><td valign="top"><a class="el" href="classDecrease__IndexValue.html">Decrease_IndexValue</a>   </td><td valign="top"><a class="el" href="classstatfactory_1_1StatFactory.html">StatFactory</a> (statfactory)   </td><td valign="top"><a class="el" href="classqgis_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a> (qgis.pkextract_random)   </td></tr>
+<tr><td valign="top"><a class="el" href="classDecrease__PosValue.html">Decrease_PosValue</a>   </td><td valign="top"><a class="el" href="classKernel.html">Kernel</a>   </td><td valign="top"><a class="el" href="classSVC__Q.html">SVC_Q</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a> (qgis.pktools.pkextract_random)   </td><td valign="top"><a c [...]
+<tr><td rowspan="2" valign="bottom"><a name="letter_E"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  E  </div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_L"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  L  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classSVR__Q.html">SVR_Q</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a> (qgis.pkfilter_spatial)   </td><td valign="top"><a class="el" href="structsvm__node.html">svm_node</a>   </td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_U"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  U  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a> (qgis.pktools.pkfilter_spatial)   </td><td valign="top"><a class="el" href="structsvm__parameter.html">svm_parameter</a>   </td></tr>
+<tr><td valign="top"><a class="el" href="classEgcs.html">Egcs</a>   </td><td valign="top"><a class="el" href="classLastReturnFilter.html">LastReturnFilter</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a> (qgis.pkfilter_spectral)   </td><td valign="top"><a class="el" href="structsvm__problem.html">svm_problem</a>   </td></tr>
 <tr><td rowspan="2" valign="bottom"><a name="letter_F"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  F  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classUi__MainWindow.html">Ui_MainWindow</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a> (qgis.pkfilter_spatial)   </td><td valign="top"><a class="el" href="structsvm__model.html">svm_model</a>   </td></tr>
-<tr><td valign="top"><a class="el" href="classUi_1_1MainWindow.html">MainWindow</a> (Ui)   </td><td rowspan="2" valign="bottom"><a name="letter_V"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  V  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a> (qgis.pktools.pkfilter_spatial)   </td><td valign="top"><a class="el" href="structsvm__node.html">svm_node</a>   </td></tr>
-<tr><td valign="top"><a class="el" href="classFeatureSelector.html">FeatureSelector</a>   </td><td valign="top"><a class="el" href="classMainWindow.html">MainWindow</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a> (qgis.pkfilter_spectral)   </td><td valign="top"><a class="el" href="structsvm__parameter.html">svm_parameter</a>   </td></tr>
-<tr><td valign="top"><a class="el" href="classFileReaderAscii.html">FileReaderAscii</a>   </td><td rowspan="2" valign="bottom"><a name="letter_O"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  O  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classVector2d.html">Vector2d</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a> (qgis.pktools.pkfilter_spectral)   </td><td valign="top"><a class="el" href="structsvm__problem.html">svm_problem</a>   </td></tr>
-<tr><td></td><td></td><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a class="el" href="classONE__CLASS__Q.html">ONE_CLASS_Q</a>   </td><td></td><td></td><td></td></tr>
+</td><td rowspan="2" valign="bottom"><a name="letter_M"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  M  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classUi__MainWindow.html">Ui_MainWindow</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a> (qgis.pktools.pkfilter_spectral)   </td><td rowspan="2" valign="bottom"><a name="letter_t"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  t  </div></td></tr></table>
+</td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_V"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  V  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a> (qgis.pktools.pkfilterdem)   </td></tr>
+<tr><td valign="top"><a class="el" href="classFeatureSelector.html">FeatureSelector</a>   </td><td valign="top"><a class="el" href="classUi_1_1MainWindow.html">MainWindow</a> (Ui)   </td><td valign="top"><a class="el" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a> (qgis.pkfilterdem)   </td><td valign="top"><a class="el" href="classFANN_1_1training__data.html">training_data</a> (FANN)   </td></tr>
+<tr><td valign="top"><a class="el" href="classFileReaderAscii.html">FileReaderAscii</a>   </td><td valign="top"><a class="el" href="classMainWindow.html">MainWindow</a>   </td><td valign="top"><a class="el" href="classVector2d.html">Vector2d</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a> (qgis.pkgetmask)   </td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classFileReaderLas.html">FileReaderLas</a>   </td><td rowspan="2" valign="bottom"><a name="letter_O"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  O  </div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_d"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  d  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a> (qgis.pktools.pkgetmask)   </td><td></td></tr>
+<tr><td></td><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a class="el" href="classONE__CLASS__Q.html">ONE_CLASS_Q</a>   </td><td valign="top"><a class="el" href="structdecision__function.html">decision_function</a>   </td><td></td><td></td></tr>
 <tr><td></td><td></td><td></td><td></td><td></td></tr>
 </table>
 <div class="qindex"><a class="qindex" href="#letter_B">B</a> | <a class="qindex" href="#letter_C">C</a> | <a class="qindex" href="#letter_D">D</a> | <a class="qindex" href="#letter_E">E</a> | <a class="qindex" href="#letter_F">F</a> | <a class="qindex" href="#letter_I">I</a> | <a class="qindex" href="#letter_K">K</a> | <a class="qindex" href="#letter_L">L</a> | <a class="qindex" href="#letter_M">M</a> |& [...]
@@ -105,7 +107,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classfilter2d_1_1Filter2d-members.html b/doc/html/classfilter2d_1_1Filter2d-members.html
index 51cbd37..9d64273 100644
--- a/doc/html/classfilter2d_1_1Filter2d-members.html
+++ b/doc/html/classfilter2d_1_1Filter2d-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -108,7 +108,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classfilter2d_1_1Filter2d.html b/doc/html/classfilter2d_1_1Filter2d.html
index 41ac098..41969db 100644
--- a/doc/html/classfilter2d_1_1Filter2d.html
+++ b/doc/html/classfilter2d_1_1Filter2d.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -223,7 +223,7 @@ static const RESAMPLE </td><td class="memItemRight" valign="bottom"><b>getR
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classfilter_1_1Filter-members.html b/doc/html/classfilter_1_1Filter-members.html
index 612e889..81b9e53 100644
--- a/doc/html/classfilter_1_1Filter-members.html
+++ b/doc/html/classfilter_1_1Filter-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -112,30 +112,32 @@
   <tr bgcolor="#f0f0f0"><td class="entry"><b>pushClass</b>(short theClass=1) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>pushMask</b>(short theMask=0) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>pushMask</b>(short theMask=0) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>pushNoDataValue</b>(double noDataValue=0) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>pushNoDataValue</b>(double noDataValue) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>pushThreshold</b>(double theThreshold) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setPadding</b>(const std::string &padString) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setTaps</b>(const std::vector< double > &taps, bool normalize=true) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setNoDataValues</b>(std::vector< double > vnodata) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setPadding</b>(const std::string &padString) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setTaps</b>(const std::vector< double > &taps, bool normalize=true) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setThresholds</b>(const std::vector< double > &theThresholds) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>smooth</b>(const std::vector< T > &input, std::vector< T > &output, short dim) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>smooth</b>(T *input, int inputSize, std::vector< T > &output, short dim) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>smooth</b>(const ImgReaderGdal &input, ImgWriterGdal &output, short dim) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>setTaps</b>(const std::vector< double > &taps, bool normalize=true) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setThresholds</b>(const std::vector< double > &theThresholds) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>smooth</b>(const std::vector< T > &input, std::vector< T > &output, short dim) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>smooth</b>(T *input, int inputSize, std::vector< T > &output, short dim) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>smooth</b>(const ImgReaderGdal &input, ImgWriterGdal &output, short dim) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>smooth</b>(T *input, int inputSize, std::vector< T > &output, short dim) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>smoothNoData</b>(const std::vector< T > &input, const std::string &interpolationType, std::vector< T > &output) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>smoothNoData</b>(const ImgReaderGdal &input, const std::string &interpolationType, ImgWriterGdal &output) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>stat</b>(const ImgReaderGdal &input, ImgWriterGdal &output, const std::string &method) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>smooth</b>(const std::vector< T > &input, std::vector< T > &output, short dim) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>smooth</b>(T *input, int inputSize, std::vector< T > &output, short dim) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>smooth</b>(const ImgReaderGdal &input, ImgWriterGdal &output, short dim) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>smooth</b>(T *input, int inputSize, std::vector< T > &output, short dim) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>smoothNoData</b>(const std::vector< T > &input, const std::string &interpolationType, std::vector< T > &output) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>smoothNoData</b>(const ImgReaderGdal &input, const std::string &interpolationType, ImgWriterGdal &output) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>stat</b>(const ImgReaderGdal &input, ImgWriterGdal &output, const std::string &method) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>stat</b>(const ImgReaderGdal &input, ImgWriterGdal &output, const std::string &method) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>stats</b>(const ImgReaderGdal &input, ImgWriterGdal &output, const std::vector< std::string > &methods) (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>~Filter</b>() (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>~Filter</b>() (defined in <a class="el" href="classfilter_1_1Filter.html">filter::Filter</a>)</td><td class="entry"><a class="el" href="classfilter_1_1Filter.html">filter::Filter</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
 </table></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classfilter_1_1Filter.html b/doc/html/classfilter_1_1Filter.html
index 290f72f..4863f09 100644
--- a/doc/html/classfilter_1_1Filter.html
+++ b/doc/html/classfilter_1_1Filter.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,9 +77,12 @@ void </td><td class="memItemRight" valign="bottom"><b>pushClass</b> (short
 <tr class="memitem:a8023d7e37589845ded33a9ce3cd65dab"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8023d7e37589845ded33a9ce3cd65dab"></a>
 void </td><td class="memItemRight" valign="bottom"><b>pushMask</b> (short theMask=0)</td></tr>
 <tr class="separator:a8023d7e37589845ded33a9ce3cd65dab"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a254aac2b8b994ac02c2022a281731a84"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a254aac2b8b994ac02c2022a281731a84"></a>
-int </td><td class="memItemRight" valign="bottom"><b>pushNoDataValue</b> (double noDataValue=0)</td></tr>
-<tr class="separator:a254aac2b8b994ac02c2022a281731a84"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a296df7520949f10388b337b72609a668"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a296df7520949f10388b337b72609a668"></a>
+unsigned int </td><td class="memItemRight" valign="bottom"><b>pushNoDataValue</b> (double noDataValue)</td></tr>
+<tr class="separator:a296df7520949f10388b337b72609a668"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a65966ac7cadf4f6b0d3cb7fbdfa0fd96"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a65966ac7cadf4f6b0d3cb7fbdfa0fd96"></a>
+unsigned int </td><td class="memItemRight" valign="bottom"><b>setNoDataValues</b> (std::vector< double > vnodata)</td></tr>
+<tr class="separator:a65966ac7cadf4f6b0d3cb7fbdfa0fd96"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a542707e526b3fc1d1a447a160f84790b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a542707e526b3fc1d1a447a160f84790b"></a>
 void </td><td class="memItemRight" valign="bottom"><b>pushThreshold</b> (double theThreshold)</td></tr>
 <tr class="separator:a542707e526b3fc1d1a447a160f84790b"><td class="memSeparator" colspan="2"> </td></tr>
@@ -119,6 +122,9 @@ void </td><td class="memItemRight" valign="bottom"><b>filter</b> (const <a
 <tr class="memitem:ae0e2990875162e2baba5986f351f9b0f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae0e2990875162e2baba5986f351f9b0f"></a>
 void </td><td class="memItemRight" valign="bottom"><b>stat</b> (const <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a> &input, <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a> &output, const std::string &method)</td></tr>
 <tr class="separator:ae0e2990875162e2baba5986f351f9b0f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afac4ecfc1dcaa983c2cea44d4a6b23ce"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afac4ecfc1dcaa983c2cea44d4a6b23ce"></a>
+void </td><td class="memItemRight" valign="bottom"><b>stats</b> (const <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a> &input, <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a> &output, const std::vector< std::string > &methods)</td></tr>
+<tr class="separator:afac4ecfc1dcaa983c2cea44d4a6b23ce"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a050448e66c190a2f56c62686fb0a5215"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a050448e66c190a2f56c62686fb0a5215"></a>
 void </td><td class="memItemRight" valign="bottom"><b>filter</b> (const <a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a> &input, <a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a> &output, const std::string &method, int dim)</td></tr>
 <tr class="separator:a050448e66c190a2f56c62686fb0a5215"><td class="memSeparator" colspan="2"> </td></tr>
@@ -307,7 +313,7 @@ static FILTER_TYPE </td><td class="memItemRight" valign="bottom"><b>getFilt
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classimgregression_1_1ImgRegression-members.html b/doc/html/classimgregression_1_1ImgRegression-members.html
index cc82c3a..7507b21 100644
--- a/doc/html/classimgregression_1_1ImgRegression-members.html
+++ b/doc/html/classimgregression_1_1ImgRegression-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -72,7 +72,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classimgregression_1_1ImgRegression.html b/doc/html/classimgregression_1_1ImgRegression.html
index 1faf630..cee569c 100644
--- a/doc/html/classimgregression_1_1ImgRegression.html
+++ b/doc/html/classimgregression_1_1ImgRegression.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -97,7 +97,7 @@ void </td><td class="memItemRight" valign="bottom"><b>setDown</b> (int theD
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin-members.html b/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin-members.html
index c24b7fe..811c0ef 100644
--- a/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin-members.html
+++ b/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html b/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html
index 53395a8..965c1fe 100644
--- a/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html
+++ b/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -88,7 +88,7 @@ Public Attributes</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite-members.html b/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite-members.html
index 734757b..79bd3f2 100644
--- a/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite-members.html
+++ b/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -85,7 +85,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite.html b/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite.html
index 49509a9..f9fde11 100644
--- a/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite.html
+++ b/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -159,7 +159,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkcrop_1_1pkcrop-members.html b/doc/html/classqgis_1_1pkcrop_1_1pkcrop-members.html
index 1428829..668af7b 100644
--- a/doc/html/classqgis_1_1pkcrop_1_1pkcrop-members.html
+++ b/doc/html/classqgis_1_1pkcrop_1_1pkcrop-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkcrop_1_1pkcrop.html b/doc/html/classqgis_1_1pkcrop_1_1pkcrop.html
index e80c2cb..c2b4a76 100644
--- a/doc/html/classqgis_1_1pkcrop_1_1pkcrop.html
+++ b/doc/html/classqgis_1_1pkcrop_1_1pkcrop.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html b/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html
index b6b4423..a93c6b1 100644
--- a/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html
+++ b/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html b/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
index 4dafc0f..13257ee 100644
--- a/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
+++ b/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract_1_1pkextract-members.html b/doc/html/classqgis_1_1pkextract_1_1pkextract-members.html
index 061a5db..c104fbf 100644
--- a/doc/html/classqgis_1_1pkextract_1_1pkextract-members.html
+++ b/doc/html/classqgis_1_1pkextract_1_1pkextract-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract_1_1pkextract.html b/doc/html/classqgis_1_1pkextract_1_1pkextract.html
index ad7463a..0451abb 100644
--- a/doc/html/classqgis_1_1pkextract_1_1pkextract.html
+++ b/doc/html/classqgis_1_1pkextract_1_1pkextract.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid-members.html b/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid-members.html
index 7f3ddd1..37ec688 100644
--- a/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid-members.html
+++ b/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid.html b/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid.html
index 395d61f..f17b99e 100644
--- a/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid.html
+++ b/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random-members.html b/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random-members.html
index 37e84a7..4cea811 100644
--- a/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random-members.html
+++ b/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random.html b/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random.html
index 1a9e95a..6fd3b48 100644
--- a/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random.html
+++ b/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html b/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html
index 353d1db..7841249 100644
--- a/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html
+++ b/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html b/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html
index a322024..7159bcc 100644
--- a/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html
+++ b/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html b/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html
index 3f07667..9fc4f45 100644
--- a/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html
+++ b/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html b/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html
index 89d0cd0..ea5d9fc 100644
--- a/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html
+++ b/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem-members.html b/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem-members.html
index 8bc1311..76b9fdd 100644
--- a/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem-members.html
+++ b/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -75,7 +75,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem.html b/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem.html
index 31a8c99..b1f7b63 100644
--- a/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem.html
+++ b/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -129,7 +129,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask-members.html b/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask-members.html
index 769541d..6ea29b9 100644
--- a/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask-members.html
+++ b/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html b/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html
index 4c976fd..df38592 100644
--- a/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html
+++ b/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pklas2img_1_1pklas2img-members.html b/doc/html/classqgis_1_1pklas2img_1_1pklas2img-members.html
index f6c8171..57fc4c3 100644
--- a/doc/html/classqgis_1_1pklas2img_1_1pklas2img-members.html
+++ b/doc/html/classqgis_1_1pklas2img_1_1pklas2img-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -82,7 +82,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pklas2img_1_1pklas2img.html b/doc/html/classqgis_1_1pklas2img_1_1pklas2img.html
index bfc29f8..97c51f8 100644
--- a/doc/html/classqgis_1_1pklas2img_1_1pklas2img.html
+++ b/doc/html/classqgis_1_1pklas2img_1_1pklas2img.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -150,7 +150,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkreclass_1_1pkreclass-members.html b/doc/html/classqgis_1_1pkreclass_1_1pkreclass-members.html
index 506f9a1..cf88736 100644
--- a/doc/html/classqgis_1_1pkreclass_1_1pkreclass-members.html
+++ b/doc/html/classqgis_1_1pkreclass_1_1pkreclass-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkreclass_1_1pkreclass.html b/doc/html/classqgis_1_1pkreclass_1_1pkreclass.html
index 0635cf6..c0ea4dc 100644
--- a/doc/html/classqgis_1_1pkreclass_1_1pkreclass.html
+++ b/doc/html/classqgis_1_1pkreclass_1_1pkreclass.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pksetmask_1_1pksetmask-members.html b/doc/html/classqgis_1_1pksetmask_1_1pksetmask-members.html
index 8e13e8b..1175255 100644
--- a/doc/html/classqgis_1_1pksetmask_1_1pksetmask-members.html
+++ b/doc/html/classqgis_1_1pksetmask_1_1pksetmask-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pksetmask_1_1pksetmask.html b/doc/html/classqgis_1_1pksetmask_1_1pksetmask.html
index fa81c7a..4ff6786 100644
--- a/doc/html/classqgis_1_1pksetmask_1_1pksetmask.html
+++ b/doc/html/classqgis_1_1pksetmask_1_1pksetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pksvm_1_1pksvm-members.html b/doc/html/classqgis_1_1pksvm_1_1pksvm-members.html
index d10e083..ca27c29 100644
--- a/doc/html/classqgis_1_1pksvm_1_1pksvm-members.html
+++ b/doc/html/classqgis_1_1pksvm_1_1pksvm-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,7 +77,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pksvm_1_1pksvm.html b/doc/html/classqgis_1_1pksvm_1_1pksvm.html
index 48f803a..d8a2095 100644
--- a/doc/html/classqgis_1_1pksvm_1_1pksvm.html
+++ b/doc/html/classqgis_1_1pksvm_1_1pksvm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -135,7 +135,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html b/doc/html/classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html
index 2615d89..a2709d7 100644
--- a/doc/html/classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html
+++ b/doc/html/classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -235,7 +235,7 @@ when the plugin is unloaded</pre>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html b/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
index 53af5e8..9cefed8 100644
--- a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
+++ b/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -65,7 +65,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html b/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
index 38c14ec..fccdc04 100644
--- a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
+++ b/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -91,7 +91,7 @@ def </td><td class="memItemRight" valign="bottom"><b>help</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html b/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html
index cfb4819..466312d 100644
--- a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html
+++ b/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -65,7 +65,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html b/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html
index c95a86e..2731eed 100644
--- a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html
+++ b/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -85,7 +85,7 @@ string </td><td class="memItemRight" valign="bottom"><b>PKTOOLS_FOLDER</b>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite-members.html b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite-members.html
index 5128852..13d9254 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -85,7 +85,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html
index de3a802..6250964 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -159,7 +159,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop-members.html b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop-members.html
index da0bd22..f03d519 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html
index 0c2af2c..5342ea7 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html
index 2aa73ce..05c3357 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
index add4257..20d05bc 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract-members.html b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract-members.html
index 6381188..0a26df6 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract.html b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract.html
index 82aae98..72ed74d 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid-members.html b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid-members.html
index 036d23d..77bffaa 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html
index 79b85a3..04afa69 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random-members.html b/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random-members.html
index df05b07..f48f4dd 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html b/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html
index 9e0ef6c..e4de0fc 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html b/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html
index 6c60253..bd0eb31 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html b/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html
index 3623b97..6d5ab38 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html b/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html
index a71fe59..b531bd2 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html b/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html
index adfd318..96001f9 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem-members.html b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem-members.html
index 1eb71f9..dfda279 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -75,7 +75,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html
index 003372a..a46515f 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -129,7 +129,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask-members.html b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask-members.html
index fda90ab..d18e9e3 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html
index 5a1bc3f..4327c09 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img-members.html b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img-members.html
index 784f906..ab391ad 100644
--- a/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -82,7 +82,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html
index 20b613b..ef8dab6 100644
--- a/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html
+++ b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -150,7 +150,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass-members.html b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass-members.html
index 3baf581..81c02ca 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html
index 12efa8b..54dafe2 100644
--- a/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask-members.html b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask-members.html
index 8a3c22b..67917d5 100644
--- a/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html
index f1699b9..2399385 100644
--- a/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html
+++ b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm-members.html b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm-members.html
index a335387..da92ea6 100644
--- a/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,7 +77,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm.html b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm.html
index 382f565..3107e2a 100644
--- a/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm.html
+++ b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -135,7 +135,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
index 326093c..8eb5a69 100644
--- a/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -65,7 +65,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
index 6f543c5..d227730 100644
--- a/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
+++ b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -91,7 +91,7 @@ def </td><td class="memItemRight" valign="bottom"><b>help</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils-members.html b/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils-members.html
index cba2b33..234a311 100644
--- a/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -65,7 +65,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html b/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html
index 32035e0..69914e5 100644
--- a/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html
+++ b/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -85,7 +85,7 @@ string </td><td class="memItemRight" valign="bottom"><b>PKTOOLS_FOLDER</b>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classstatfactory_1_1StatFactory-members.html b/doc/html/classstatfactory_1_1StatFactory-members.html
index d95cc52..e6e9985 100644
--- a/doc/html/classstatfactory_1_1StatFactory-members.html
+++ b/doc/html/classstatfactory_1_1StatFactory-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -69,83 +69,86 @@
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cspline</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>cspline_periodic</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cumulative</b>(const std::vector< T > &input, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, std::vector< int > &output, int nbin, T &minimum, T &maximum) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">sta [...]
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>distribution</b>(const std::vector< T > &input, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, std::vector< double > &output, int nbin, T &minimum, T &maximum, double sigma=0, const std::string &filename="") const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a clas [...]
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>distribution</b>(const std::vector< T > &input, std::vector< double > &output, int nbin, double sigma=0, const std::string &filename="") const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inli [...]
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>distribution2d</b>(const std::vector< T > &inputX, const std::vector< T > &inputY, std::vector< std::vector< double > > &output, int nbin, T &minX, T &maxX, T &minY, T &maxY, double sigma=0, const std::string &filename="") const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstat [...]
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>DISTRIBUTION_TYPE</b> enum name (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>eraseNoData</b>(std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>evalSpline</b>(gsl_spline *spline, double x, gsl_interp_accel *acc) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>gaussian</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getDistributionType</b>(const std::string distributionType) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getInterpolationType</b>(const std::string interpolationType) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getNodataValues</b>(std::vector< double > &nodatav) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getRandomGenerator</b>(unsigned long int theSeed) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getRandomValue</b>(const gsl_rng *r, const std::string type, double a=0, double b=1) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getSpline</b>(const std::string type, int size, gsl_spline *&spline) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>gsl_covariance</b>(const std::vector< T > &x, const std::vector< T > &y) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>initSpline</b>(gsl_spline *spline, const double *x, const double *y, int size) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>interpolateDown</b>(const std::vector< T > &input, std::vector< T > &output, int nbin) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>interpolateDown</b>(double *input, int dim, std::vector< T > &output, int nbin) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>interpolateNoData</b>(const std::vector< double > &wavelengthIn, const std::vector< T > &input, const std::string &type, std::vector< T > &output, bool verbose=false) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="en [...]
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>interpolateUp</b>(const std::vector< double > &wavelengthIn, const std::vector< T > &input, const std::vector< double > &wavelengthOut, const std::string &type, std::vector< T > &output, bool verbose=false) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfacto [...]
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>interpolateUp</b>(const std::vector< double > &wavelengthIn, const std::vector< std::vector< T > > &input, const std::vector< double > &wavelengthOut, const std::string &type, std::vector< std::vector< T > > &output, bool verbose=false) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el [...]
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>interpolateUp</b>(const std::vector< T > &input, std::vector< T > &output, int nbin) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>interpolateUp</b>(double *input, int dim, std::vector< T > &output, int nbin) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>INTERPOLATION_TYPE</b> enum name (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>isNoData</b>(double value) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>kurtosis</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>linear</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>linear_regression</b>(const std::vector< T > &x, const std::vector< T > &y, double &c0, double &c1) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>linear_regression_err</b>(const std::vector< T > &x, const std::vector< T > &y, double &c0, double &c1) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>mean</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>meanVar</b>(const std::vector< T > &v, double &m1, double &v1) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>median</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>minmax</b>(const std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, T &theMin, T &theMax) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span clas [...]
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>moment</b>(const std::vector< T > &v, int n) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymax</b>(const typename std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymax</b>(const typename std::vector< T > &v, T maxConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymax</b>(const std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymax</b>(const std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymax</b>(const std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, T maxConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inl [...]
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymax</b>(const std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end, T maxConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymax</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymax</b>(const std::vector< T > &v, T maxConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inl [...]
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const std::vector< T > &v, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nearUp</b>(const std::vector< T > &input, std::vector< T > &output) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>normalize</b>(const std::vector< T > &input, std::vector< double > &output) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>normalize_pct</b>(std::vector< T > &input) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>percentile</b>(const std::vector< T > &input, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, double percent, T minimum=0, T maximum=0) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>percentiles</b>(const std::vector< T > &input, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, std::vector< T > &output, int nbin, T &minimum, T &maximum, const std::string &filename="") const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" hr [...]
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>polynomial</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>pushNodDataValue</b>(double noDataValue) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>rmse</b>(const std::vector< T > &x, const std::vector< T > &y) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>scale2byte</b>(const std::vector< T1 > &input, std::vector< T2 > &output, unsigned char lbound=0, unsigned char ubound=255) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>setNoDataValues</b>(std::vector< double > vnodata) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>signature</b>(const std::vector< T > &input, double &k, double &alpha, double &beta, double e) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>signature</b>(double m1, double m2, double &k, double &alpha, double &beta, double e) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>skewness</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>StatFactory</b>(void) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>sum</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>undefined</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>uniform</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>var</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>~StatFactory</b>(void) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>cvrmse</b>(const std::vector< T > &x, const std::vector< T > &y) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>distribution</b>(const std::vector< T > &input, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, std::vector< double > &output, int nbin, T &minimum, T &maximum, double sigma=0, const std::string &filename="") const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="e [...]
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>distribution</b>(const std::vector< T > &input, std::vector< double > &output, int nbin, double sigma=0, const std::string &filename="") const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>distribution2d</b>(const std::vector< T > &inputX, const std::vector< T > &inputY, std::vector< std::vector< double > > &output, int nbin, T &minX, T &maxX, T &minY, T &maxY, double sigma=0, const std::string &filename="") const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" hr [...]
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>DISTRIBUTION_TYPE</b> enum name (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>eraseNoData</b>(std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>evalSpline</b>(gsl_spline *spline, double x, gsl_interp_accel *acc) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>gaussian</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getDistributionType</b>(const std::string distributionType) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getInterpolationType</b>(const std::string interpolationType) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getNodataValues</b>(std::vector< double > &nodatav) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getRandomGenerator</b>(unsigned long int theSeed) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getRandomValue</b>(const gsl_rng *r, const std::string type, double a=0, double b=1) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getSpline</b>(const std::string type, int size, gsl_spline *&spline) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>gsl_covariance</b>(const std::vector< T > &x, const std::vector< T > &y) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>initSpline</b>(gsl_spline *spline, const double *x, const double *y, int size) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>interpolateDown</b>(const std::vector< T > &input, std::vector< T > &output, int nbin) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>interpolateDown</b>(double *input, int dim, std::vector< T > &output, int nbin) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>interpolateNoData</b>(const std::vector< double > &wavelengthIn, const std::vector< T > &input, const std::string &type, std::vector< T > &output, bool verbose=false) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>interpolateUp</b>(const std::vector< double > &wavelengthIn, const std::vector< T > &input, const std::vector< double > &wavelengthOut, const std::string &type, std::vector< T > &output, bool verbose=false) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.ht [...]
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>interpolateUp</b>(const std::vector< double > &wavelengthIn, const std::vector< std::vector< T > > &input, const std::vector< double > &wavelengthOut, const std::string &type, std::vector< std::vector< T > > &output, bool verbose=false) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="class [...]
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>interpolateUp</b>(const std::vector< T > &input, std::vector< T > &output, int nbin) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>interpolateUp</b>(double *input, int dim, std::vector< T > &output, int nbin) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>INTERPOLATION_TYPE</b> enum name (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>isNoData</b>(double value) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>kurtosis</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>linear</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>linear_regression</b>(const std::vector< T > &x, const std::vector< T > &y, double &c0, double &c1) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>linear_regression_err</b>(const std::vector< T > &x, const std::vector< T > &y, double &c0, double &c1) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mean</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>meanVar</b>(const std::vector< T > &v, double &m1, double &v1) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>median</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>minmax</b>(const std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, T &theMin, T &theMax) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">in [...]
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>moment</b>(const std::vector< T > &v, int n) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymax</b>(const typename std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymax</b>(const typename std::vector< T > &v, T maxConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymax</b>(const std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymax</b>(const std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymax</b>(const std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, T maxConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymax</b>(const std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end, T maxConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></ [...]
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymax</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymax</b>(const std::vector< T > &v, T maxConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const typename std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const std::vector< T > &v, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const std::vector< T > &v, typename std::vector< T >::iterator begin, typename std::vector< T >::iterator end, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></ [...]
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>mymin</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>mymin</b>(const std::vector< T > &v, T minConstraint) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>nearUp</b>(const std::vector< T > &input, std::vector< T > &output) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>normalize</b>(const std::vector< T > &input, std::vector< double > &output) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>normalize_pct</b>(std::vector< T > &input) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nrmse</b>(const std::vector< T > &x, const std::vector< T > &y) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>nvalid</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>percentile</b>(const std::vector< T > &input, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, double percent, T minimum=0, T maximum=0) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td clas [...]
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>percentiles</b>(const std::vector< T > &input, typename std::vector< T >::const_iterator begin, typename std::vector< T >::const_iterator end, std::vector< T > &output, int nbin, T &minimum, T &maximum, const std::string &filename="") const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstat [...]
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>polynomial</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>pushNodDataValue</b>(double noDataValue) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>rmse</b>(const std::vector< T > &x, const std::vector< T > &y) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>scale2byte</b>(const std::vector< T1 > &input, std::vector< T2 > &output, unsigned char lbound=0, unsigned char ubound=255) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>setNoDataValues</b>(std::vector< double > vnodata) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>signature</b>(const std::vector< T > &input, double &k, double &alpha, double &beta, double e) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>signature</b>(double m1, double m2, double &k, double &alpha, double &beta, double e) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>skewness</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>StatFactory</b>(void) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>sum</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>undefined</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>uniform</b> enum value (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>var</b>(const std::vector< T > &v) const  (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>~StatFactory</b>(void) (defined in <a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a>)</td><td class="entry"><a class="el" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
 </table></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classstatfactory_1_1StatFactory.html b/doc/html/classstatfactory_1_1StatFactory.html
index 78cad13..afe1e10 100644
--- a/doc/html/classstatfactory_1_1StatFactory.html
+++ b/doc/html/classstatfactory_1_1StatFactory.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -175,6 +175,10 @@ template<class T > </td></tr>
 template<class T > </td></tr>
 <tr class="memitem:adb66e9d150b0112702c5b033501e0108"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>eraseNoData</b> (std::vector< T > &v) const </td></tr>
 <tr class="separator:adb66e9d150b0112702c5b033501e0108"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa861b82242a65907ccdeada2c1381689"><td class="memTemplParams" colspan="2"><a class="anchor" id="aa861b82242a65907ccdeada2c1381689"></a>
+template<class T > </td></tr>
+<tr class="memitem:aa861b82242a65907ccdeada2c1381689"><td class="memTemplItemLeft" align="right" valign="top">unsigned int </td><td class="memTemplItemRight" valign="bottom"><b>nvalid</b> (const std::vector< T > &v) const </td></tr>
+<tr class="separator:aa861b82242a65907ccdeada2c1381689"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a772be6bff058d3c7edfec58360e524b7"><td class="memTemplParams" colspan="2"><a class="anchor" id="a772be6bff058d3c7edfec58360e524b7"></a>
 template<class T > </td></tr>
 <tr class="memitem:a772be6bff058d3c7edfec58360e524b7"><td class="memTemplItemLeft" align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>median</b> (const std::vector< T > &v) const </td></tr>
@@ -250,6 +254,14 @@ template<class T > </td></tr>
 template<class T > </td></tr>
 <tr class="memitem:a93f585048edfc3a7298698911e3c91ce"><td class="memTemplItemLeft" align="right" valign="top">double </td><td class="memTemplItemRight" valign="bottom"><b>rmse</b> (const std::vector< T > &x, const std::vector< T > &y) const </td></tr>
 <tr class="separator:a93f585048edfc3a7298698911e3c91ce"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a44d5be757c977b7b232de5bcc0e30877"><td class="memTemplParams" colspan="2"><a class="anchor" id="a44d5be757c977b7b232de5bcc0e30877"></a>
+template<class T > </td></tr>
+<tr class="memitem:a44d5be757c977b7b232de5bcc0e30877"><td class="memTemplItemLeft" align="right" valign="top">double </td><td class="memTemplItemRight" valign="bottom"><b>nrmse</b> (const std::vector< T > &x, const std::vector< T > &y) const </td></tr>
+<tr class="separator:a44d5be757c977b7b232de5bcc0e30877"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6f8b64b6f5f9f4bd488f072231ebd5e3"><td class="memTemplParams" colspan="2"><a class="anchor" id="a6f8b64b6f5f9f4bd488f072231ebd5e3"></a>
+template<class T > </td></tr>
+<tr class="memitem:a6f8b64b6f5f9f4bd488f072231ebd5e3"><td class="memTemplItemLeft" align="right" valign="top">double </td><td class="memTemplItemRight" valign="bottom"><b>cvrmse</b> (const std::vector< T > &x, const std::vector< T > &y) const </td></tr>
+<tr class="separator:a6f8b64b6f5f9f4bd488f072231ebd5e3"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a3039e3126ee1e804655224a1b91d8fd4"><td class="memTemplParams" colspan="2"><a class="anchor" id="a3039e3126ee1e804655224a1b91d8fd4"></a>
 template<class T > </td></tr>
 <tr class="memitem:a3039e3126ee1e804655224a1b91d8fd4"><td class="memTemplItemLeft" align="right" valign="top">double </td><td class="memTemplItemRight" valign="bottom"><b>correlation</b> (const std::vector< T > &x, const std::vector< T > &y, int delay=0) const </td></tr>
@@ -363,7 +375,7 @@ static gsl_rng * </td><td class="memItemRight" valign="bottom"><b>getRandom
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/config_8h_source.html b/doc/html/config_8h_source.html
index a879b62..d665fda 100644
--- a/doc/html/config_8h_source.html
+++ b/doc/html/config_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -110,7 +110,7 @@
 <div class="line"><a name="l00060"></a><span class="lineno">   60</span> <span class="preprocessor">#define PACKAGE_NAME "pktools"</span></div>
 <div class="line"><a name="l00061"></a><span class="lineno">   61</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00062"></a><span class="lineno">   62</span> <span class="comment">/* Define to the full name and version of this package. */</span></div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span> <span class="preprocessor">#define PACKAGE_STRING "pktools 2.6.5"</span></div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span> <span class="preprocessor">#define PACKAGE_STRING "pktools 2.6.6"</span></div>
 <div class="line"><a name="l00064"></a><span class="lineno">   64</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00065"></a><span class="lineno">   65</span> <span class="comment">/* Define to the one symbol short name of this package. */</span></div>
 <div class="line"><a name="l00066"></a><span class="lineno">   66</span> <span class="preprocessor">#define PACKAGE_TARNAME "pktools"</span></div>
@@ -119,13 +119,13 @@
 <div class="line"><a name="l00069"></a><span class="lineno">   69</span> <span class="preprocessor">#define PACKAGE_URL ""</span></div>
 <div class="line"><a name="l00070"></a><span class="lineno">   70</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00071"></a><span class="lineno">   71</span> <span class="comment">/* Define to the version of this package. */</span></div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="preprocessor">#define PACKAGE_VERSION "2.6.5"</span></div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="preprocessor">#define PACKAGE_VERSION "2.6.6"</span></div>
 <div class="line"><a name="l00073"></a><span class="lineno">   73</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00074"></a><span class="lineno">   74</span> <span class="comment">/* Define to 1 if you have the ANSI C header files. */</span></div>
 <div class="line"><a name="l00075"></a><span class="lineno">   75</span> <span class="preprocessor">#define STDC_HEADERS 1</span></div>
 <div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="comment">/* Version number of package */</span></div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span> <span class="preprocessor">#define VERSION "2.6.5"</span></div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span> <span class="preprocessor">#define VERSION "2.6.6"</span></div>
 <div class="line"><a name="l00079"></a><span class="lineno">   79</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span> <span class="comment">/* Define to `unsigned int' if <sys/types.h> does not define. */</span></div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span> <span class="comment">/* #undef size_t */</span></div>
@@ -133,7 +133,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_0af1587c8378955de40f48b4bd1869f0.html b/doc/html/dir_0af1587c8378955de40f48b4bd1869f0.html
index 020b515..9348aa8 100644
--- a/doc/html/dir_0af1587c8378955de40f48b4bd1869f0.html
+++ b/doc/html/dir_0af1587c8378955de40f48b4bd1869f0.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -65,6 +65,8 @@ Files</h2></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:PosValue_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>PosValue.h</b> <a href="PosValue_8h_source.html">[code]</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:Vector2d_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>Vector2d.cc</b> <a href="Vector2d_8cc_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:Vector2d_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>Vector2d.h</b> <a href="Vector2d_8h_source.html">[code]</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
@@ -72,7 +74,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_0f38b5d14ac73b43e2a48a75f9e70be8.html b/doc/html/dir_0f38b5d14ac73b43e2a48a75f9e70be8.html
index dfc66c9..83ef990 100644
--- a/doc/html/dir_0f38b5d14ac73b43e2a48a75f9e70be8.html
+++ b/doc/html/dir_0f38b5d14ac73b43e2a48a75f9e70be8.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_0f63d6441a2c250919e1e8723011eb2f.html b/doc/html/dir_0f63d6441a2c250919e1e8723011eb2f.html
index d85ce33..23f8b09 100644
--- a/doc/html/dir_0f63d6441a2c250919e1e8723011eb2f.html
+++ b/doc/html/dir_0f63d6441a2c250919e1e8723011eb2f.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -92,7 +92,7 @@ Directories</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_2676862852e3d558e3597542a81ecc63.html b/doc/html/dir_2676862852e3d558e3597542a81ecc63.html
index 8e22746..5c6193d 100644
--- a/doc/html/dir_2676862852e3d558e3597542a81ecc63.html
+++ b/doc/html/dir_2676862852e3d558e3597542a81ecc63.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_280a0ba2820d23d6529bf494f1ea3ddd.html b/doc/html/dir_280a0ba2820d23d6529bf494f1ea3ddd.html
index f560925..1ea5743 100644
--- a/doc/html/dir_280a0ba2820d23d6529bf494f1ea3ddd.html
+++ b/doc/html/dir_280a0ba2820d23d6529bf494f1ea3ddd.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_35acdce8930fac877097c845a64519e5.html b/doc/html/dir_35acdce8930fac877097c845a64519e5.html
index c517c32..04edc74 100644
--- a/doc/html/dir_35acdce8930fac877097c845a64519e5.html
+++ b/doc/html/dir_35acdce8930fac877097c845a64519e5.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_41d189c72498e24f979b227eb8e138b1.html b/doc/html/dir_41d189c72498e24f979b227eb8e138b1.html
index b8b8ecc..700e8a8 100644
--- a/doc/html/dir_41d189c72498e24f979b227eb8e138b1.html
+++ b/doc/html/dir_41d189c72498e24f979b227eb8e138b1.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_4dfaa1fe1382d1276d1c80b1d5035ade.html b/doc/html/dir_4dfaa1fe1382d1276d1c80b1d5035ade.html
index 6fed25c..5bb7e40 100644
--- a/doc/html/dir_4dfaa1fe1382d1276d1c80b1d5035ade.html
+++ b/doc/html/dir_4dfaa1fe1382d1276d1c80b1d5035ade.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_53adf0b982dc8545998aae3f283a5a58.html b/doc/html/dir_53adf0b982dc8545998aae3f283a5a58.html
index 1cbfc47..a9575da 100644
--- a/doc/html/dir_53adf0b982dc8545998aae3f283a5a58.html
+++ b/doc/html/dir_53adf0b982dc8545998aae3f283a5a58.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -108,8 +108,6 @@ Files</h2></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:pkkalman_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkkalman.cc</b> <a href="pkkalman_8cc_source.html">[code]</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:pkkalman1_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkkalman1.cc</b> <a href="pkkalman1_8cc_source.html">[code]</a></td></tr>
-<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:pklas2img_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pklas2img.cc</b> <a href="pklas2img_8cc_source.html">[code]</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:pkoptsvm_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkoptsvm.cc</b> <a href="pkoptsvm_8cc_source.html">[code]</a></td></tr>
@@ -132,6 +130,8 @@ Files</h2></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:pkstatogr_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkstatogr.cc</b> <a href="pkstatogr_8cc_source.html">[code]</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pkstatprofile_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkstatprofile.cc</b> <a href="pkstatprofile_8cc_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:pksvm_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pksvm.cc</b> <a href="pksvm_8cc_source.html">[code]</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
@@ -139,7 +139,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d.html b/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d.html
index 022019b..26e429b 100644
--- a/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d.html
+++ b/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -105,7 +105,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_5f1e10fd305b434def78aaf73fd56d60.html b/doc/html/dir_5f1e10fd305b434def78aaf73fd56d60.html
index 9689c33..e26f61a 100644
--- a/doc/html/dir_5f1e10fd305b434def78aaf73fd56d60.html
+++ b/doc/html/dir_5f1e10fd305b434def78aaf73fd56d60.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
index 5dd37f6..c24e74a 100644
--- a/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
+++ b/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,7 +74,7 @@ Directories</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html b/doc/html/dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html
index c901878..ed2538f 100644
--- a/doc/html/dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html
+++ b/doc/html/dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -57,6 +57,12 @@ Directory dependency graph for imageclasses:</div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
 Files</h2></td></tr>
+<tr class="memitem:ImgGdal_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>ImgGdal.h</b> <a href="ImgGdal_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ImgRasterGdal_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>ImgRasterGdal.cc</b> <a href="ImgRasterGdal_8cc_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ImgRasterGdal_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>ImgRasterGdal.h</b> <a href="ImgRasterGdal_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ImgReaderGdal_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>ImgReaderGdal.cc</b> <a href="ImgReaderGdal_8cc_source.html">[code]</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ImgReaderGdal_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>ImgReaderGdal.h</b> <a href="ImgReaderGdal_8h_source.html">[code]</a></td></tr>
@@ -65,6 +71,10 @@ Files</h2></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ImgReaderOgr_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>ImgReaderOgr.h</b> <a href="ImgReaderOgr_8h_source.html">[code]</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ImgUpdaterGdal_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>ImgUpdaterGdal.cc</b> <a href="ImgUpdaterGdal_8cc_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ImgUpdaterGdal_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>ImgUpdaterGdal.h</b> <a href="ImgUpdaterGdal_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ImgWriterGdal_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>ImgWriterGdal.cc</b> <a href="ImgWriterGdal_8cc_source.html">[code]</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:ImgWriterGdal_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>ImgWriterGdal.h</b> <a href="ImgWriterGdal_8h_source.html">[code]</a></td></tr>
@@ -78,7 +88,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_849702d4228bd835bdf1201002937cb3.html b/doc/html/dir_849702d4228bd835bdf1201002937cb3.html
index 381973b..a9f278f 100644
--- a/doc/html/dir_849702d4228bd835bdf1201002937cb3.html
+++ b/doc/html/dir_849702d4228bd835bdf1201002937cb3.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_89a0bd85ecec8fbb2c320310670be290.html b/doc/html/dir_89a0bd85ecec8fbb2c320310670be290.html
index 44b2a77..e5be282 100644
--- a/doc/html/dir_89a0bd85ecec8fbb2c320310670be290.html
+++ b/doc/html/dir_89a0bd85ecec8fbb2c320310670be290.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_ab1bbd5a6b4bd6507847335527b029bb.html b/doc/html/dir_ab1bbd5a6b4bd6507847335527b029bb.html
index e711650..1215a50 100644
--- a/doc/html/dir_ab1bbd5a6b4bd6507847335527b029bb.html
+++ b/doc/html/dir_ab1bbd5a6b4bd6507847335527b029bb.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_b66e135988e27fdc966ddddb8708f514.html b/doc/html/dir_b66e135988e27fdc966ddddb8708f514.html
index d79713f..1bb5572 100644
--- a/doc/html/dir_b66e135988e27fdc966ddddb8708f514.html
+++ b/doc/html/dir_b66e135988e27fdc966ddddb8708f514.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_b6b6de371025fb67c6b8623f3d3cd2ce.html b/doc/html/dir_b6b6de371025fb67c6b8623f3d3cd2ce.html
index d114357..ad28052 100644
--- a/doc/html/dir_b6b6de371025fb67c6b8623f3d3cd2ce.html
+++ b/doc/html/dir_b6b6de371025fb67c6b8623f3d3cd2ce.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d.html b/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d.html
index 3ac76c4..1dccf00 100644
--- a/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d.html
+++ b/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -100,7 +100,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_b8eb6544d8d9ffceba16909a7b9d17d7.html b/doc/html/dir_b8eb6544d8d9ffceba16909a7b9d17d7.html
index 344e264..639204b 100644
--- a/doc/html/dir_b8eb6544d8d9ffceba16909a7b9d17d7.html
+++ b/doc/html/dir_b8eb6544d8d9ffceba16909a7b9d17d7.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html b/doc/html/dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html
index f3909eb..2af944a 100644
--- a/doc/html/dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html
+++ b/doc/html/dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_e28b2035b152bb51229fe7a0fca4e376.html b/doc/html/dir_e28b2035b152bb51229fe7a0fca4e376.html
index a80451e..a34b4eb 100644
--- a/doc/html/dir_e28b2035b152bb51229fe7a0fca4e376.html
+++ b/doc/html/dir_e28b2035b152bb51229fe7a0fca4e376.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_e61db0d85028141ec5940fd7f2a6e0fc.html b/doc/html/dir_e61db0d85028141ec5940fd7f2a6e0fc.html
index afbb2df..653ea21 100644
--- a/doc/html/dir_e61db0d85028141ec5940fd7f2a6e0fc.html
+++ b/doc/html/dir_e61db0d85028141ec5940fd7f2a6e0fc.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_e6df591b0639d4c4807ef64d058833e2.html b/doc/html/dir_e6df591b0639d4c4807ef64d058833e2.html
index e93ed5d..9bc95a8 100644
--- a/doc/html/dir_e6df591b0639d4c4807ef64d058833e2.html
+++ b/doc/html/dir_e6df591b0639d4c4807ef64d058833e2.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -102,7 +102,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_ed1df9621940d6aa1183c365ad1750d2.html b/doc/html/dir_ed1df9621940d6aa1183c365ad1750d2.html
index a1e6c8f..fc67059 100644
--- a/doc/html/dir_ed1df9621940d6aa1183c365ad1750d2.html
+++ b/doc/html/dir_ed1df9621940d6aa1183c365ad1750d2.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_f92e37ed5759424bff98155847b1034b.html b/doc/html/dir_f92e37ed5759424bff98155847b1034b.html
index 5eb34c9..122557b 100644
--- a/doc/html/dir_f92e37ed5759424bff98155847b1034b.html
+++ b/doc/html/dir_f92e37ed5759424bff98155847b1034b.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/files.html b/doc/html/files.html
index 2a4d815..b759f96 100644
--- a/doc/html/files.html
+++ b/doc/html/files.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -191,52 +191,54 @@
 <tr id="row_2_1_21_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkgetmask_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkgetmask.cc</b></td><td class="desc"></td></tr>
 <tr id="row_2_1_22_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkinfo_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkinfo.cc</b></td><td class="desc"></td></tr>
 <tr id="row_2_1_23_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkkalman_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkkalman.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_24_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkkalman1_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkkalman1.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_25_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pklas2img_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pklas2img.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_26_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkoptsvm_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkoptsvm.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_27_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkpolygonize_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkpolygonize.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_28_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkreclass_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkreclass.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_29_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkregann_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkregann.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_30_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksensormodel_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksensormodel.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_31_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksetmask_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksetmask.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_32_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksieve_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksieve.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_33_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstat_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstat.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_34_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstatascii_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstatascii.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_35_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstatogr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstatogr.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_24_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pklas2img_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pklas2img.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_25_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkoptsvm_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkoptsvm.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_26_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkpolygonize_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkpolygonize.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_27_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkreclass_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkreclass.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_28_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkregann_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkregann.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_29_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksensormodel_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksensormodel.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_30_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksetmask_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksetmask.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_31_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksieve_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksieve.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_32_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstat_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstat.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_33_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstatascii_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstatascii.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_34_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstatogr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstatogr.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_35_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstatprofile_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstatprofile.cc</b></td><td class="desc"></td></tr>
 <tr id="row_2_1_36_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pksvm_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksvm.cc</b></td><td class="desc"></td></tr>
 <tr id="row_2_2_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_2_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_2_')"/><img id="img_2_2_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_2_')"/><a class="el" href="dir_0af1587c8378955de40f48b4bd1869f0.html" target="_self">base</a></td><td class="desc"></td></tr>
 <tr id="row_2_2_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="IndexValue_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>IndexValue.h</b></td><td class="desc"></td></tr>
 <tr id="row_2_2_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Optionpk_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Optionpk.h</b></td><td class="desc"></td></tr>
 <tr id="row_2_2_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktestOption_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktestOption.cc</b></td><td class="desc"></td></tr>
 <tr id="row_2_2_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="PosValue_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>PosValue.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_2_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="Vector2d_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Vector2d.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_2_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Vector2d_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Vector2d.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_2_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="Vector2d_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Vector2d.h</b></td><td class="desc"></td></tr>
 <tr id="row_2_3_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_3_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_3_')"/><img id="img_2_3_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_3_')"/><a class="el" href="dir_849702d4228bd835bdf1201002937cb3.html" target="_self">fileclasses</a></td><td class="desc"></td></tr>
 <tr id="row_2_3_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="FileReaderAscii_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderAscii.cc</b></td><td class="desc"></td></tr>
 <tr id="row_2_3_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="FileReaderAscii_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderAscii.h</b></td><td class="desc"></td></tr>
 <tr id="row_2_4_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_4_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_4_')"/><img id="img_2_4_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_4_')"/><a class="el" href="dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html" target="_self">imageclasses</a></td><td class="desc"></td></tr>
-<tr id="row_2_4_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderGdal_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderGdal.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderGdal_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderGdal.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderOgr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderOgr.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderOgr_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderOgr.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterGdal_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterGdal.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterGdal_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterGdal.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterOgr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterOgr.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="ImgWriterOgr_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterOgr.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgGdal_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgGdal.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgRasterGdal_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgRasterGdal.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgRasterGdal_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgRasterGdal.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderGdal_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderGdal.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderGdal_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderGdal.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderOgr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderOgr.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderOgr_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderOgr.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgUpdaterGdal_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgUpdaterGdal.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_8_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgUpdaterGdal_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgUpdaterGdal.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_9_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterGdal_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterGdal.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_10_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterGdal_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterGdal.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_11_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterOgr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterOgr.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_12_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="ImgWriterOgr_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterOgr.h</b></td><td class="desc"></td></tr>
 <tr id="row_2_5_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_5_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('2_5_')"/><img id="img_2_5_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_5_')"/><a class="el" href="dir_89a0bd85ecec8fbb2c320310670be290.html" target="_self">lasclasses</a></td><td class="desc"></td></tr>
 <tr id="row_2_5_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="FileReaderLas_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderLas.cc</b></td><td class="desc"></td></tr>
 <tr id="row_2_5_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="FileReaderLas_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderLas.h</b></td><td class="desc"></td></tr>
-<tr id="row_3_" class="even"><td class="entry"><img id="arr_3_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_')"/><img id="img_3_" src="ftv2folderopen.png" alt="-" width="24" height="22" onclick="toggleFolder('3_')"/><a class="el" href="dir_457de909e3893805a4d2d0b8c0742bd8.html" target="_self">vis_studio</a></td><td class="desc"></td></tr>
-<tr id="row_3_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_0_')"/><img id="img_3_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_0_')"/><a class="el" href="dir_0d45166ba6790a432639a127a727f02c.html" target="_self">base</a></td><td class="desc"></td></tr>
-<tr id="row_3_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="Optionpk_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Optionpk.cc</b></td><td class="desc"></td></tr>
-<tr id="row_3_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="vis__studio_2config_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>config.h</b></td><td class="desc"></td></tr>
-<tr id="row_4_"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="config_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>config.h</b></td><td class="desc"></td></tr>
+<tr id="row_3_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="config_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>config.h</b></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/functions.html b/doc/html/functions.html
index a23e3ea..dc4d1c6 100644
--- a/doc/html/functions.html
+++ b/doc/html/functions.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -121,7 +121,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html
index 45c58b8..e26fdd4 100644
--- a/doc/html/functions_func.html
+++ b/doc/html/functions_func.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -118,7 +118,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/functions_rela.html b/doc/html/functions_rela.html
index 65b399a..470f3a6 100644
--- a/doc/html/functions_rela.html
+++ b/doc/html/functions_rela.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -63,7 +63,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/graph_legend.html b/doc/html/graph_legend.html
index ed6f248..cb6c687 100644
--- a/doc/html/graph_legend.html
+++ b/doc/html/graph_legend.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -111,7 +111,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html
index 270bdf7..7e9d511 100644
--- a/doc/html/hierarchy.html
+++ b/doc/html/hierarchy.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,98 +77,103 @@ This inheritance list is sorted roughly, but not completely, alphabetically:</di
 <tr id="row_15_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classfilter2d_1_1Filter2d.html" target="_self">filter2d::Filter2d</a></td><td class="desc"></td></tr>
 <tr id="row_16_" class="even"><td class="entry"><img id="arr_16_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('16_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>FilterI</b></td><td class="desc"></td></tr>
 <tr id="row_16_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classLastReturnFilter.html" target="_self">LastReturnFilter</a></td><td class="desc"></td></tr>
-<tr id="row_17_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderGdal.html" target="_self">ImgReaderGdal</a></td><td class="desc"></td></tr>
+<tr id="row_17_"><td class="entry"><img id="arr_17_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('17_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgRasterGdal.html" target="_self">ImgRasterGdal</a></td><td class="desc"></td></tr>
+<tr id="row_17_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_17_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('17_0_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderGdal.html" target="_self">ImgReaderGdal</a></td><td class="desc"></td></tr>
+<tr id="row_17_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgUpdaterGdal.html" target="_self">ImgUpdaterGdal</a></td><td class="desc"></td></tr>
+<tr id="row_17_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgUpdaterGdal.html" target="_self">ImgUpdaterGdal</a></td><td class="desc"></td></tr>
+<tr id="row_17_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_17_1_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('17_1_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterGdal.html" target="_self">ImgWriterGdal</a></td><td class="desc"></td></tr>
+<tr id="row_17_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgUpdaterGdal.html" target="_self">ImgUpdaterGdal</a></td><td class="desc"></td></tr>
+<tr id="row_17_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgUpdaterGdal.html" target="_self">ImgUpdaterGdal</a></td><td class="desc"></td></tr>
 <tr id="row_18_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderOgr.html" target="_self">ImgReaderOgr</a></td><td class="desc"></td></tr>
 <tr id="row_19_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classimgregression_1_1ImgRegression.html" target="_self">imgregression::ImgRegression</a></td><td class="desc"></td></tr>
-<tr id="row_20_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterGdal.html" target="_self">ImgWriterGdal</a></td><td class="desc"></td></tr>
-<tr id="row_21_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterOgr.html" target="_self">ImgWriterOgr</a></td><td class="desc"></td></tr>
-<tr id="row_22_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__IndexValue.html" target="_self">Increase_IndexValue</a></td><td class="desc"></td></tr>
-<tr id="row_23_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__PosValue.html" target="_self">Increase_PosValue</a></td><td class="desc"></td></tr>
-<tr id="row_24_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structIndexValue.html" target="_self">IndexValue</a></td><td class="desc"></td></tr>
-<tr id="row_25_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFANN_1_1neural__net.html" target="_self">FANN::neural_net</a></td><td class="desc"></td></tr>
-<tr id="row_26_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptFactory.html" target="_self">OptFactory</a></td><td class="desc"></td></tr>
-<tr id="row_27_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" target="_self">qgis.pktoolsUtils.pktoolsUtils</a></td><td class="desc"></td></tr>
-<tr id="row_28_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html" target="_self">qgis.pktools.pktoolsUtils.pktoolsUtils</a></td><td class="desc"></td></tr>
-<tr id="row_29_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structPosValue.html" target="_self">PosValue</a></td><td class="desc"></td></tr>
-<tr id="row_30_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" target="_self">qgis.pktools.ProcessingPktoolsPlugin.ProcessingPktoolsPlugin</a></td><td class="desc"></td></tr>
-<tr id="row_31_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" target="_self">qgis.ProcessingPktoolsPlugin.ProcessingPktoolsPlugin</a></td><td class="desc"></td></tr>
-<tr id="row_32_" class="even"><td class="entry"><img id="arr_32_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('32_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>QMainWindow</b></td><td class="desc"></td></tr>
-<tr id="row_32_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_32_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_32_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_32_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_32_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_33_"><td class="entry"><img id="arr_33_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('33_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classQMatrix.html" target="_self">QMatrix</a></td><td class="desc"></td></tr>
-<tr id="row_33_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_33_0_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('33_0_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classKernel.html" target="_self">Kernel</a></td><td class="desc"></td></tr>
-<tr id="row_33_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classONE__CLASS__Q.html" target="_self">ONE_CLASS_Q</a></td><td class="desc"></td></tr>
-<tr id="row_33_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVC__Q.html" target="_self">SVC_Q</a></td><td class="desc"></td></tr>
-<tr id="row_33_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVR__Q.html" target="_self">SVR_Q</a></td><td class="desc"></td></tr>
-<tr id="row_34_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structSolver_1_1SolutionInfo.html" target="_self">Solver::SolutionInfo</a></td><td class="desc"></td></tr>
-<tr id="row_35_"><td class="entry"><img id="arr_35_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('35_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver.html" target="_self">Solver</a></td><td class="desc"></td></tr>
-<tr id="row_35_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver__NU.html" target="_self">Solver_NU</a></td><td class="desc"></td></tr>
-<tr id="row_36_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classstatfactory_1_1StatFactory.html" target="_self">statfactory::StatFactory</a></td><td class="desc"></td></tr>
-<tr id="row_37_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__model.html" target="_self">svm_model</a></td><td class="desc"></td></tr>
-<tr id="row_38_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__node.html" target="_self">svm_node</a></td><td class="desc"></td></tr>
-<tr id="row_39_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__parameter.html" target="_self">svm_parameter</a></td><td class="desc"></td></tr>
-<tr id="row_40_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__problem.html" target="_self">svm_problem</a></td><td class="desc"></td></tr>
-<tr id="row_41_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFANN_1_1training__data.html" target="_self">FANN::training_data</a></td><td class="desc"></td></tr>
-<tr id="row_42_" class="even"><td class="entry"><img id="arr_42_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('42_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi__MainWindow.html" target="_self">Ui_MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_42_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_42_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_42_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_42_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_42_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_42_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_42_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_42_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_42_8_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_42_9_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_43_"><td class="entry"><img id="arr_43_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('43_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>std::vector< T ></b></td><td class="desc">STL class </td></tr>
-<tr id="row_43_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptionpk.html" target="_self">Optionpk< T ></a></td><td class="desc"></td></tr>
-<tr id="row_43_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d< T ></a></td><td class="desc"></td></tr>
-<tr id="row_43_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d< double ></a></td><td class="desc"></td></tr>
-<tr id="row_44_" class="even"><td class="entry"><img id="arr_44_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('44_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>AlgorithmProvider</b></td><td class="desc"></td></tr>
-<tr id="row_44_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" target="_self">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a></td><td class="desc"></td></tr>
-<tr id="row_44_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" target="_self">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a></td><td class="desc"></td></tr>
-<tr id="row_45_"><td class="entry"><img id="arr_45_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('45_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>GeoAlgorithm</b></td><td class="desc"></td></tr>
-<tr id="row_45_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" target="_self">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="desc"></td></tr>
-<tr id="row_45_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" target="_self">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="desc"></td></tr>
-<tr id="row_46_" class="even"><td class="entry"><img id="arr_46_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('46_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>pktoolsAlgorithm</b></td><td class="desc"></td></tr>
-<tr id="row_46_0_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcomposite_1_1pkcomposite.html" target="_self">qgis.pkcomposite.pkcomposite</a></td><td class="desc"></td></tr>
-<tr id="row_46_1_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcrop_1_1pkcrop.html" target="_self">qgis.pkcrop.pkcrop</a></td><td class="desc"></td></tr>
-<tr id="row_46_2_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" target="_self">qgis.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="desc"></td></tr>
-<tr id="row_46_3_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract_1_1pkextract.html" target="_self">qgis.pkextract.pkextract</a></td><td class="desc"></td></tr>
-<tr id="row_46_4_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html" target="_self">qgis.pkextract_grid.pkextract_grid</a></td><td class="desc"></td></tr>
-<tr id="row_46_5_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__random_1_1pkextract__random.html" target="_self">qgis.pkextract_random.pkextract_random</a></td><td class="desc"></td></tr>
-<tr id="row_46_6_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html" target="_self">qgis.pkfilter_spatial.pkfilter_spatial</a></td><td class="desc"></td></tr>
-<tr id="row_46_7_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html" target="_self">qgis.pkfilter_spectral.pkfilter_spectral</a></td><td class="desc"></td></tr>
-<tr id="row_46_8_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html" target="_self">qgis.pkfilterdem.pkfilterdem</a></td><td class="desc"></td></tr>
-<tr id="row_46_9_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkgetmask_1_1pkgetmask.html" target="_self">qgis.pkgetmask.pkgetmask</a></td><td class="desc"></td></tr>
-<tr id="row_46_10_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pklas2img_1_1pklas2img.html" target="_self">qgis.pklas2img.pklas2img</a></td><td class="desc"></td></tr>
-<tr id="row_46_11_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkreclass_1_1pkreclass.html" target="_self">qgis.pkreclass.pkreclass</a></td><td class="desc"></td></tr>
-<tr id="row_46_12_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksetmask_1_1pksetmask.html" target="_self">qgis.pksetmask.pksetmask</a></td><td class="desc"></td></tr>
-<tr id="row_46_13_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksvm_1_1pksvm.html" target="_self">qgis.pksvm.pksvm</a></td><td class="desc"></td></tr>
-<tr id="row_46_14_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html" target="_self">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="desc"></td></tr>
-<tr id="row_46_15_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html" target="_self">qgis.pktools.pkcrop.pkcrop</a></td><td class="desc"></td></tr>
-<tr id="row_46_16_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" target="_self">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="desc"></td></tr>
-<tr id="row_46_17_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html" target="_self">qgis.pktools.pkextract.pkextract</a></td><td class="desc"></td></tr>
-<tr id="row_46_18_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html" target="_self">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="desc"></td></tr>
-<tr id="row_46_19_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html" target="_self">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="desc"></td></tr>
-<tr id="row_46_20_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html" target="_self">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="desc"></td></tr>
-<tr id="row_46_21_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html" target="_self">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="desc"></td></tr>
-<tr id="row_46_22_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html" target="_self">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="desc"></td></tr>
-<tr id="row_46_23_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html" target="_self">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="desc"></td></tr>
-<tr id="row_46_24_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html" target="_self">qgis.pktools.pklas2img.pklas2img</a></td><td class="desc"></td></tr>
-<tr id="row_46_25_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html" target="_self">qgis.pktools.pkreclass.pkreclass</a></td><td class="desc"></td></tr>
-<tr id="row_46_26_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html" target="_self">qgis.pktools.pksetmask.pksetmask</a></td><td class="desc"></td></tr>
-<tr id="row_46_27_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html" target="_self">qgis.pktools.pksvm.pksvm</a></td><td class="desc"></td></tr>
+<tr id="row_20_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterOgr.html" target="_self">ImgWriterOgr</a></td><td class="desc"></td></tr>
+<tr id="row_21_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__IndexValue.html" target="_self">Increase_IndexValue</a></td><td class="desc"></td></tr>
+<tr id="row_22_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__PosValue.html" target="_self">Increase_PosValue</a></td><td class="desc"></td></tr>
+<tr id="row_23_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structIndexValue.html" target="_self">IndexValue</a></td><td class="desc"></td></tr>
+<tr id="row_24_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFANN_1_1neural__net.html" target="_self">FANN::neural_net</a></td><td class="desc"></td></tr>
+<tr id="row_25_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptFactory.html" target="_self">OptFactory</a></td><td class="desc"></td></tr>
+<tr id="row_26_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" target="_self">qgis.pktoolsUtils.pktoolsUtils</a></td><td class="desc"></td></tr>
+<tr id="row_27_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html" target="_self">qgis.pktools.pktoolsUtils.pktoolsUtils</a></td><td class="desc"></td></tr>
+<tr id="row_28_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structPosValue.html" target="_self">PosValue</a></td><td class="desc"></td></tr>
+<tr id="row_29_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" target="_self">qgis.pktools.ProcessingPktoolsPlugin.ProcessingPktoolsPlugin</a></td><td class="desc"></td></tr>
+<tr id="row_30_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" target="_self">qgis.ProcessingPktoolsPlugin.ProcessingPktoolsPlugin</a></td><td class="desc"></td></tr>
+<tr id="row_31_"><td class="entry"><img id="arr_31_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('31_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>QMainWindow</b></td><td class="desc"></td></tr>
+<tr id="row_31_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_31_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_31_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_31_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_31_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_32_" class="even"><td class="entry"><img id="arr_32_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('32_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classQMatrix.html" target="_self">QMatrix</a></td><td class="desc"></td></tr>
+<tr id="row_32_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_32_0_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('32_0_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classKernel.html" target="_self">Kernel</a></td><td class="desc"></td></tr>
+<tr id="row_32_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classONE__CLASS__Q.html" target="_self">ONE_CLASS_Q</a></td><td class="desc"></td></tr>
+<tr id="row_32_0_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVC__Q.html" target="_self">SVC_Q</a></td><td class="desc"></td></tr>
+<tr id="row_32_0_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVR__Q.html" target="_self">SVR_Q</a></td><td class="desc"></td></tr>
+<tr id="row_33_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structSolver_1_1SolutionInfo.html" target="_self">Solver::SolutionInfo</a></td><td class="desc"></td></tr>
+<tr id="row_34_" class="even"><td class="entry"><img id="arr_34_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('34_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver.html" target="_self">Solver</a></td><td class="desc"></td></tr>
+<tr id="row_34_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver__NU.html" target="_self">Solver_NU</a></td><td class="desc"></td></tr>
+<tr id="row_35_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classstatfactory_1_1StatFactory.html" target="_self">statfactory::StatFactory</a></td><td class="desc"></td></tr>
+<tr id="row_36_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__model.html" target="_self">svm_model</a></td><td class="desc"></td></tr>
+<tr id="row_37_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__node.html" target="_self">svm_node</a></td><td class="desc"></td></tr>
+<tr id="row_38_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__parameter.html" target="_self">svm_parameter</a></td><td class="desc"></td></tr>
+<tr id="row_39_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__problem.html" target="_self">svm_problem</a></td><td class="desc"></td></tr>
+<tr id="row_40_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFANN_1_1training__data.html" target="_self">FANN::training_data</a></td><td class="desc"></td></tr>
+<tr id="row_41_"><td class="entry"><img id="arr_41_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('41_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi__MainWindow.html" target="_self">Ui_MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_41_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_41_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_41_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_41_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_41_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_41_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_41_6_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_41_7_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_41_8_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_41_9_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_42_" class="even"><td class="entry"><img id="arr_42_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('42_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>std::vector< T ></b></td><td class="desc">STL class </td></tr>
+<tr id="row_42_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptionpk.html" target="_self">Optionpk< T ></a></td><td class="desc"></td></tr>
+<tr id="row_42_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d< T ></a></td><td class="desc"></td></tr>
+<tr id="row_42_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d< double ></a></td><td class="desc"></td></tr>
+<tr id="row_43_"><td class="entry"><img id="arr_43_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('43_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>AlgorithmProvider</b></td><td class="desc"></td></tr>
+<tr id="row_43_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" target="_self">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a></td><td class="desc"></td></tr>
+<tr id="row_43_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" target="_self">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a></td><td class="desc"></td></tr>
+<tr id="row_44_" class="even"><td class="entry"><img id="arr_44_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('44_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>GeoAlgorithm</b></td><td class="desc"></td></tr>
+<tr id="row_44_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" target="_self">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="desc"></td></tr>
+<tr id="row_44_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" target="_self">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="desc"></td></tr>
+<tr id="row_45_"><td class="entry"><img id="arr_45_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('45_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>pktoolsAlgorithm</b></td><td class="desc"></td></tr>
+<tr id="row_45_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcomposite_1_1pkcomposite.html" target="_self">qgis.pkcomposite.pkcomposite</a></td><td class="desc"></td></tr>
+<tr id="row_45_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcrop_1_1pkcrop.html" target="_self">qgis.pkcrop.pkcrop</a></td><td class="desc"></td></tr>
+<tr id="row_45_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" target="_self">qgis.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="desc"></td></tr>
+<tr id="row_45_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract_1_1pkextract.html" target="_self">qgis.pkextract.pkextract</a></td><td class="desc"></td></tr>
+<tr id="row_45_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html" target="_self">qgis.pkextract_grid.pkextract_grid</a></td><td class="desc"></td></tr>
+<tr id="row_45_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__random_1_1pkextract__random.html" target="_self">qgis.pkextract_random.pkextract_random</a></td><td class="desc"></td></tr>
+<tr id="row_45_6_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html" target="_self">qgis.pkfilter_spatial.pkfilter_spatial</a></td><td class="desc"></td></tr>
+<tr id="row_45_7_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html" target="_self">qgis.pkfilter_spectral.pkfilter_spectral</a></td><td class="desc"></td></tr>
+<tr id="row_45_8_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html" target="_self">qgis.pkfilterdem.pkfilterdem</a></td><td class="desc"></td></tr>
+<tr id="row_45_9_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkgetmask_1_1pkgetmask.html" target="_self">qgis.pkgetmask.pkgetmask</a></td><td class="desc"></td></tr>
+<tr id="row_45_10_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pklas2img_1_1pklas2img.html" target="_self">qgis.pklas2img.pklas2img</a></td><td class="desc"></td></tr>
+<tr id="row_45_11_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkreclass_1_1pkreclass.html" target="_self">qgis.pkreclass.pkreclass</a></td><td class="desc"></td></tr>
+<tr id="row_45_12_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksetmask_1_1pksetmask.html" target="_self">qgis.pksetmask.pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_45_13_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksvm_1_1pksvm.html" target="_self">qgis.pksvm.pksvm</a></td><td class="desc"></td></tr>
+<tr id="row_45_14_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html" target="_self">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="desc"></td></tr>
+<tr id="row_45_15_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html" target="_self">qgis.pktools.pkcrop.pkcrop</a></td><td class="desc"></td></tr>
+<tr id="row_45_16_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" target="_self">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="desc"></td></tr>
+<tr id="row_45_17_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html" target="_self">qgis.pktools.pkextract.pkextract</a></td><td class="desc"></td></tr>
+<tr id="row_45_18_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html" target="_self">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="desc"></td></tr>
+<tr id="row_45_19_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html" target="_self">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="desc"></td></tr>
+<tr id="row_45_20_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html" target="_self">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="desc"></td></tr>
+<tr id="row_45_21_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html" target="_self">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="desc"></td></tr>
+<tr id="row_45_22_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html" target="_self">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="desc"></td></tr>
+<tr id="row_45_23_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html" target="_self">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="desc"></td></tr>
+<tr id="row_45_24_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html" target="_self">qgis.pktools.pklas2img.pklas2img</a></td><td class="desc"></td></tr>
+<tr id="row_45_25_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html" target="_self">qgis.pktools.pkreclass.pkreclass</a></td><td class="desc"></td></tr>
+<tr id="row_45_26_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html" target="_self">qgis.pktools.pksetmask.pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_45_27_" class="even" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html" target="_self">qgis.pktools.pksvm.pksvm</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/index.html b/doc/html/index.html
index c08453b..930fca1 100644
--- a/doc/html/index.html
+++ b/doc/html/index.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -102,7 +102,7 @@ Bug reports and change requests</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/inherit_graph_18.map b/doc/html/inherit_graph_18.map
index a1b9b12..aeab6d1 100644
--- a/doc/html/inherit_graph_18.map
+++ b/doc/html/inherit_graph_18.map
@@ -1,3 +1,6 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classImgReaderGdal.html" title="ImgReaderGdal" alt="" coords="6,5,119,32"/>
+<area shape="rect" id="node1" href="$classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="6,31,117,57"/>
+<area shape="rect" id="node2" href="$classImgReaderGdal.html" title="ImgReaderGdal" alt="" coords="166,5,279,32"/>
+<area shape="rect" id="node4" href="$classImgWriterGdal.html" title="ImgWriterGdal" alt="" coords="169,56,276,83"/>
+<area shape="rect" id="node3" href="$classImgUpdaterGdal.html" title="ImgUpdaterGdal" alt="" coords="328,31,445,57"/>
 </map>
diff --git a/doc/html/inherit_graph_18.md5 b/doc/html/inherit_graph_18.md5
index 9185b56..29b1966 100644
--- a/doc/html/inherit_graph_18.md5
+++ b/doc/html/inherit_graph_18.md5
@@ -1 +1 @@
-e20a3338ff5cbac8df4dc4de29a54315
\ No newline at end of file
+0370cb3959a2ebebf2f238d36085cf82
\ No newline at end of file
diff --git a/doc/html/inherit_graph_18.png b/doc/html/inherit_graph_18.png
index 178dfc8..8b39e18 100644
Binary files a/doc/html/inherit_graph_18.png and b/doc/html/inherit_graph_18.png differ
diff --git a/doc/html/inherit_graph_21.map b/doc/html/inherit_graph_21.map
index 016eef4..24933aa 100644
--- a/doc/html/inherit_graph_21.map
+++ b/doc/html/inherit_graph_21.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classImgWriterGdal.html" title="ImgWriterGdal" alt="" coords="5,5,112,32"/>
+<area shape="rect" id="node1" href="$classImgWriterOgr.html" title="ImgWriterOgr" alt="" coords="6,5,106,32"/>
 </map>
diff --git a/doc/html/inherit_graph_21.md5 b/doc/html/inherit_graph_21.md5
index dad3d1a..0c84b4a 100644
--- a/doc/html/inherit_graph_21.md5
+++ b/doc/html/inherit_graph_21.md5
@@ -1 +1 @@
-41671d11f31017cab1e0c045e1592946
\ No newline at end of file
+6e5a11fe9edd8d1595a44dfa80dfce6a
\ No newline at end of file
diff --git a/doc/html/inherit_graph_21.png b/doc/html/inherit_graph_21.png
index 1a8cc82..fb54deb 100644
Binary files a/doc/html/inherit_graph_21.png and b/doc/html/inherit_graph_21.png differ
diff --git a/doc/html/inherit_graph_22.map b/doc/html/inherit_graph_22.map
index 24933aa..7962dfa 100644
--- a/doc/html/inherit_graph_22.map
+++ b/doc/html/inherit_graph_22.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classImgWriterOgr.html" title="ImgWriterOgr" alt="" coords="6,5,106,32"/>
+<area shape="rect" id="node1" href="$classIncrease__IndexValue.html" title="Increase_IndexValue" alt="" coords="5,5,149,32"/>
 </map>
diff --git a/doc/html/inherit_graph_22.md5 b/doc/html/inherit_graph_22.md5
index 0c84b4a..a8084a2 100644
--- a/doc/html/inherit_graph_22.md5
+++ b/doc/html/inherit_graph_22.md5
@@ -1 +1 @@
-6e5a11fe9edd8d1595a44dfa80dfce6a
\ No newline at end of file
+d6e93105bd541f3f440ea5342855f537
\ No newline at end of file
diff --git a/doc/html/inherit_graph_22.png b/doc/html/inherit_graph_22.png
index fb54deb..b6cd30d 100644
Binary files a/doc/html/inherit_graph_22.png and b/doc/html/inherit_graph_22.png differ
diff --git a/doc/html/inherit_graph_23.map b/doc/html/inherit_graph_23.map
index 7962dfa..466aba9 100644
--- a/doc/html/inherit_graph_23.map
+++ b/doc/html/inherit_graph_23.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classIncrease__IndexValue.html" title="Increase_IndexValue" alt="" coords="5,5,149,32"/>
+<area shape="rect" id="node1" href="$classIncrease__PosValue.html" title="Increase_PosValue" alt="" coords="6,5,141,32"/>
 </map>
diff --git a/doc/html/inherit_graph_23.md5 b/doc/html/inherit_graph_23.md5
index a8084a2..868ecea 100644
--- a/doc/html/inherit_graph_23.md5
+++ b/doc/html/inherit_graph_23.md5
@@ -1 +1 @@
-d6e93105bd541f3f440ea5342855f537
\ No newline at end of file
+3abc167c2529f40a3c3946792c422224
\ No newline at end of file
diff --git a/doc/html/inherit_graph_23.png b/doc/html/inherit_graph_23.png
index b6cd30d..126932b 100644
Binary files a/doc/html/inherit_graph_23.png and b/doc/html/inherit_graph_23.png differ
diff --git a/doc/html/inherit_graph_24.map b/doc/html/inherit_graph_24.map
index 466aba9..8342af7 100644
--- a/doc/html/inherit_graph_24.map
+++ b/doc/html/inherit_graph_24.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classIncrease__PosValue.html" title="Increase_PosValue" alt="" coords="6,5,141,32"/>
+<area shape="rect" id="node1" href="$structIndexValue.html" title="IndexValue" alt="" coords="6,5,93,32"/>
 </map>
diff --git a/doc/html/inherit_graph_24.md5 b/doc/html/inherit_graph_24.md5
index 868ecea..2b82ca8 100644
--- a/doc/html/inherit_graph_24.md5
+++ b/doc/html/inherit_graph_24.md5
@@ -1 +1 @@
-3abc167c2529f40a3c3946792c422224
\ No newline at end of file
+9a43f2ea03fd9e148d021675b11a669f
\ No newline at end of file
diff --git a/doc/html/inherit_graph_24.png b/doc/html/inherit_graph_24.png
index 126932b..7f96468 100644
Binary files a/doc/html/inherit_graph_24.png and b/doc/html/inherit_graph_24.png differ
diff --git a/doc/html/inherit_graph_25.map b/doc/html/inherit_graph_25.map
index 8342af7..ca98e7b 100644
--- a/doc/html/inherit_graph_25.map
+++ b/doc/html/inherit_graph_25.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structIndexValue.html" title="IndexValue" alt="" coords="6,5,93,32"/>
+<area shape="rect" id="node2" href="$classLastReturnFilter.html" title="LastReturnFilter" alt="" coords="109,5,224,32"/>
 </map>
diff --git a/doc/html/inherit_graph_25.md5 b/doc/html/inherit_graph_25.md5
index 2b82ca8..d606a14 100644
--- a/doc/html/inherit_graph_25.md5
+++ b/doc/html/inherit_graph_25.md5
@@ -1 +1 @@
-9a43f2ea03fd9e148d021675b11a669f
\ No newline at end of file
+036f5f07709542323000a94860133ffe
\ No newline at end of file
diff --git a/doc/html/inherit_graph_25.png b/doc/html/inherit_graph_25.png
index 7f96468..4e0c0d5 100644
Binary files a/doc/html/inherit_graph_25.png and b/doc/html/inherit_graph_25.png differ
diff --git a/doc/html/inherit_graph_26.map b/doc/html/inherit_graph_26.map
index ca98e7b..1c7b0db 100644
--- a/doc/html/inherit_graph_26.map
+++ b/doc/html/inherit_graph_26.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node2" href="$classLastReturnFilter.html" title="LastReturnFilter" alt="" coords="109,5,224,32"/>
+<area shape="rect" id="node2" href="$classMainWindow.html" title="MainWindow" alt="" coords="161,5,258,32"/>
 </map>
diff --git a/doc/html/inherit_graph_26.md5 b/doc/html/inherit_graph_26.md5
index d606a14..bd64fae 100644
--- a/doc/html/inherit_graph_26.md5
+++ b/doc/html/inherit_graph_26.md5
@@ -1 +1 @@
-036f5f07709542323000a94860133ffe
\ No newline at end of file
+56ebfdfc43aa9f9214fa9993b74d1491
\ No newline at end of file
diff --git a/doc/html/inherit_graph_26.png b/doc/html/inherit_graph_26.png
index 4e0c0d5..6d325d1 100644
Binary files a/doc/html/inherit_graph_26.png and b/doc/html/inherit_graph_26.png differ
diff --git a/doc/html/inherit_graph_27.map b/doc/html/inherit_graph_27.map
index 1c7b0db..620e343 100644
--- a/doc/html/inherit_graph_27.map
+++ b/doc/html/inherit_graph_27.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node2" href="$classMainWindow.html" title="MainWindow" alt="" coords="161,5,258,32"/>
+<area shape="rect" id="node1" href="$classOptFactory.html" title="OptFactory" alt="" coords="6,5,93,32"/>
 </map>
diff --git a/doc/html/inherit_graph_27.md5 b/doc/html/inherit_graph_27.md5
index bd64fae..e48f4b3 100644
--- a/doc/html/inherit_graph_27.md5
+++ b/doc/html/inherit_graph_27.md5
@@ -1 +1 @@
-56ebfdfc43aa9f9214fa9993b74d1491
\ No newline at end of file
+c41cbe92df868fb422aa68de81c75529
\ No newline at end of file
diff --git a/doc/html/inherit_graph_27.png b/doc/html/inherit_graph_27.png
index 6d325d1..4a008fd 100644
Binary files a/doc/html/inherit_graph_27.png and b/doc/html/inherit_graph_27.png differ
diff --git a/doc/html/inherit_graph_28.map b/doc/html/inherit_graph_28.map
index 620e343..6a6b04f 100644
--- a/doc/html/inherit_graph_28.map
+++ b/doc/html/inherit_graph_28.map
@@ -1,3 +1,6 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classOptFactory.html" title="OptFactory" alt="" coords="6,5,93,32"/>
+<area shape="rect" id="node1" title="STL class. " alt="" coords="6,56,122,83"/>
+<area shape="rect" id="node2" href="$classOptionpk.html" title="Optionpk\< T \>" alt="" coords="185,5,292,32"/>
+<area shape="rect" id="node3" href="$classVector2d.html" title="Vector2d\< T \>" alt="" coords="185,56,292,83"/>
+<area shape="rect" id="node4" href="$classVector2d.html" title="Vector2d\< double \>" alt="" coords="171,107,307,133"/>
 </map>
diff --git a/doc/html/inherit_graph_28.md5 b/doc/html/inherit_graph_28.md5
index e48f4b3..de165f4 100644
--- a/doc/html/inherit_graph_28.md5
+++ b/doc/html/inherit_graph_28.md5
@@ -1 +1 @@
-c41cbe92df868fb422aa68de81c75529
\ No newline at end of file
+53be632956c02d01c5dba81e3b1b18a2
\ No newline at end of file
diff --git a/doc/html/inherit_graph_28.png b/doc/html/inherit_graph_28.png
index 4a008fd..b19bacf 100644
Binary files a/doc/html/inherit_graph_28.png and b/doc/html/inherit_graph_28.png differ
diff --git a/doc/html/inherit_graph_29.map b/doc/html/inherit_graph_29.map
index 6a6b04f..d1912b6 100644
--- a/doc/html/inherit_graph_29.map
+++ b/doc/html/inherit_graph_29.map
@@ -1,6 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" title="STL class. " alt="" coords="6,56,122,83"/>
-<area shape="rect" id="node2" href="$classOptionpk.html" title="Optionpk\< T \>" alt="" coords="185,5,292,32"/>
-<area shape="rect" id="node3" href="$classVector2d.html" title="Vector2d\< T \>" alt="" coords="185,56,292,83"/>
-<area shape="rect" id="node4" href="$classVector2d.html" title="Vector2d\< double \>" alt="" coords="171,107,307,133"/>
+<area shape="rect" id="node1" href="$structPosValue.html" title="PosValue" alt="" coords="6,5,85,32"/>
 </map>
diff --git a/doc/html/inherit_graph_29.md5 b/doc/html/inherit_graph_29.md5
index de165f4..0d28189 100644
--- a/doc/html/inherit_graph_29.md5
+++ b/doc/html/inherit_graph_29.md5
@@ -1 +1 @@
-53be632956c02d01c5dba81e3b1b18a2
\ No newline at end of file
+0a770de7198bd9b8e8a2468ccef64e90
\ No newline at end of file
diff --git a/doc/html/inherit_graph_29.png b/doc/html/inherit_graph_29.png
index b19bacf..9776235 100644
Binary files a/doc/html/inherit_graph_29.png and b/doc/html/inherit_graph_29.png differ
diff --git a/doc/html/inherit_graph_30.map b/doc/html/inherit_graph_30.map
index d1912b6..7186a79 100644
--- a/doc/html/inherit_graph_30.map
+++ b/doc/html/inherit_graph_30.map
@@ -1,3 +1,30 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structPosValue.html" title="PosValue" alt="" coords="6,5,85,32"/>
+<area shape="rect" id="node2" href="$classqgis_1_1pkcomposite_1_1pkcomposite.html" title="qgis.pkcomposite.pkcomposite" alt="" coords="196,5,399,32"/>
+<area shape="rect" id="node3" href="$classqgis_1_1pkcrop_1_1pkcrop.html" title="qgis.pkcrop.pkcrop" alt="" coords="231,56,363,83"/>
+<area shape="rect" id="node4" href="$classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" title="qgis.pkdiff_accuracy.pkdiff\l_accuracy" alt="" coords="208,107,387,149"/>
+<area shape="rect" id="node5" href="$classqgis_1_1pkextract_1_1pkextract.html" title="qgis.pkextract.pkextract" alt="" coords="216,173,379,200"/>
+<area shape="rect" id="node6" href="$classqgis_1_1pkextract__grid_1_1pkextract__grid.html" title="qgis.pkextract_grid.pkextract_grid" alt="" coords="188,224,407,251"/>
+<area shape="rect" id="node7" href="$classqgis_1_1pkextract__random_1_1pkextract__random.html" title="qgis.pkextract_random.pkextract\l_random" alt="" coords="191,275,403,317"/>
+<area shape="rect" id="node8" href="$classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html" title="qgis.pkfilter_spatial.pkfilter\l_spatial" alt="" coords="209,341,386,382"/>
+<area shape="rect" id="node9" href="$classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html" title="qgis.pkfilter_spectral.pkfilter\l_spectral" alt="" coords="205,406,390,447"/>
+<area shape="rect" id="node10" href="$classqgis_1_1pkfilterdem_1_1pkfilterdem.html" title="qgis.pkfilterdem.pkfilterdem" alt="" coords="206,472,389,499"/>
+<area shape="rect" id="node11" href="$classqgis_1_1pkgetmask_1_1pkgetmask.html" title="qgis.pkgetmask.pkgetmask" alt="" coords="206,523,389,549"/>
+<area shape="rect" id="node12" href="$classqgis_1_1pklas2img_1_1pklas2img.html" title="qgis.pklas2img.pklas2img" alt="" coords="211,573,383,600"/>
+<area shape="rect" id="node13" href="$classqgis_1_1pkreclass_1_1pkreclass.html" title="qgis.pkreclass.pkreclass" alt="" coords="214,624,381,651"/>
+<area shape="rect" id="node14" href="$classqgis_1_1pksetmask_1_1pksetmask.html" title="qgis.pksetmask.pksetmask" alt="" coords="206,675,389,701"/>
+<area shape="rect" id="node15" href="$classqgis_1_1pksvm_1_1pksvm.html" title="qgis.pksvm.pksvm" alt="" coords="231,725,363,752"/>
+<area shape="rect" id="node16" href="$classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html" title="qgis.pktools.pkcomposite.pkcomposite" alt="" coords="173,776,421,803"/>
+<area shape="rect" id="node17" href="$classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html" title="qgis.pktools.pkcrop.pkcrop" alt="" coords="208,827,387,853"/>
+<area shape="rect" id="node18" href="$classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" title="qgis.pktools.pkdiff\l_accuracy.pkdiff_accuracy" alt="" coords="208,878,387,919"/>
+<area shape="rect" id="node19" href="$classqgis_1_1pktools_1_1pkextract_1_1pkextract.html" title="qgis.pktools.pkextract.pkextract" alt="" coords="193,944,401,971"/>
+<area shape="rect" id="node20" href="$classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html" title="qgis.pktools.pkextract\l_grid.pkextract_grid" alt="" coords="222,995,373,1037"/>
+<area shape="rect" id="node21" href="$classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html" title="qgis.pktools.pkextract\l_random.pkextract_random" alt="" coords="207,1061,387,1102"/>
+<area shape="rect" id="node22" href="$classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html" title="qgis.pktools.pkfilter\l_spatial.pkfilter_spatial" alt="" coords="220,1126,375,1167"/>
+<area shape="rect" id="node23" href="$classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html" title="qgis.pktools.pkfilter\l_spectral.pkfilter_spectral" alt="" coords="212,1191,383,1233"/>
+<area shape="rect" id="node24" href="$classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html" title="qgis.pktools.pkfilterdem.pkfilterdem" alt="" coords="183,1257,411,1284"/>
+<area shape="rect" id="node25" href="$classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html" title="qgis.pktools.pkgetmask.pkgetmask" alt="" coords="183,1308,411,1335"/>
+<area shape="rect" id="node26" href="$classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html" title="qgis.pktools.pklas2img.pklas2img" alt="" coords="188,1359,407,1385"/>
+<area shape="rect" id="node27" href="$classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html" title="qgis.pktools.pkreclass.pkreclass" alt="" coords="191,1409,403,1436"/>
+<area shape="rect" id="node28" href="$classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html" title="qgis.pktools.pksetmask.pksetmask" alt="" coords="183,1460,411,1487"/>
+<area shape="rect" id="node29" href="$classqgis_1_1pktools_1_1pksvm_1_1pksvm.html" title="qgis.pktools.pksvm.pksvm" alt="" coords="208,1511,387,1537"/>
 </map>
diff --git a/doc/html/inherit_graph_30.md5 b/doc/html/inherit_graph_30.md5
index 0d28189..7119d49 100644
--- a/doc/html/inherit_graph_30.md5
+++ b/doc/html/inherit_graph_30.md5
@@ -1 +1 @@
-0a770de7198bd9b8e8a2468ccef64e90
\ No newline at end of file
+9954b2c568caef583bc28869e631b0dd
\ No newline at end of file
diff --git a/doc/html/inherit_graph_30.png b/doc/html/inherit_graph_30.png
index 9776235..eba882d 100644
Binary files a/doc/html/inherit_graph_30.png and b/doc/html/inherit_graph_30.png differ
diff --git a/doc/html/inherit_graph_31.map b/doc/html/inherit_graph_31.map
index 7186a79..b2c789c 100644
--- a/doc/html/inherit_graph_31.map
+++ b/doc/html/inherit_graph_31.map
@@ -1,30 +1,4 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node2" href="$classqgis_1_1pkcomposite_1_1pkcomposite.html" title="qgis.pkcomposite.pkcomposite" alt="" coords="196,5,399,32"/>
-<area shape="rect" id="node3" href="$classqgis_1_1pkcrop_1_1pkcrop.html" title="qgis.pkcrop.pkcrop" alt="" coords="231,56,363,83"/>
-<area shape="rect" id="node4" href="$classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" title="qgis.pkdiff_accuracy.pkdiff\l_accuracy" alt="" coords="208,107,387,149"/>
-<area shape="rect" id="node5" href="$classqgis_1_1pkextract_1_1pkextract.html" title="qgis.pkextract.pkextract" alt="" coords="216,173,379,200"/>
-<area shape="rect" id="node6" href="$classqgis_1_1pkextract__grid_1_1pkextract__grid.html" title="qgis.pkextract_grid.pkextract_grid" alt="" coords="188,224,407,251"/>
-<area shape="rect" id="node7" href="$classqgis_1_1pkextract__random_1_1pkextract__random.html" title="qgis.pkextract_random.pkextract\l_random" alt="" coords="191,275,403,317"/>
-<area shape="rect" id="node8" href="$classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html" title="qgis.pkfilter_spatial.pkfilter\l_spatial" alt="" coords="209,341,386,382"/>
-<area shape="rect" id="node9" href="$classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html" title="qgis.pkfilter_spectral.pkfilter\l_spectral" alt="" coords="205,406,390,447"/>
-<area shape="rect" id="node10" href="$classqgis_1_1pkfilterdem_1_1pkfilterdem.html" title="qgis.pkfilterdem.pkfilterdem" alt="" coords="206,472,389,499"/>
-<area shape="rect" id="node11" href="$classqgis_1_1pkgetmask_1_1pkgetmask.html" title="qgis.pkgetmask.pkgetmask" alt="" coords="206,523,389,549"/>
-<area shape="rect" id="node12" href="$classqgis_1_1pklas2img_1_1pklas2img.html" title="qgis.pklas2img.pklas2img" alt="" coords="211,573,383,600"/>
-<area shape="rect" id="node13" href="$classqgis_1_1pkreclass_1_1pkreclass.html" title="qgis.pkreclass.pkreclass" alt="" coords="214,624,381,651"/>
-<area shape="rect" id="node14" href="$classqgis_1_1pksetmask_1_1pksetmask.html" title="qgis.pksetmask.pksetmask" alt="" coords="206,675,389,701"/>
-<area shape="rect" id="node15" href="$classqgis_1_1pksvm_1_1pksvm.html" title="qgis.pksvm.pksvm" alt="" coords="231,725,363,752"/>
-<area shape="rect" id="node16" href="$classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html" title="qgis.pktools.pkcomposite.pkcomposite" alt="" coords="173,776,421,803"/>
-<area shape="rect" id="node17" href="$classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html" title="qgis.pktools.pkcrop.pkcrop" alt="" coords="208,827,387,853"/>
-<area shape="rect" id="node18" href="$classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" title="qgis.pktools.pkdiff\l_accuracy.pkdiff_accuracy" alt="" coords="208,878,387,919"/>
-<area shape="rect" id="node19" href="$classqgis_1_1pktools_1_1pkextract_1_1pkextract.html" title="qgis.pktools.pkextract.pkextract" alt="" coords="193,944,401,971"/>
-<area shape="rect" id="node20" href="$classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html" title="qgis.pktools.pkextract\l_grid.pkextract_grid" alt="" coords="222,995,373,1037"/>
-<area shape="rect" id="node21" href="$classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html" title="qgis.pktools.pkextract\l_random.pkextract_random" alt="" coords="207,1061,387,1102"/>
-<area shape="rect" id="node22" href="$classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html" title="qgis.pktools.pkfilter\l_spatial.pkfilter_spatial" alt="" coords="220,1126,375,1167"/>
-<area shape="rect" id="node23" href="$classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html" title="qgis.pktools.pkfilter\l_spectral.pkfilter_spectral" alt="" coords="212,1191,383,1233"/>
-<area shape="rect" id="node24" href="$classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html" title="qgis.pktools.pkfilterdem.pkfilterdem" alt="" coords="183,1257,411,1284"/>
-<area shape="rect" id="node25" href="$classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html" title="qgis.pktools.pkgetmask.pkgetmask" alt="" coords="183,1308,411,1335"/>
-<area shape="rect" id="node26" href="$classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html" title="qgis.pktools.pklas2img.pklas2img" alt="" coords="188,1359,407,1385"/>
-<area shape="rect" id="node27" href="$classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html" title="qgis.pktools.pkreclass.pkreclass" alt="" coords="191,1409,403,1436"/>
-<area shape="rect" id="node28" href="$classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html" title="qgis.pktools.pksetmask.pksetmask" alt="" coords="183,1460,411,1487"/>
-<area shape="rect" id="node29" href="$classqgis_1_1pktools_1_1pksvm_1_1pksvm.html" title="qgis.pktools.pksvm.pksvm" alt="" coords="208,1511,387,1537"/>
+<area shape="rect" id="node2" href="$classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktools.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="155,5,394,46"/>
+<area shape="rect" id="node3" href="$classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="178,70,371,111"/>
 </map>
diff --git a/doc/html/inherit_graph_31.md5 b/doc/html/inherit_graph_31.md5
index 7119d49..71ce351 100644
--- a/doc/html/inherit_graph_31.md5
+++ b/doc/html/inherit_graph_31.md5
@@ -1 +1 @@
-9954b2c568caef583bc28869e631b0dd
\ No newline at end of file
+3c9304ebe9fdad1e7a503db1c533d0b6
\ No newline at end of file
diff --git a/doc/html/inherit_graph_31.png b/doc/html/inherit_graph_31.png
index eba882d..498932d 100644
Binary files a/doc/html/inherit_graph_31.png and b/doc/html/inherit_graph_31.png differ
diff --git a/doc/html/inherit_graph_32.map b/doc/html/inherit_graph_32.map
index b2c789c..f428487 100644
--- a/doc/html/inherit_graph_32.map
+++ b/doc/html/inherit_graph_32.map
@@ -1,4 +1,4 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node2" href="$classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktools.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="155,5,394,46"/>
-<area shape="rect" id="node3" href="$classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="178,70,371,111"/>
+<area shape="rect" id="node2" href="$classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktools.pktoolsAlgorithm\lProvider.pktoolsAlgorithmProvider" alt="" coords="191,5,409,46"/>
+<area shape="rect" id="node3" href="$classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktoolsAlgorithmProvider.pktools\lAlgorithmProvider" alt="" coords="179,70,421,111"/>
 </map>
diff --git a/doc/html/inherit_graph_32.md5 b/doc/html/inherit_graph_32.md5
index 71ce351..7b3dea2 100644
--- a/doc/html/inherit_graph_32.md5
+++ b/doc/html/inherit_graph_32.md5
@@ -1 +1 @@
-3c9304ebe9fdad1e7a503db1c533d0b6
\ No newline at end of file
+39685cc5d90d6118c44f4d26507483d2
\ No newline at end of file
diff --git a/doc/html/inherit_graph_32.png b/doc/html/inherit_graph_32.png
index 498932d..d9a6035 100644
Binary files a/doc/html/inherit_graph_32.png and b/doc/html/inherit_graph_32.png differ
diff --git a/doc/html/inherit_graph_33.map b/doc/html/inherit_graph_33.map
index f428487..036ffcb 100644
--- a/doc/html/inherit_graph_33.map
+++ b/doc/html/inherit_graph_33.map
@@ -1,4 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node2" href="$classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktools.pktoolsAlgorithm\lProvider.pktoolsAlgorithmProvider" alt="" coords="191,5,409,46"/>
-<area shape="rect" id="node3" href="$classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktoolsAlgorithmProvider.pktools\lAlgorithmProvider" alt="" coords="179,70,421,111"/>
+<area shape="rect" id="node1" href="$classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html" title="qgis.pktools.pktoolsUtils.pktools\lUtils" alt="" coords="5,5,216,46"/>
 </map>
diff --git a/doc/html/inherit_graph_33.md5 b/doc/html/inherit_graph_33.md5
index 7b3dea2..b67dce0 100644
--- a/doc/html/inherit_graph_33.md5
+++ b/doc/html/inherit_graph_33.md5
@@ -1 +1 @@
-39685cc5d90d6118c44f4d26507483d2
\ No newline at end of file
+4fe4b1e5d89e7090871b53cf53608b74
\ No newline at end of file
diff --git a/doc/html/inherit_graph_33.png b/doc/html/inherit_graph_33.png
index d9a6035..575928c 100644
Binary files a/doc/html/inherit_graph_33.png and b/doc/html/inherit_graph_33.png differ
diff --git a/doc/html/inherit_graph_34.map b/doc/html/inherit_graph_34.map
index 036ffcb..21a4589 100644
--- a/doc/html/inherit_graph_34.map
+++ b/doc/html/inherit_graph_34.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html" title="qgis.pktools.pktoolsUtils.pktools\lUtils" alt="" coords="5,5,216,46"/>
+<area shape="rect" id="node1" href="$classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" title="qgis.pktools.ProcessingPktools\lPlugin.ProcessingPktoolsPlugin" alt="" coords="6,5,213,46"/>
 </map>
diff --git a/doc/html/inherit_graph_34.md5 b/doc/html/inherit_graph_34.md5
index b67dce0..af00428 100644
--- a/doc/html/inherit_graph_34.md5
+++ b/doc/html/inherit_graph_34.md5
@@ -1 +1 @@
-4fe4b1e5d89e7090871b53cf53608b74
\ No newline at end of file
+2206cdc4d139a6c86521c0fd8a09da98
\ No newline at end of file
diff --git a/doc/html/inherit_graph_34.png b/doc/html/inherit_graph_34.png
index 575928c..9615251 100644
Binary files a/doc/html/inherit_graph_34.png and b/doc/html/inherit_graph_34.png differ
diff --git a/doc/html/inherit_graph_35.map b/doc/html/inherit_graph_35.map
index 21a4589..7ff2667 100644
--- a/doc/html/inherit_graph_35.map
+++ b/doc/html/inherit_graph_35.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" title="qgis.pktools.ProcessingPktools\lPlugin.ProcessingPktoolsPlugin" alt="" coords="6,5,213,46"/>
+<area shape="rect" id="node1" href="$classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" title="qgis.pktoolsUtils.pktools\lUtils" alt="" coords="5,5,171,46"/>
 </map>
diff --git a/doc/html/inherit_graph_35.md5 b/doc/html/inherit_graph_35.md5
index af00428..92745d9 100644
--- a/doc/html/inherit_graph_35.md5
+++ b/doc/html/inherit_graph_35.md5
@@ -1 +1 @@
-2206cdc4d139a6c86521c0fd8a09da98
\ No newline at end of file
+193a7f60a5ea0dd260be1bdb91bbdc88
\ No newline at end of file
diff --git a/doc/html/inherit_graph_35.png b/doc/html/inherit_graph_35.png
index 9615251..ac6fdf8 100644
Binary files a/doc/html/inherit_graph_35.png and b/doc/html/inherit_graph_35.png differ
diff --git a/doc/html/inherit_graph_36.map b/doc/html/inherit_graph_36.map
index 7ff2667..8422376 100644
--- a/doc/html/inherit_graph_36.map
+++ b/doc/html/inherit_graph_36.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" title="qgis.pktoolsUtils.pktools\lUtils" alt="" coords="5,5,171,46"/>
+<area shape="rect" id="node1" href="$classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" title="qgis.ProcessingPktoolsPlugin.\lProcessingPktoolsPlugin" alt="" coords="6,5,205,46"/>
 </map>
diff --git a/doc/html/inherit_graph_36.md5 b/doc/html/inherit_graph_36.md5
index 92745d9..e735e1f 100644
--- a/doc/html/inherit_graph_36.md5
+++ b/doc/html/inherit_graph_36.md5
@@ -1 +1 @@
-193a7f60a5ea0dd260be1bdb91bbdc88
\ No newline at end of file
+cff7ac1ee5a5232d6e7b82f41627ab2a
\ No newline at end of file
diff --git a/doc/html/inherit_graph_36.png b/doc/html/inherit_graph_36.png
index ac6fdf8..210dc05 100644
Binary files a/doc/html/inherit_graph_36.png and b/doc/html/inherit_graph_36.png differ
diff --git a/doc/html/inherit_graph_37.map b/doc/html/inherit_graph_37.map
index 8422376..e63d8fd 100644
--- a/doc/html/inherit_graph_37.map
+++ b/doc/html/inherit_graph_37.map
@@ -1,3 +1,7 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" title="qgis.ProcessingPktoolsPlugin.\lProcessingPktoolsPlugin" alt="" coords="6,5,205,46"/>
+<area shape="rect" id="node1" href="$classQMatrix.html" title="QMatrix" alt="" coords="6,56,74,83"/>
+<area shape="rect" id="node2" href="$classKernel.html" title="Kernel" alt="" coords="123,56,181,83"/>
+<area shape="rect" id="node3" href="$classONE__CLASS__Q.html" title="ONE_CLASS_Q" alt="" coords="230,5,349,32"/>
+<area shape="rect" id="node4" href="$classSVC__Q.html" title="SVC_Q" alt="" coords="256,56,323,83"/>
+<area shape="rect" id="node5" href="$classSVR__Q.html" title="SVR_Q" alt="" coords="256,107,323,133"/>
 </map>
diff --git a/doc/html/inherit_graph_37.md5 b/doc/html/inherit_graph_37.md5
index e735e1f..1dc682b 100644
--- a/doc/html/inherit_graph_37.md5
+++ b/doc/html/inherit_graph_37.md5
@@ -1 +1 @@
-cff7ac1ee5a5232d6e7b82f41627ab2a
\ No newline at end of file
+e7cc1a9ac7cc7303dcdad4850aa27124
\ No newline at end of file
diff --git a/doc/html/inherit_graph_37.png b/doc/html/inherit_graph_37.png
index 210dc05..99af2bb 100644
Binary files a/doc/html/inherit_graph_37.png and b/doc/html/inherit_graph_37.png differ
diff --git a/doc/html/inherit_graph_38.map b/doc/html/inherit_graph_38.map
index e63d8fd..13ba453 100644
--- a/doc/html/inherit_graph_38.map
+++ b/doc/html/inherit_graph_38.map
@@ -1,7 +1,4 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classQMatrix.html" title="QMatrix" alt="" coords="6,56,74,83"/>
-<area shape="rect" id="node2" href="$classKernel.html" title="Kernel" alt="" coords="123,56,181,83"/>
-<area shape="rect" id="node3" href="$classONE__CLASS__Q.html" title="ONE_CLASS_Q" alt="" coords="230,5,349,32"/>
-<area shape="rect" id="node4" href="$classSVC__Q.html" title="SVC_Q" alt="" coords="256,56,323,83"/>
-<area shape="rect" id="node5" href="$classSVR__Q.html" title="SVR_Q" alt="" coords="256,107,323,133"/>
+<area shape="rect" id="node1" href="$classSolver.html" title="Solver" alt="" coords="5,5,64,32"/>
+<area shape="rect" id="node2" href="$classSolver__NU.html" title="Solver_NU" alt="" coords="113,5,199,32"/>
 </map>
diff --git a/doc/html/inherit_graph_38.md5 b/doc/html/inherit_graph_38.md5
index 1dc682b..5d06ade 100644
--- a/doc/html/inherit_graph_38.md5
+++ b/doc/html/inherit_graph_38.md5
@@ -1 +1 @@
-e7cc1a9ac7cc7303dcdad4850aa27124
\ No newline at end of file
+7be29cee47604c598e9b41d6f6d26540
\ No newline at end of file
diff --git a/doc/html/inherit_graph_38.png b/doc/html/inherit_graph_38.png
index 99af2bb..a8f4610 100644
Binary files a/doc/html/inherit_graph_38.png and b/doc/html/inherit_graph_38.png differ
diff --git a/doc/html/inherit_graph_39.map b/doc/html/inherit_graph_39.map
index 13ba453..ee2aeb5 100644
--- a/doc/html/inherit_graph_39.map
+++ b/doc/html/inherit_graph_39.map
@@ -1,4 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classSolver.html" title="Solver" alt="" coords="5,5,64,32"/>
-<area shape="rect" id="node2" href="$classSolver__NU.html" title="Solver_NU" alt="" coords="113,5,199,32"/>
+<area shape="rect" id="node1" href="$structSolver_1_1SolutionInfo.html" title="Solver::SolutionInfo" alt="" coords="5,5,141,32"/>
 </map>
diff --git a/doc/html/inherit_graph_39.md5 b/doc/html/inherit_graph_39.md5
index 5d06ade..77ada4a 100644
--- a/doc/html/inherit_graph_39.md5
+++ b/doc/html/inherit_graph_39.md5
@@ -1 +1 @@
-7be29cee47604c598e9b41d6f6d26540
\ No newline at end of file
+eb536ae09518c9401a3cc68fe8336845
\ No newline at end of file
diff --git a/doc/html/inherit_graph_39.png b/doc/html/inherit_graph_39.png
index a8f4610..6157226 100644
Binary files a/doc/html/inherit_graph_39.png and b/doc/html/inherit_graph_39.png differ
diff --git a/doc/html/inherit_graph_40.map b/doc/html/inherit_graph_40.map
index ee2aeb5..38dc8ea 100644
--- a/doc/html/inherit_graph_40.map
+++ b/doc/html/inherit_graph_40.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structSolver_1_1SolutionInfo.html" title="Solver::SolutionInfo" alt="" coords="5,5,141,32"/>
+<area shape="rect" id="node1" href="$classstatfactory_1_1StatFactory.html" title="statfactory::StatFactory" alt="" coords="5,5,165,32"/>
 </map>
diff --git a/doc/html/inherit_graph_40.md5 b/doc/html/inherit_graph_40.md5
index 77ada4a..12d0f53 100644
--- a/doc/html/inherit_graph_40.md5
+++ b/doc/html/inherit_graph_40.md5
@@ -1 +1 @@
-eb536ae09518c9401a3cc68fe8336845
\ No newline at end of file
+87aa7d801c4fb0d24fa9d29992fafeb1
\ No newline at end of file
diff --git a/doc/html/inherit_graph_40.png b/doc/html/inherit_graph_40.png
index 6157226..8414ef4 100644
Binary files a/doc/html/inherit_graph_40.png and b/doc/html/inherit_graph_40.png differ
diff --git a/doc/html/inherit_graph_41.map b/doc/html/inherit_graph_41.map
index 38dc8ea..db2638c 100644
--- a/doc/html/inherit_graph_41.map
+++ b/doc/html/inherit_graph_41.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classstatfactory_1_1StatFactory.html" title="statfactory::StatFactory" alt="" coords="5,5,165,32"/>
+<area shape="rect" id="node1" href="$structsvm__model.html" title="svm_model" alt="" coords="6,5,95,32"/>
 </map>
diff --git a/doc/html/inherit_graph_41.md5 b/doc/html/inherit_graph_41.md5
index 12d0f53..353d6e5 100644
--- a/doc/html/inherit_graph_41.md5
+++ b/doc/html/inherit_graph_41.md5
@@ -1 +1 @@
-87aa7d801c4fb0d24fa9d29992fafeb1
\ No newline at end of file
+7b410ece4435bb5898273f794141ca12
\ No newline at end of file
diff --git a/doc/html/inherit_graph_41.png b/doc/html/inherit_graph_41.png
index 8414ef4..74ce854 100644
Binary files a/doc/html/inherit_graph_41.png and b/doc/html/inherit_graph_41.png differ
diff --git a/doc/html/inherit_graph_42.map b/doc/html/inherit_graph_42.map
index db2638c..7b61c83 100644
--- a/doc/html/inherit_graph_42.map
+++ b/doc/html/inherit_graph_42.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structsvm__model.html" title="svm_model" alt="" coords="6,5,95,32"/>
+<area shape="rect" id="node1" href="$structsvm__node.html" title="svm_node" alt="" coords="5,5,88,32"/>
 </map>
diff --git a/doc/html/inherit_graph_42.md5 b/doc/html/inherit_graph_42.md5
index 353d6e5..c429b4a 100644
--- a/doc/html/inherit_graph_42.md5
+++ b/doc/html/inherit_graph_42.md5
@@ -1 +1 @@
-7b410ece4435bb5898273f794141ca12
\ No newline at end of file
+2af511324d18119462e473d0dca2ff4c
\ No newline at end of file
diff --git a/doc/html/inherit_graph_42.png b/doc/html/inherit_graph_42.png
index 74ce854..24bc575 100644
Binary files a/doc/html/inherit_graph_42.png and b/doc/html/inherit_graph_42.png differ
diff --git a/doc/html/inherit_graph_43.map b/doc/html/inherit_graph_43.map
index 7b61c83..ce31d5f 100644
--- a/doc/html/inherit_graph_43.map
+++ b/doc/html/inherit_graph_43.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structsvm__node.html" title="svm_node" alt="" coords="5,5,88,32"/>
+<area shape="rect" id="node1" href="$structsvm__parameter.html" title="svm_parameter" alt="" coords="5,5,117,32"/>
 </map>
diff --git a/doc/html/inherit_graph_43.md5 b/doc/html/inherit_graph_43.md5
index c429b4a..484819e 100644
--- a/doc/html/inherit_graph_43.md5
+++ b/doc/html/inherit_graph_43.md5
@@ -1 +1 @@
-2af511324d18119462e473d0dca2ff4c
\ No newline at end of file
+9c46a02da171be2dc8c99dffaea9ef17
\ No newline at end of file
diff --git a/doc/html/inherit_graph_43.png b/doc/html/inherit_graph_43.png
index 24bc575..bf8a624 100644
Binary files a/doc/html/inherit_graph_43.png and b/doc/html/inherit_graph_43.png differ
diff --git a/doc/html/inherit_graph_44.map b/doc/html/inherit_graph_44.map
index ce31d5f..3f7b1ce 100644
--- a/doc/html/inherit_graph_44.map
+++ b/doc/html/inherit_graph_44.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structsvm__parameter.html" title="svm_parameter" alt="" coords="5,5,117,32"/>
+<area shape="rect" id="node1" href="$structsvm__problem.html" title="svm_problem" alt="" coords="6,5,106,32"/>
 </map>
diff --git a/doc/html/inherit_graph_44.md5 b/doc/html/inherit_graph_44.md5
index 484819e..ee30b79 100644
--- a/doc/html/inherit_graph_44.md5
+++ b/doc/html/inherit_graph_44.md5
@@ -1 +1 @@
-9c46a02da171be2dc8c99dffaea9ef17
\ No newline at end of file
+aadebe5d38499b3e0dfb844f4a073095
\ No newline at end of file
diff --git a/doc/html/inherit_graph_44.png b/doc/html/inherit_graph_44.png
index bf8a624..5411fdc 100644
Binary files a/doc/html/inherit_graph_44.png and b/doc/html/inherit_graph_44.png differ
diff --git a/doc/html/inherit_graph_45.map b/doc/html/inherit_graph_45.map
index 3f7b1ce..242be84 100644
--- a/doc/html/inherit_graph_45.map
+++ b/doc/html/inherit_graph_45.map
@@ -1,3 +1,4 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structsvm__problem.html" title="svm_problem" alt="" coords="6,5,106,32"/>
+<area shape="rect" id="node1" href="$classUi__MainWindow.html" title="Ui_MainWindow" alt="" coords="5,5,123,32"/>
+<area shape="rect" id="node2" href="$classUi_1_1MainWindow.html" title="Ui::MainWindow" alt="" coords="171,5,290,32"/>
 </map>
diff --git a/doc/html/inherit_graph_45.md5 b/doc/html/inherit_graph_45.md5
index ee30b79..4054bc0 100644
--- a/doc/html/inherit_graph_45.md5
+++ b/doc/html/inherit_graph_45.md5
@@ -1 +1 @@
-aadebe5d38499b3e0dfb844f4a073095
\ No newline at end of file
+62ce278189506cc1c0752d729480526e
\ No newline at end of file
diff --git a/doc/html/inherit_graph_45.png b/doc/html/inherit_graph_45.png
index 5411fdc..4742656 100644
Binary files a/doc/html/inherit_graph_45.png and b/doc/html/inherit_graph_45.png differ
diff --git a/doc/html/inherits.html b/doc/html/inherits.html
index 6e456fe..40814d2 100644
--- a/doc/html/inherits.html
+++ b/doc/html/inherits.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -126,9 +126,9 @@
 <map name="filter_1_1Filter" id="filter_1_1Filter">
 <area shape="rect" id="node1" href="classfilter_1_1Filter.html" title="filter::Filter" alt="" coords="6,5,90,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_18.png" border="0" alt="" usemap="#ImgReaderGdal"/>
-<map name="ImgReaderGdal" id="ImgReaderGdal">
-<area shape="rect" id="node1" href="classImgReaderGdal.html" title="ImgReaderGdal" alt="" coords="6,5,119,32"/></map>
+<tr><td><img src="inherit_graph_18.png" border="0" alt="" usemap="#ImgRasterGdal"/>
+<map name="ImgRasterGdal" id="ImgRasterGdal">
+<area shape="rect" id="node1" href="classImgRasterGdal.html" title="ImgRasterGdal" alt="" coords="6,31,117,57"/><area shape="rect" id="node2" href="classImgReaderGdal.html" title="ImgReaderGdal" alt="" coords="166,5,279,32"/><area shape="rect" id="node4" href="classImgWriterGdal.html" title="ImgWriterGdal" alt="" coords="169,56,276,83"/><area shape="rect" id="node3" href="classImgUpdaterGdal.html" title="ImgUpdaterGdal" alt="" coords="328,31,445,57"/></map>
 </td></tr>
 <tr><td><img src="inherit_graph_19.png" border="0" alt="" usemap="#ImgReaderOgr"/>
 <map name="ImgReaderOgr" id="ImgReaderOgr">
@@ -138,107 +138,103 @@
 <map name="imgregression_1_1ImgRegression" id="imgregression_1_1ImgRegression">
 <area shape="rect" id="node1" href="classimgregression_1_1ImgRegression.html" title="imgregression::ImgRegression" alt="" coords="6,5,205,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_21.png" border="0" alt="" usemap="#ImgWriterGdal"/>
-<map name="ImgWriterGdal" id="ImgWriterGdal">
-<area shape="rect" id="node1" href="classImgWriterGdal.html" title="ImgWriterGdal" alt="" coords="5,5,112,32"/></map>
-</td></tr>
-<tr><td><img src="inherit_graph_22.png" border="0" alt="" usemap="#ImgWriterOgr"/>
+<tr><td><img src="inherit_graph_21.png" border="0" alt="" usemap="#ImgWriterOgr"/>
 <map name="ImgWriterOgr" id="ImgWriterOgr">
 <area shape="rect" id="node1" href="classImgWriterOgr.html" title="ImgWriterOgr" alt="" coords="6,5,106,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_23.png" border="0" alt="" usemap="#Increase__IndexValue"/>
+<tr><td><img src="inherit_graph_22.png" border="0" alt="" usemap="#Increase__IndexValue"/>
 <map name="Increase__IndexValue" id="Increase__IndexValue">
 <area shape="rect" id="node1" href="classIncrease__IndexValue.html" title="Increase_IndexValue" alt="" coords="5,5,149,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_24.png" border="0" alt="" usemap="#Increase__PosValue"/>
+<tr><td><img src="inherit_graph_23.png" border="0" alt="" usemap="#Increase__PosValue"/>
 <map name="Increase__PosValue" id="Increase__PosValue">
 <area shape="rect" id="node1" href="classIncrease__PosValue.html" title="Increase_PosValue" alt="" coords="6,5,141,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_25.png" border="0" alt="" usemap="#IndexValue"/>
+<tr><td><img src="inherit_graph_24.png" border="0" alt="" usemap="#IndexValue"/>
 <map name="IndexValue" id="IndexValue">
 <area shape="rect" id="node1" href="structIndexValue.html" title="IndexValue" alt="" coords="6,5,93,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_26.png" border="0" alt="" usemap="#LastReturnFilter"/>
+<tr><td><img src="inherit_graph_25.png" border="0" alt="" usemap="#LastReturnFilter"/>
 <map name="LastReturnFilter" id="LastReturnFilter">
 <area shape="rect" id="node2" href="classLastReturnFilter.html" title="LastReturnFilter" alt="" coords="109,5,224,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_27.png" border="0" alt="" usemap="#MainWindow"/>
+<tr><td><img src="inherit_graph_26.png" border="0" alt="" usemap="#MainWindow"/>
 <map name="MainWindow" id="MainWindow">
 <area shape="rect" id="node2" href="classMainWindow.html" title="MainWindow" alt="" coords="161,5,258,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_28.png" border="0" alt="" usemap="#OptFactory"/>
+<tr><td><img src="inherit_graph_27.png" border="0" alt="" usemap="#OptFactory"/>
 <map name="OptFactory" id="OptFactory">
 <area shape="rect" id="node1" href="classOptFactory.html" title="OptFactory" alt="" coords="6,5,93,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_29.png" border="0" alt="" usemap="#Optionpk_3_01T_01_4"/>
+<tr><td><img src="inherit_graph_28.png" border="0" alt="" usemap="#Optionpk_3_01T_01_4"/>
 <map name="Optionpk_3_01T_01_4" id="Optionpk_3_01T_01_4">
 <area shape="rect" id="node1" title="STL class. " alt="" coords="6,56,122,83"/><area shape="rect" id="node2" href="classOptionpk.html" title="Optionpk\< T \>" alt="" coords="185,5,292,32"/><area shape="rect" id="node3" href="classVector2d.html" title="Vector2d\< T \>" alt="" coords="185,56,292,83"/><area shape="rect" id="node4" href="classVector2d.html" title="Vector2d\< double \>" alt="" coords="171,107,307,133"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_30.png" border="0" alt="" usemap="#PosValue"/>
+<tr><td><img src="inherit_graph_29.png" border="0" alt="" usemap="#PosValue"/>
 <map name="PosValue" id="PosValue">
 <area shape="rect" id="node1" href="structPosValue.html" title="PosValue" alt="" coords="6,5,85,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_31.png" border="0" alt="" usemap="#qgis_8pkcomposite_8pkcomposite"/>
+<tr><td><img src="inherit_graph_30.png" border="0" alt="" usemap="#qgis_8pkcomposite_8pkcomposite"/>
 <map name="qgis_8pkcomposite_8pkcomposite" id="qgis_8pkcomposite_8pkcomposite">
 <area shape="rect" id="node2" href="classqgis_1_1pkcomposite_1_1pkcomposite.html" title="qgis.pkcomposite.pkcomposite" alt="" coords="196,5,399,32"/><area shape="rect" id="node3" href="classqgis_1_1pkcrop_1_1pkcrop.html" title="qgis.pkcrop.pkcrop" alt="" coords="231,56,363,83"/><area shape="rect" id="node4" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" title="qgis.pkdiff_accuracy.pkdiff\l_accuracy" alt="" coords="208,107,387,149"/><area shape="rect" id="node5" href="class [...]
 </td></tr>
-<tr><td><img src="inherit_graph_32.png" border="0" alt="" usemap="#qgis_8pktools_8pktoolsAlgorithm_8pktoolsAlgorithm"/>
+<tr><td><img src="inherit_graph_31.png" border="0" alt="" usemap="#qgis_8pktools_8pktoolsAlgorithm_8pktoolsAlgorithm"/>
 <map name="qgis_8pktools_8pktoolsAlgorithm_8pktoolsAlgorithm" id="qgis_8pktools_8pktoolsAlgorithm_8pktoolsAlgorithm">
 <area shape="rect" id="node2" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktools.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="155,5,394,46"/><area shape="rect" id="node3" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="178,70,371,111"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_33.png" border="0" alt="" usemap="#qgis_8pktools_8pktoolsAlgorithmProvider_8pktoolsAlgorithmProvider"/>
+<tr><td><img src="inherit_graph_32.png" border="0" alt="" usemap="#qgis_8pktools_8pktoolsAlgorithmProvider_8pktoolsAlgorithmProvider"/>
 <map name="qgis_8pktools_8pktoolsAlgorithmProvider_8pktoolsAlgorithmProvider" id="qgis_8pktools_8pktoolsAlgorithmProvider_8pktoolsAlgorithmProvider">
 <area shape="rect" id="node2" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktools.pktoolsAlgorithm\lProvider.pktoolsAlgorithmProvider" alt="" coords="191,5,409,46"/><area shape="rect" id="node3" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktoolsAlgorithmProvider.pktools\lAlgorithmProvider" alt="" coords="179,70,421,111"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_34.png" border="0" alt="" usemap="#qgis_8pktools_8pktoolsUtils_8pktoolsUtils"/>
+<tr><td><img src="inherit_graph_33.png" border="0" alt="" usemap="#qgis_8pktools_8pktoolsUtils_8pktoolsUtils"/>
 <map name="qgis_8pktools_8pktoolsUtils_8pktoolsUtils" id="qgis_8pktools_8pktoolsUtils_8pktoolsUtils">
 <area shape="rect" id="node1" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html" title="qgis.pktools.pktoolsUtils.pktools\lUtils" alt="" coords="5,5,216,46"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_35.png" border="0" alt="" usemap="#qgis_8pktools_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin"/>
+<tr><td><img src="inherit_graph_34.png" border="0" alt="" usemap="#qgis_8pktools_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin"/>
 <map name="qgis_8pktools_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin" id="qgis_8pktools_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin">
 <area shape="rect" id="node1" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" title="qgis.pktools.ProcessingPktools\lPlugin.ProcessingPktoolsPlugin" alt="" coords="6,5,213,46"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_36.png" border="0" alt="" usemap="#qgis_8pktoolsUtils_8pktoolsUtils"/>
+<tr><td><img src="inherit_graph_35.png" border="0" alt="" usemap="#qgis_8pktoolsUtils_8pktoolsUtils"/>
 <map name="qgis_8pktoolsUtils_8pktoolsUtils" id="qgis_8pktoolsUtils_8pktoolsUtils">
 <area shape="rect" id="node1" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" title="qgis.pktoolsUtils.pktools\lUtils" alt="" coords="5,5,171,46"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_37.png" border="0" alt="" usemap="#qgis_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin"/>
+<tr><td><img src="inherit_graph_36.png" border="0" alt="" usemap="#qgis_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin"/>
 <map name="qgis_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin" id="qgis_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin">
 <area shape="rect" id="node1" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" title="qgis.ProcessingPktoolsPlugin.\lProcessingPktoolsPlugin" alt="" coords="6,5,205,46"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_38.png" border="0" alt="" usemap="#QMatrix"/>
+<tr><td><img src="inherit_graph_37.png" border="0" alt="" usemap="#QMatrix"/>
 <map name="QMatrix" id="QMatrix">
 <area shape="rect" id="node1" href="classQMatrix.html" title="QMatrix" alt="" coords="6,56,74,83"/><area shape="rect" id="node2" href="classKernel.html" title="Kernel" alt="" coords="123,56,181,83"/><area shape="rect" id="node3" href="classONE__CLASS__Q.html" title="ONE_CLASS_Q" alt="" coords="230,5,349,32"/><area shape="rect" id="node4" href="classSVC__Q.html" title="SVC_Q" alt="" coords="256,56,323,83"/><area shape="rect" id="node5" href="classSVR__Q.html" title="SVR_Q" alt="" coords=" [...]
 </td></tr>
-<tr><td><img src="inherit_graph_39.png" border="0" alt="" usemap="#Solver"/>
+<tr><td><img src="inherit_graph_38.png" border="0" alt="" usemap="#Solver"/>
 <map name="Solver" id="Solver">
 <area shape="rect" id="node1" href="classSolver.html" title="Solver" alt="" coords="5,5,64,32"/><area shape="rect" id="node2" href="classSolver__NU.html" title="Solver_NU" alt="" coords="113,5,199,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_40.png" border="0" alt="" usemap="#Solver_1_1SolutionInfo"/>
+<tr><td><img src="inherit_graph_39.png" border="0" alt="" usemap="#Solver_1_1SolutionInfo"/>
 <map name="Solver_1_1SolutionInfo" id="Solver_1_1SolutionInfo">
 <area shape="rect" id="node1" href="structSolver_1_1SolutionInfo.html" title="Solver::SolutionInfo" alt="" coords="5,5,141,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_41.png" border="0" alt="" usemap="#statfactory_1_1StatFactory"/>
+<tr><td><img src="inherit_graph_40.png" border="0" alt="" usemap="#statfactory_1_1StatFactory"/>
 <map name="statfactory_1_1StatFactory" id="statfactory_1_1StatFactory">
 <area shape="rect" id="node1" href="classstatfactory_1_1StatFactory.html" title="statfactory::StatFactory" alt="" coords="5,5,165,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_42.png" border="0" alt="" usemap="#svm__model"/>
+<tr><td><img src="inherit_graph_41.png" border="0" alt="" usemap="#svm__model"/>
 <map name="svm__model" id="svm__model">
 <area shape="rect" id="node1" href="structsvm__model.html" title="svm_model" alt="" coords="6,5,95,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_43.png" border="0" alt="" usemap="#svm__node"/>
+<tr><td><img src="inherit_graph_42.png" border="0" alt="" usemap="#svm__node"/>
 <map name="svm__node" id="svm__node">
 <area shape="rect" id="node1" href="structsvm__node.html" title="svm_node" alt="" coords="5,5,88,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_44.png" border="0" alt="" usemap="#svm__parameter"/>
+<tr><td><img src="inherit_graph_43.png" border="0" alt="" usemap="#svm__parameter"/>
 <map name="svm__parameter" id="svm__parameter">
 <area shape="rect" id="node1" href="structsvm__parameter.html" title="svm_parameter" alt="" coords="5,5,117,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_45.png" border="0" alt="" usemap="#svm__problem"/>
+<tr><td><img src="inherit_graph_44.png" border="0" alt="" usemap="#svm__problem"/>
 <map name="svm__problem" id="svm__problem">
 <area shape="rect" id="node1" href="structsvm__problem.html" title="svm_problem" alt="" coords="6,5,106,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_46.png" border="0" alt="" usemap="#Ui__MainWindow"/>
+<tr><td><img src="inherit_graph_45.png" border="0" alt="" usemap="#Ui__MainWindow"/>
 <map name="Ui__MainWindow" id="Ui__MainWindow">
 <area shape="rect" id="node1" href="classUi__MainWindow.html" title="Ui_MainWindow" alt="" coords="5,5,123,32"/><area shape="rect" id="node2" href="classUi_1_1MainWindow.html" title="Ui::MainWindow" alt="" coords="171,5,290,32"/></map>
 </td></tr>
@@ -247,7 +243,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_apps.html b/doc/html/md_apps.html
index b64416a..605df72 100644
--- a/doc/html/md_apps.html
+++ b/doc/html/md_apps.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,6 +66,7 @@ Available tools</h1>
 <li><a class="el" href="pkfssvm.html">pkfssvm</a> feature selection for support vector machine classifier pksvm</li>
 <li><a class="el" href="pkgetmask.html">pkgetmask</a> program to create mask image based on values in input raster image</li>
 <li><a class="el" href="pkinfo.html">pkinfo</a> Report basic information from raster datasets (similar to gdalinfo)</li>
+<li><a class="el" href="pkkalman.html">pkkalman</a> produce kalman filtered raster time series</li>
 <li><a class="el" href="pklas2img.html">pklas2img</a> Rasterize LAS/LAZ point clouds with filtering/compositing options</li>
 <li><a class="el" href="pkoptsvm.html">pkoptsvm</a> program to optimize parameters for support vector machine classifier pksvm</li>
 <li><a class="el" href="pkpolygonize.html">pkpolygonize</a> program to make vector file from raster image</li>
@@ -76,13 +77,14 @@ Available tools</h1>
 <li><a class="el" href="pkstatascii.html">pkstatascii</a> program to calculate basic statistics from text file</li>
 <li><a class="el" href="pkstat.html">pkstat</a> program to calculate basic statistics from raster dataset</li>
 <li><a class="el" href="pkstatogr.html">pkstatogr</a> program to calculate basic statistics from vector file</li>
+<li><a class="el" href="pkstatprofile.html">pkstatprofile</a> program to calculate statistics in temporal or spectral profile</li>
 <li><a class="el" href="pksvm.html">pksvm</a> classify raster image using Support Vector Machine </li>
 </ul>
 </div></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_description_pkstat.html b/doc/html/md_description_pkstat.html
index 4d6fd69..afbe368 100644
--- a/doc/html/md_description_pkstat.html
+++ b/doc/html/md_description_pkstat.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkann.html b/doc/html/md_examples_pkann.html
index 7bc0a82..27641b6 100644
--- a/doc/html/md_examples_pkann.html
+++ b/doc/html/md_examples_pkann.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -53,7 +53,7 @@ Examples of pkann</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkascii2img.html b/doc/html/md_examples_pkascii2img.html
index ee62cdd..7253ddc 100644
--- a/doc/html/md_examples_pkascii2img.html
+++ b/doc/html/md_examples_pkascii2img.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -100,7 +100,7 @@ Examples of pkascii2img</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkascii2ogr.html b/doc/html/md_examples_pkascii2ogr.html
index c933ba8..76b251d 100644
--- a/doc/html/md_examples_pkascii2ogr.html
+++ b/doc/html/md_examples_pkascii2ogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -51,7 +51,7 @@ Examples of pkascii2ogr</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkcomposite.html b/doc/html/md_examples_pkcomposite.html
index bc2e827..57619d0 100644
--- a/doc/html/md_examples_pkcomposite.html
+++ b/doc/html/md_examples_pkcomposite.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@ Examples of pkcomposite</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkcreatect.html b/doc/html/md_examples_pkcreatect.html
index 6f72842..8a28da4 100644
--- a/doc/html/md_examples_pkcreatect.html
+++ b/doc/html/md_examples_pkcreatect.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -64,7 +64,7 @@ Examples of pkcreatect</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkcrop.html b/doc/html/md_examples_pkcrop.html
index cde7b09..dadae77 100644
--- a/doc/html/md_examples_pkcrop.html
+++ b/doc/html/md_examples_pkcrop.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -62,7 +62,7 @@ Examples of pkcrop</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkdiff.html b/doc/html/md_examples_pkdiff.html
index fb3bc1f..fa190d4 100644
--- a/doc/html/md_examples_pkdiff.html
+++ b/doc/html/md_examples_pkdiff.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -53,7 +53,7 @@ Examples of pkdiff</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkdsm2shadow.html b/doc/html/md_examples_pkdsm2shadow.html
index e8e43db..694ae53 100644
--- a/doc/html/md_examples_pkdsm2shadow.html
+++ b/doc/html/md_examples_pkdsm2shadow.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -51,7 +51,7 @@ Examples of pkdsm2shadow</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkdumpimg.html b/doc/html/md_examples_pkdumpimg.html
index bce8e7e..78ba7f3 100644
--- a/doc/html/md_examples_pkdumpimg.html
+++ b/doc/html/md_examples_pkdumpimg.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Examples of pkdumpimg</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkdumpogr.html b/doc/html/md_examples_pkdumpogr.html
index 0495d1b..b619fe3 100644
--- a/doc/html/md_examples_pkdumpogr.html
+++ b/doc/html/md_examples_pkdumpogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ Examples of pkdumpogr</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkextract.html b/doc/html/md_examples_pkextract.html
index e3e3e5c..6c55f60 100644
--- a/doc/html/md_examples_pkextract.html
+++ b/doc/html/md_examples_pkextract.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@ Using raster samples</h2>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkfilter.html b/doc/html/md_examples_pkfilter.html
index 599c894..646d0ae 100644
--- a/doc/html/md_examples_pkfilter.html
+++ b/doc/html/md_examples_pkfilter.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -97,7 +97,7 @@ Iterative process (repeat, e.g., 5-10 times)</h3>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkgetmask.html b/doc/html/md_examples_pkgetmask.html
index 884d8bb..4df11a9 100644
--- a/doc/html/md_examples_pkgetmask.html
+++ b/doc/html/md_examples_pkgetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -53,7 +53,7 @@ Examples of pkgetmask</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkinfo.html b/doc/html/md_examples_pkinfo.html
index 57b1c8d..e05f828 100644
--- a/doc/html/md_examples_pkinfo.html
+++ b/doc/html/md_examples_pkinfo.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -67,7 +67,7 @@ Examples of pkinfo</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkkalman.html b/doc/html/md_examples_pkkalman.html
new file mode 100644
index 0000000..2771b79
--- /dev/null
+++ b/doc/html/md_examples_pkkalman.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: examples_pkkalman</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.6</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">examples_pkkalman </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h1><a class="anchor" id="examples_pkkalman"></a>
+Examples of pkkalman</h1>
+<p>Assimilate fine spatial resolution NDVI time series acquired at (100 m) with median spatial resolution NDVI time series (300 m). Both time series consist of ten acquisitions in time (provided as a multi-band raster dataset), but fine spatial resolution data are sparse due to cloud coverage. Missing data are characterized by the option -obsnodata. Coarse spatial resolution data have occasional cloud cover too (-modnodata 255). The spatial coverage of the model must be at least the spat [...]
+<div class="fragment"><div class="line">pkkalman -obs fine_10band.tif -mod coarse_10band.tif -obsnodata 255 -modnodata 255 -dir forward -ofw fine_filled.tif</div>
+</div><!-- fragment --><p>Same as above, but run in forward, backward and smooth mode. Here we provide output filenames for the uncertainties of the predicted time series.</p>
+<div class="fragment"><div class="line">pkkalman -obs fine_10band.tif -mod coarse_10band.tif -obsnodata 255 -modnodata 255 -dir forward -ofw fine_forward_10band.tif -u_ofw fine_forward_uncert_10band.tif -dir backward -ofb fine_backward_10band.tif -u_obw fine_backward_uncert_10band.tif -dir smooth -ofw fine_smooth_10band.tif -u_ofb fine_smooth_uncert_10band.tif</div>
+</div><!-- fragment --><p>If the observation time series is not complete, i.e., has less acquisitions than the model, we must explicitly provide the time sequence. Here, the observation at fine spatial resolution is based on two acquisitions only (at times 3 and 8). The model at coarse spatial resolution is based on ten acquisitions (at times 1-10).</p>
+<div class="fragment"><div class="line">pkkalman -obs fine_2band.tif -mod coarse_10band.tif -obsnodata 255 -modnodata 255 -dir forward -ofw fine_forward_10band.tif -tmod 1 -tmod 2 -tmod 3 -tmod 4 -tmod 5 -tmod 6 -tmod 7 -tmod 8 -tmod 9 -tmod 10 -tobs 3 -tobs 8</div>
+</div><!-- fragment --><p>In the following example the missing data are not coded within the observations, but read from an external mask:</p>
+<div class="fragment"><div class="line">pkkalman -obs fine_10band.tif -mod coarse_10band.tif -obsmask finemask_10band.tif -modmask coarsemask_10band.tif -msknodata 1 -mskband 0 -dir forward -ofw fine_forward_10band.tif</div>
+</div><!-- fragment --><p>The observations and model can be provided as multiple single-band raster datasets. The time sequence for the two observations and ten model inputs are explicitly provided via the options -tobs and tmod.</p>
+<div class="fragment"><div class="line">pkkalman -obs fine_1.tif -obs fine_2.tif -obsmask finemask_1.tif -obs finemask_2.tif -mod coarse_1.tif -mod coarse_2.tif -mod coarse_3.tif -mod coarse_4.tif -mod coarse_5.tif -mod coarse_6.tif -mod coarse_7.tif -mod coarse_8.tif -mod coarse_9.tif -mod coarse_10.tif -modmask coarsemask_1.tif -modmask coarsemask_2.tif -modmask coarsemask_3.tif -modmask coarsemask_4.tif -modmask coarsemask_5.tif -modmask coarsemask_6.tif -modmask coarsemask_7.tif -mod [...]
+</div><!-- fragment --> </div></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/md_examples_pkpolygonize.html b/doc/html/md_examples_pkpolygonize.html
index 58625e9..4bb834a 100644
--- a/doc/html/md_examples_pkpolygonize.html
+++ b/doc/html/md_examples_pkpolygonize.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -51,7 +51,7 @@ Examples of pkpolygonize</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkreclass.html b/doc/html/md_examples_pkreclass.html
index 0775686..18b9158 100644
--- a/doc/html/md_examples_pkreclass.html
+++ b/doc/html/md_examples_pkreclass.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -57,7 +57,7 @@ Examples of pkreclass</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pksetmask.html b/doc/html/md_examples_pksetmask.html
index 0a59651..915ac26 100644
--- a/doc/html/md_examples_pksetmask.html
+++ b/doc/html/md_examples_pksetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -73,7 +73,7 @@ More examples</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pksieve.html b/doc/html/md_examples_pksieve.html
index d34b359..2d15383 100644
--- a/doc/html/md_examples_pksieve.html
+++ b/doc/html/md_examples_pksieve.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -51,7 +51,7 @@ Examples of pksieve</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkstatogr.html b/doc/html/md_examples_pkstatogr.html
index 2d1b686..9473685 100644
--- a/doc/html/md_examples_pkstatogr.html
+++ b/doc/html/md_examples_pkstatogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -53,7 +53,7 @@ Examples of pkstatogr</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pksvm.html b/doc/html/md_examples_pksvm.html
index 81df54d..2cfd50f 100644
--- a/doc/html/md_examples_pksvm.html
+++ b/doc/html/md_examples_pksvm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -55,7 +55,7 @@ Examples of pksvm</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_faq_pkcomposite.html b/doc/html/md_faq_pkcomposite.html
index 6a0a6dc..80cb6ab 100644
--- a/doc/html/md_faq_pkcomposite.html
+++ b/doc/html/md_faq_pkcomposite.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ Frequently asked questions about pkcomposite</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_faq_pksetmask.html b/doc/html/md_faq_pksetmask.html
index a5ddc98..129df3e 100644
--- a/doc/html/md_faq_pksetmask.html
+++ b/doc/html/md_faq_pksetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -52,7 +52,7 @@ Frequently asked questions about pksetmask</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_header.html b/doc/html/md_header.html
index 93a97a3..1e32da9 100644
--- a/doc/html/md_header.html
+++ b/doc/html/md_header.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@ thetool</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_installation_linux.html b/doc/html/md_installation_linux.html
index 91bbded..4f7bf8d 100644
--- a/doc/html/md_installation_linux.html
+++ b/doc/html/md_installation_linux.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -63,6 +63,20 @@ Manual installation for (all Linux distributions)</h2>
 <p>Unpack the tar zip file</p>
 <div class="fragment"><div class="line">tar xzvf pktools-latest.tar.gz</div>
 <div class="line">cd pktools-*</div>
+</div><!-- fragment --><p>You can install pktools via</p>
+<ul>
+<li><a class="el" href="md_installation_linux.html#installation_autotools">autotools</a> (linux only)</li>
+<li><a class="el" href="md_installation_linux.html#installation_cmake">cmake</a> (linux, windows, Mac OS)</li>
+</ul>
+<h2><a class="anchor" id="installation_autotools"></a>
+Installation via autotools</h2>
+<p>Add libtool support to your package:</p>
+<p>If you obtained pktools from the git repository, please please perform the following actions first (assuming the current directory is pktools):</p>
+<div class="fragment"><div class="line">libtoolize</div>
+</div><!-- fragment --><p>Remake the GNU Build System files by scanning 'configure.ac' and running 'autoconf', 'autoheader', 'aclocal', 'automake' and 'libtoolize':</p>
+<div class="fragment"><div class="line">autoreconf</div>
+</div><!-- fragment --><p>Finalize package generation:</p>
+<div class="fragment"><div class="line">automake --add-missing</div>
 </div><!-- fragment --><p>Basic installation (please refer to INSTALL file for more advanced configuration) </p>
 <div class="fragment"><div class="line">./configure</div>
 <div class="line">make</div>
@@ -141,11 +155,20 @@ Optional dependences</h3>
 <div class="line">make</div>
 <div class="line">sudo make install</div>
 <div class="line">sudo ldconfig</div>
+</div><!-- fragment --><h2><a class="anchor" id="installation_cmake"></a>
+Installation via cmake (or ccmake)</h2>
+<p>Note that CMake version 3.0 or higher is required for building via cmake We will build out-of-source:</p>
+<div class="fragment"><div class="line">mkdir build</div>
+<div class="line">cd build</div>
+<div class="line">ccmake ..</div>
+</div><!-- fragment --><p>Within ccmake, press "c" to configure. Make sure all paths are correctly set. Then press "g" to generate and exit ccmake.</p>
+<p>Compile and link via make:</p>
+<div class="fragment"><div class="line">make</div>
 </div><!-- fragment --> </div></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_installation_plugins.html b/doc/html/md_installation_plugins.html
index 2eb4d41..8387f73 100644
--- a/doc/html/md_installation_plugins.html
+++ b/doc/html/md_installation_plugins.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -54,7 +54,7 @@ QGIS plugin</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_installation_windows.html b/doc/html/md_installation_windows.html
index 4ee3f7e..ce9db27 100644
--- a/doc/html/md_installation_windows.html
+++ b/doc/html/md_installation_windows.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -46,23 +46,33 @@
 <div class="textblock"><h1><a class="anchor" id="installation_windows"></a>
 Installation on Windows machines</h1>
 <h2><a class="anchor" id="installation_windows_dependencies"></a>
-Dependencies: OSGeo4W</h2>
-<p>Download and install the ​<a href="http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86.exe">32bit</a> or ​<a href="http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe">64bit</a> version of <a href="osgeo4w.osgeo.org">OSGeo4W</a>. The basic installation with GDAL contains all dependencies that are required for pktools.</p>
-<h2><a class="anchor" id="Installation_windows_pktools"></a>
-pktools</h2>
-<p>The latest version of pktools for Windows is available for <a href="http://download.savannah.gnu.org/releases/pktools/pktools-latest_win32.zip">32bit</a> and <a href="http://download.savannah.gnu.org/releases/pktools/pktools-latest_win64.zip">64bit</a> architectures from the <a href="http://download.savannah.gnu.org/releases/pktools">download</a> ftp server.</p>
-<p>Unzip the archives to your local hard drive.</p>
-<h2><a class="anchor" id="Installation_windows_cli"></a>
-Command line interface</h2>
-<p>The pktools utilities can be run from the command line using a command prompt window (from the Start button, click All Programs, Accessories, and then Command Prompt). First add the bin directory extracted from the pktools zip archive to the environment variable PATH (from the Start button, click on control panel, then System, Advanced system settings, select Environment Variables and edit PATH)</p>
-<h2><a class="anchor" id="Uninstall_windows"></a>
-Older versions of pktools</h2>
-<p>Please make sure the latest version of pktools is always installed. Changes with respect to the previous versions can be checked in the text file <a href="http://git.savannah.gnu.org/cgit/pktools.git/tree/ChangeLog">Changelog</a>. Older versions of pktools were installed with a setup exe file. They should be uninstalled first via Programs and Features in Control Panel. </p>
+Dependencies: OSGeo4W and Visual Studio redistributables</h2>
+<p>Download and install the ​<a href="http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86.exe">32bit</a> or ​<a href="http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe">64bit</a> (preferred) version of <a href="osgeo4w.osgeo.org">OSGeo4W</a>. The basic installation with GDAL contains most dependencies that are required for pktools.</p>
+<p>Download and install the ​<a href="http://www.microsoft.com/en-us/download/details.aspx?id=48145">redistributables</a> for Visual Studio 2015.</p>
+<p>Please make sure the latest version of pktools is always installed. Changes with respect to the previous versions can be checked in the text file <a href="http://git.savannah.gnu.org/cgit/pktools.git/tree/ChangeLog">Changelog</a>. Older versions of pktools were installed with a setup exe file. They should be uninstalled first via Programs and Features in Control Panel.</p>
+<h2><a class="anchor" id="Installation_windows_binaries"></a>
+Binary packages of pktools</h2>
+<p>Binary packages of pktools are available for Windows on the <a href="http://download.savannah.gnu.org/releases/pktools">ftp server</a>. Latest versions are only available for <a href="http://download.savannah.gnu.org/releases/pktools/pktools-latest_win64.zip">64bit</a> architectures. Older versions of pktools are also available for 32 bit architectures</p>
+<p>Unzip the archives to your local hard drive. Then copy the pktools folder in the OSGeo apps directory (e.g., "C:\OSGeoW64\apps")</p>
+<h2><a class="anchor" id="Installation_windows_cmake"></a>
+Manual installation via cmake</h2>
+<p>If you prefer to compile pktools yourself, the easiest way is to use CMake. First, install CMake on your machine (version 3.0 or higher). These dependency packages must also be pre-installed: <a href="http://arma.sourceforge.net/download.html">Armadillo</a> and <a href="http://ab-initio.mit.edu/wiki/index.php/NLopt_on_Windows">NLOpt</a> (for the utility pkoptsvm only).</p>
+<p>Set the source directory in CMake to the pktools directory. Build out-of-source by setting a "build" directory, where binaries will be created.</p>
+<p>Specify the generator for building the pktools (e.g., Visual Studio 14 2015 Win64 for 64 bit architectures). You can leave the default native compilers checked.</p>
+<p>Add the OSGeoW64 and armadillo paths to the CMAKE_INSTALL_PREFIX (via the button "add Entry"). Other paths for dependencies on FANN and NLOPT should also be added here.</p>
+<p>Click on the "Configure" button.</p>
+<p>Under "BUILD" you can now select extra utilities based on FANN, LIBLAS and NLOPT. Click again on "Configure". Make sure all dependencies are resolved.</p>
+<p>Then press "Generate".</p>
+<p>A Visual Studio project (PKTOOLS.sln) will be created in the build directory. Open the project in Visual Studio and build the solution.</p>
+<h2><a class="anchor" id="run_windows"></a>
+How to run pktools in Windows</h2>
+<p>The pktools utilities can be run from the command line using the OSGEo4W Shell. A selection of them can also be run from within <a class="el" href="md_installation_plugins.html#qgis_plugin">QGIS</a>, via the Processing Toolbox.</p>
+<p>To run the pktools utilities from a simple Windows cmd shell, you first have to set some environment variables. This can be done by executing the batch file o4w_env.bat, located in OSGeo4W64 from within the cmd shell. </p>
 </div></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_mainpage.html b/doc/html/md_mainpage.html
index 90aa5c9..d624211 100644
--- a/doc/html/md_mainpage.html
+++ b/doc/html/md_mainpage.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/myfann__cpp_8h_source.html b/doc/html/myfann__cpp_8h_source.html
index 5d21e30..3dfce34 100644
--- a/doc/html/myfann__cpp_8h_source.html
+++ b/doc/html/myfann__cpp_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -4045,7 +4045,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pages.html b/doc/html/pages.html
index 5da8986..b2fbd21 100644
--- a/doc/html/pages.html
+++ b/doc/html/pages.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -61,58 +61,60 @@
 <tr id="row_13_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkfilter.html" target="_self">examples_pkfilter</a></td><td class="desc"></td></tr>
 <tr id="row_14_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkgetmask.html" target="_self">examples_pkgetmask</a></td><td class="desc"></td></tr>
 <tr id="row_15_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkinfo.html" target="_self">examples_pkinfo</a></td><td class="desc"></td></tr>
-<tr id="row_16_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkpolygonize.html" target="_self">examples_pkpolygonize</a></td><td class="desc"></td></tr>
-<tr id="row_17_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkreclass.html" target="_self">examples_pkreclass</a></td><td class="desc"></td></tr>
-<tr id="row_18_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksetmask.html" target="_self">examples_pksetmask</a></td><td class="desc"></td></tr>
-<tr id="row_19_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksieve.html" target="_self">examples_pksieve</a></td><td class="desc"></td></tr>
-<tr id="row_20_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkstatogr.html" target="_self">examples_pkstatogr</a></td><td class="desc"></td></tr>
-<tr id="row_21_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksvm.html" target="_self">examples_pksvm</a></td><td class="desc"></td></tr>
-<tr id="row_22_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_faq_pkcomposite.html" target="_self">faq_pkcomposite</a></td><td class="desc"></td></tr>
-<tr id="row_23_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_faq_pksetmask.html" target="_self">faq_pksetmask</a></td><td class="desc"></td></tr>
-<tr id="row_24_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_header.html" target="_self">header</a></td><td class="desc"></td></tr>
-<tr id="row_25_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_installation_linux.html" target="_self">installation_linux</a></td><td class="desc"></td></tr>
-<tr id="row_26_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_installation_plugins.html" target="_self">installation_plugins</a></td><td class="desc"></td></tr>
-<tr id="row_27_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_installation_windows.html" target="_self">installation_windows</a></td><td class="desc"></td></tr>
-<tr id="row_28_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_mainpage.html" target="_self">mainpage</a></td><td class="desc"></td></tr>
-<tr id="row_29_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkann.html" target="_self">pkann</a></td><td class="desc"></td></tr>
-<tr id="row_30_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkascii2img.html" target="_self">pkascii2img</a></td><td class="desc"></td></tr>
-<tr id="row_31_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkascii2ogr.html" target="_self">pkascii2ogr</a></td><td class="desc"></td></tr>
-<tr id="row_32_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcomposite.html" target="_self">pkcomposite</a></td><td class="desc"></td></tr>
-<tr id="row_33_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcreatect.html" target="_self">pkcreatect</a></td><td class="desc"></td></tr>
-<tr id="row_34_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcrop.html" target="_self">pkcrop</a></td><td class="desc"></td></tr>
-<tr id="row_35_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdiff.html" target="_self">pkdiff</a></td><td class="desc"></td></tr>
-<tr id="row_36_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdsm2shadow.html" target="_self">pkdsm2shadow</a></td><td class="desc"></td></tr>
-<tr id="row_37_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdumpimg.html" target="_self">pkdumpimg</a></td><td class="desc"></td></tr>
-<tr id="row_38_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdumpogr.html" target="_self">pkdumpogr</a></td><td class="desc"></td></tr>
-<tr id="row_39_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkegcs.html" target="_self">pkegcs</a></td><td class="desc"></td></tr>
-<tr id="row_40_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkextract.html" target="_self">pkextract</a></td><td class="desc"></td></tr>
-<tr id="row_41_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfillnodata.html" target="_self">pkfillnodata</a></td><td class="desc"></td></tr>
-<tr id="row_42_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilter.html" target="_self">pkfilter</a></td><td class="desc"></td></tr>
-<tr id="row_43_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilterascii.html" target="_self">pkfilterascii</a></td><td class="desc"></td></tr>
-<tr id="row_44_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilterdem.html" target="_self">pkfilterdem</a></td><td class="desc"></td></tr>
-<tr id="row_45_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfsann.html" target="_self">pkfsann</a></td><td class="desc"></td></tr>
-<tr id="row_46_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfssvm.html" target="_self">pkfssvm</a></td><td class="desc"></td></tr>
-<tr id="row_47_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkgetmask.html" target="_self">pkgetmask</a></td><td class="desc"></td></tr>
-<tr id="row_48_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkinfo.html" target="_self">pkinfo</a></td><td class="desc"></td></tr>
-<tr id="row_49_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkkalman.html" target="_self">pkkalman</a></td><td class="desc"></td></tr>
-<tr id="row_50_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pklas2img.html" target="_self">pklas2img</a></td><td class="desc"></td></tr>
-<tr id="row_51_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkoptsvm.html" target="_self">pkoptsvm</a></td><td class="desc"></td></tr>
-<tr id="row_52_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkpolygonize.html" target="_self">pkpolygonize</a></td><td class="desc"></td></tr>
-<tr id="row_53_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkreclass.html" target="_self">pkreclass</a></td><td class="desc"></td></tr>
-<tr id="row_54_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkregann.html" target="_self">pkregann</a></td><td class="desc"></td></tr>
-<tr id="row_55_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pksetmask.html" target="_self">pksetmask</a></td><td class="desc"></td></tr>
-<tr id="row_56_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pksieve.html" target="_self">pksieve</a></td><td class="desc"></td></tr>
-<tr id="row_57_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstat.html" target="_self">pkstat</a></td><td class="desc"></td></tr>
-<tr id="row_58_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstatascii.html" target="_self">pkstatascii</a></td><td class="desc"></td></tr>
-<tr id="row_59_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstatogr.html" target="_self">pkstatogr</a></td><td class="desc"></td></tr>
-<tr id="row_60_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a class="el" href="pksvm.html" target="_self">pksvm</a></td><td class="desc"></td></tr>
+<tr id="row_16_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkkalman.html" target="_self">examples_pkkalman</a></td><td class="desc"></td></tr>
+<tr id="row_17_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkpolygonize.html" target="_self">examples_pkpolygonize</a></td><td class="desc"></td></tr>
+<tr id="row_18_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkreclass.html" target="_self">examples_pkreclass</a></td><td class="desc"></td></tr>
+<tr id="row_19_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksetmask.html" target="_self">examples_pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_20_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksieve.html" target="_self">examples_pksieve</a></td><td class="desc"></td></tr>
+<tr id="row_21_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkstatogr.html" target="_self">examples_pkstatogr</a></td><td class="desc"></td></tr>
+<tr id="row_22_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksvm.html" target="_self">examples_pksvm</a></td><td class="desc"></td></tr>
+<tr id="row_23_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_faq_pkcomposite.html" target="_self">faq_pkcomposite</a></td><td class="desc"></td></tr>
+<tr id="row_24_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_faq_pksetmask.html" target="_self">faq_pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_25_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_header.html" target="_self">header</a></td><td class="desc"></td></tr>
+<tr id="row_26_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_installation_linux.html" target="_self">installation_linux</a></td><td class="desc"></td></tr>
+<tr id="row_27_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_installation_plugins.html" target="_self">installation_plugins</a></td><td class="desc"></td></tr>
+<tr id="row_28_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_installation_windows.html" target="_self">installation_windows</a></td><td class="desc"></td></tr>
+<tr id="row_29_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_mainpage.html" target="_self">mainpage</a></td><td class="desc"></td></tr>
+<tr id="row_30_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkann.html" target="_self">pkann</a></td><td class="desc"></td></tr>
+<tr id="row_31_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkascii2img.html" target="_self">pkascii2img</a></td><td class="desc"></td></tr>
+<tr id="row_32_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkascii2ogr.html" target="_self">pkascii2ogr</a></td><td class="desc"></td></tr>
+<tr id="row_33_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcomposite.html" target="_self">pkcomposite</a></td><td class="desc"></td></tr>
+<tr id="row_34_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcreatect.html" target="_self">pkcreatect</a></td><td class="desc"></td></tr>
+<tr id="row_35_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcrop.html" target="_self">pkcrop</a></td><td class="desc"></td></tr>
+<tr id="row_36_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdiff.html" target="_self">pkdiff</a></td><td class="desc"></td></tr>
+<tr id="row_37_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdsm2shadow.html" target="_self">pkdsm2shadow</a></td><td class="desc"></td></tr>
+<tr id="row_38_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdumpimg.html" target="_self">pkdumpimg</a></td><td class="desc"></td></tr>
+<tr id="row_39_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdumpogr.html" target="_self">pkdumpogr</a></td><td class="desc"></td></tr>
+<tr id="row_40_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkegcs.html" target="_self">pkegcs</a></td><td class="desc"></td></tr>
+<tr id="row_41_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkextract.html" target="_self">pkextract</a></td><td class="desc"></td></tr>
+<tr id="row_42_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfillnodata.html" target="_self">pkfillnodata</a></td><td class="desc"></td></tr>
+<tr id="row_43_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilter.html" target="_self">pkfilter</a></td><td class="desc"></td></tr>
+<tr id="row_44_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilterascii.html" target="_self">pkfilterascii</a></td><td class="desc"></td></tr>
+<tr id="row_45_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilterdem.html" target="_self">pkfilterdem</a></td><td class="desc"></td></tr>
+<tr id="row_46_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfsann.html" target="_self">pkfsann</a></td><td class="desc"></td></tr>
+<tr id="row_47_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfssvm.html" target="_self">pkfssvm</a></td><td class="desc"></td></tr>
+<tr id="row_48_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkgetmask.html" target="_self">pkgetmask</a></td><td class="desc"></td></tr>
+<tr id="row_49_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkinfo.html" target="_self">pkinfo</a></td><td class="desc"></td></tr>
+<tr id="row_50_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkkalman.html" target="_self">pkkalman</a></td><td class="desc"></td></tr>
+<tr id="row_51_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pklas2img.html" target="_self">pklas2img</a></td><td class="desc"></td></tr>
+<tr id="row_52_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkoptsvm.html" target="_self">pkoptsvm</a></td><td class="desc"></td></tr>
+<tr id="row_53_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkpolygonize.html" target="_self">pkpolygonize</a></td><td class="desc"></td></tr>
+<tr id="row_54_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkreclass.html" target="_self">pkreclass</a></td><td class="desc"></td></tr>
+<tr id="row_55_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkregann.html" target="_self">pkregann</a></td><td class="desc"></td></tr>
+<tr id="row_56_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pksetmask.html" target="_self">pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_57_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pksieve.html" target="_self">pksieve</a></td><td class="desc"></td></tr>
+<tr id="row_58_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstat.html" target="_self">pkstat</a></td><td class="desc"></td></tr>
+<tr id="row_59_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstatascii.html" target="_self">pkstatascii</a></td><td class="desc"></td></tr>
+<tr id="row_60_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstatogr.html" target="_self">pkstatogr</a></td><td class="desc"></td></tr>
+<tr id="row_61_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstatprofile.html" target="_self">pkstatprofile</a></td><td class="desc"></td></tr>
+<tr id="row_62_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a class="el" href="pksvm.html" target="_self">pksvm</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:07 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkann.html b/doc/html/pkann.html
index b62398a..1ef699b 100644
--- a/doc/html/pkann.html
+++ b/doc/html/pkann.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -112,7 +112,7 @@ Options</h1>
 <tr>
 <td>m </td><td>mask </td><td>std::string </td><td></td><td>Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata. </td></tr>
 <tr>
-<td>msknodata </td><td>msknodata </td><td>short </td><td>0 </td><td>mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. Default is 0 </td></tr>
+<td>msknodata </td><td>msknodata </td><td>short </td><td>0 </td><td>mask value(s) not to consider for classification. Values will be taken over in classification image. Default is 0 </td></tr>
 <tr>
 <td>nodata </td><td>nodata </td><td>unsigned short </td><td>0 </td><td>nodata value to put where image is masked as nodata </td></tr>
 <tr>
@@ -144,7 +144,7 @@ Usage: pkann -t training [-i input -o output] [-cv value]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkann_8cc_source.html b/doc/html/pkann_8cc_source.html
index 5361980..914819b 100644
--- a/doc/html/pkann_8cc_source.html
+++ b/doc/html/pkann_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -120,11 +120,11 @@
 <div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> bagSize_opt(<span class="stringliteral">"bs"</span>, <span class="stringliteral">"bsize"</span>, <span class="stringliteral">"Percentage of features used from available training features for each bootstrap aggregation (one size for all classes, or a different size for each class respectively"</span>, 100);</div>
 <div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> classBag_opt(<span class="stringliteral">"cb"</span>, <span class="stringliteral">"classbag"</span>, <span class="stringliteral">"output for each individual bootstrap aggregation (default is blank)"</span>); </div>
 <div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata."</span>);</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. Default [...]
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"mask value(s) not to consider for classification. Values will be taken over in classification image. Default is 0"</span>, 0);</div>
 <div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value to put where image is masked as nodata"</span>, 0);</div>
 <div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"output classification image"</span>); </div>
 <div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>);</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>,<span class="stringliteral">"GTiff"</span>);</div>
 <div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
 <div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"colour table in ASCII format having 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>); </div>
 <div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> prob_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"prob"</span>, <span class="stringliteral">"probability image. Default is no probability image"</span>); </div>
@@ -136,1203 +136,1205 @@
 <div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> classvalue_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"reclass"</span>, <span class="stringliteral">"list of class values (use same order as in class opt)."</span>); </div>
 <div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"set to: 0 (results only), 1 (confusion matrix), 2 (debug)"</span>,0,2);</div>
 <div class="line"><a name="l00157"></a><span class="lineno">  157</span> </div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   band_opt.setHide(1);</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   bstart_opt.setHide(1);</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   bend_opt.setHide(1);</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   balance_opt.setHide(1);</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   minSize_opt.setHide(1);</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   bag_opt.setHide(1);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   bagSize_opt.setHide(1);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   comb_opt.setHide(1);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   classBag_opt.setHide(1);</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   minSize_opt.setHide(1);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   prob_opt.setHide(1);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   priorimg_opt.setHide(1);</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   minSize_opt.setHide(1);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   offset_opt.setHide(1);</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   scale_opt.setHide(1);</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   connection_opt.setHide(1);</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   weights_opt.setHide(1);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   maxit_opt.setHide(1);</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   learning_opt.setHide(1);</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span> </div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   verbose_opt.setHide(2);</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   oformat_opt.setHide(1);</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   band_opt.setHide(1);</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   bstart_opt.setHide(1);</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   bend_opt.setHide(1);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   balance_opt.setHide(1);</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   minSize_opt.setHide(1);</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   bag_opt.setHide(1);</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   bagSize_opt.setHide(1);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   comb_opt.setHide(1);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   classBag_opt.setHide(1);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   minSize_opt.setHide(1);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   prob_opt.setHide(1);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   priorimg_opt.setHide(1);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   minSize_opt.setHide(1);</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   offset_opt.setHide(1);</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   scale_opt.setHide(1);</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   connection_opt.setHide(1);</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   weights_opt.setHide(1);</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   maxit_opt.setHide(1);</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   learning_opt.setHide(1);</div>
 <div class="line"><a name="l00179"></a><span class="lineno">  179</span> </div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     training_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     tlayer_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     label_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     balance_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     random_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     minSize_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     bstart_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     bend_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     offset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     scale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     aggreg_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     priors_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     priorimg_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     cv_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     cmformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     nneuron_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     connection_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     weights_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     learning_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     maxit_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     comb_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     bag_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     bagSize_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     classBag_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     mask_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     msknodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     otype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     prob_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     entropy_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     active_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     nactive_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     classname_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     classvalue_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   }</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     exit(0);</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   }</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     cout << endl;</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     cout << <span class="stringliteral">"Usage: pkann -t training [-i input -o output] [-cv value]"</span> << endl;</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   verbose_opt.setHide(2);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span> </div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     training_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     tlayer_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     label_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     balance_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     random_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     minSize_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     bstart_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     bend_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     offset_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     scale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     aggreg_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     priors_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     priorimg_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     cv_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     cmformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     nneuron_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     connection_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     weights_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     learning_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     maxit_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     comb_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     bag_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     bagSize_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     classBag_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     mask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     msknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     prob_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     entropy_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     active_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     nactive_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     classname_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     classvalue_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   }</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     exit(0);</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   }</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   <span class="keywordflow">if</span>(!doProcess){</div>
 <div class="line"><a name="l00232"></a><span class="lineno">  232</span>     cout << endl;</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << endl;</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   }</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span> </div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keywordflow">if</span>(entropy_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     entropy_opt.clear();</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="keywordflow">if</span>(active_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     active_opt.clear();</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="keywordflow">if</span>(priorimg_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     priorimg_opt.clear();</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span> </div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     <span class="keywordflow">if</span>(input_opt.size())</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>       cout << <span class="stringliteral">"image filename: "</span> << input_opt[0] << endl;</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>       cout << <span class="stringliteral">"mask filename: "</span> << mask_opt[0] << endl;</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordflow">if</span>(training_opt.size()){</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>       cout << <span class="stringliteral">"training vector file: "</span> << endl;</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<training_opt.size();++ifile)</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>         cout << training_opt[ifile] << endl;</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     }</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>       cerr << <span class="stringliteral">"no training file set!"</span> << endl;</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     cout << <span class="stringliteral">"verbose: "</span> << verbose_opt[0] << endl;</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   }</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nbag=(training_opt.size()>1)?training_opt.size():bag_opt[0];</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     cout << <span class="stringliteral">"number of bootstrap aggregations: "</span> << nbag << endl;</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   </div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   OGRLayer  *readLayer;</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span> </div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordtype">double</span> ulx=0;</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordtype">double</span> uly=0;</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="keywordtype">double</span> lrx=0;</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordtype">double</span> lry=0;</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span> </div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="keywordtype">bool</span> maskIsVector=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       extentReader.open(mask_opt[0]);</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>       maskIsVector=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>       readLayer = extentReader.getDataSource()->GetLayer(0);</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(ulx,uly,lrx,lry))){</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     cerr << <span class="stringliteral">"Error: could not get extent from "</span> << mask_opt[0] << endl;</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     exit(1);</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>       }</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     }</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>       maskIsVector=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     }</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   }</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span> </div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> activeWriter;</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     activeWriter.open(active_opt[0],ogrformat_opt[0]);</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     activeWriter.createLayer(active_opt[0],trainingReader.getProjection(),wkbPoint,NULL);</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     activeWriter.copyFields(trainingReader);</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   }</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   vector<PosValue> activePoints(nactive_opt[0]);</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     activePoints[iactive].value=1.0;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     activePoints[iactive].posx=0.0;</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     activePoints[iactive].posy=0.0;</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   }</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span> </div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSamples=0;</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nactive=0;</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   vector<FANN::neural_net> net(nbag);<span class="comment">//the neural network</span></div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span> </div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nclass=0;</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>   <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   <span class="keywordtype">int</span> startBand=2;<span class="comment">//first two bands represent X and Y pos</span></div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span> </div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   <span class="keywordflow">if</span>(priors_opt.size()>1){<span class="comment">//priors from argument list</span></div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     priors.resize(priors_opt.size());</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     <span class="keywordtype">double</span> normPrior=0;</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<priors_opt.size();++iclass){</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       priors[iclass]=priors_opt[iclass];</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       normPrior+=priors[iclass];</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     }</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     <span class="comment">//normalize</span></div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<priors_opt.size();++iclass)</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       priors[iclass]/=normPrior;</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   }</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span> </div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>       }</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       band_opt.clear();</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     }</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       band_opt.push_back(iband);</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       }</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     }</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   }</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     cerr << error << std::endl;</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     exit(1);</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   }</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   <span class="comment">//sort bands</span></div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     std::sort(band_opt.begin(),band_opt.end());</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span> </div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   map<string,short> classValueMap;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   vector<std::string> nameVector;</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   }</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   <a class="code" href="classconfusionmatrix_1_1ConfusionMatrix.html">confusionmatrix::ConfusionMatrix</a> cm;</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   vector< vector<double> > offset(nbag);</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   vector< vector<double> > scale(nbag);</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   map<string,Vector2d<float> > trainingMap;</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   vector<string> fields;</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     <span class="comment">//organize training data</span></div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="keywordflow">if</span>(ibag<training_opt.size()){<span class="comment">//if bag contains new training pixels</span></div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       trainingMap.clear();</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       trainingPixels.clear();</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>         cout << <span class="stringliteral">"reading imageVector file "</span> << training_opt[0] << endl;</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReaderBag(training_opt[ibag]);</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>         <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>           <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training file, did you provide class labels in training sample (see option label)?"</span>;</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>           <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>         }</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     trainingReaderBag.close();</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       }</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>         exit(1);</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       }</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>         exit(1);</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       }</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       <span class="comment">//delete class 0 ?</span></div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       <span class="comment">// if(verbose_opt[0]>=1)</span></div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>       <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       <span class="comment">// trainingMap.erase(0);</span></div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       <span class="comment">//convert map to vector</span></div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>         std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>         <span class="comment">//delete small classes</span></div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>         <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>           trainingMap.erase(mapit);</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>         }</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>         trainingPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>           std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>         ++mapit;</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>         }</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       <span class="keywordflow">if</span>(!ibag){</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>         nclass=trainingPixels.size();</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     <span class="keywordflow">if</span>(classname_opt.size())</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       assert(nclass==classname_opt.size());</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>         nband=(training_opt.size())?trainingPixels[0][0].size()-2:trainingPixels[0][0].size();<span class="comment">//X and Y</span></div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       }</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>         assert(nclass==trainingPixels.size());</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>         assert(nband==(training_opt.size())?trainingPixels[0][0].size()-2:trainingPixels[0][0].size());</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       }</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span> </div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       <span class="comment">//balance training data</span></div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         <span class="keywordflow">while</span>(balance_opt.size()<nclass)</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           balance_opt.push_back(balance_opt.back());</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>         <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>           srand(time(NULL));</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>         totalSamples=0;</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>           <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>             <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>               <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>               trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>             }</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>           }</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>             <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[iclass];++isample){</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>               <span class="keywordtype">int</span> index = rand()%oldsize;</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>               trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>             }</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>           }</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>           totalSamples+=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>         }</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       }</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     </div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       <span class="comment">//set scale and offset</span></div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       offset[ibag].resize(nband);</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       scale[ibag].resize(nband);</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>         assert(offset_opt.size()==nband);</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>         assert(scale_opt.size()==nband);</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>           cout << <span class="stringliteral">"scaling for band"</span> << iband << endl;</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>         offset[ibag][iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>         scale[ibag][iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         <span class="comment">//search for min and maximum</span></div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>         <span class="keywordflow">if</span>(scale[ibag][iband]<=0){</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>           <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>           <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>               <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>                 theMin=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>               <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>                 theMax=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>             }</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>           }</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>           offset[ibag][iband]=theMin+(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           scale[ibag][iband]=(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>             std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>             std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[ibag][iband] << <span class="stringliteral">", "</span> << scale[ibag][iband] << std::endl;</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>             std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">","</span> << (theMax-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">"]"</span> <&lt [...]
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>           }</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>         }</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       }</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     }</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     <span class="keywordflow">else</span>{<span class="comment">//use same offset and scale </span></div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       offset[ibag].resize(nband);</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       scale[ibag].resize(nband);</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         offset[ibag][iband]=offset[0][iband];</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         scale[ibag][iband]=scale[0][iband];</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       }</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     }</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>       </div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     <span class="keywordflow">if</span>(!ibag){</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       <span class="keywordflow">if</span>(priors_opt.size()==1){<span class="comment">//default: equal priors for each class</span></div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>         priors.resize(nclass);</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>           priors[iclass]=1.0/nclass;</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       }</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>       assert(priors_opt.size()==1||priors_opt.size()==nclass);</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     </div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       <span class="comment">//set bagsize for each class if not done already via command line</span></div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="keywordflow">while</span>(bagSize_opt.size()<nclass)</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         bagSize_opt.push_back(bagSize_opt.back());</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span> </div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>         std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>         std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>         std::cout << <span class="stringliteral">"priors:"</span>;</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>     <span class="keywordflow">if</span>(priorimg_opt.empty()){</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>             std::cout << <span class="stringliteral">" "</span> << priors[iclass];</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           std::cout << std::endl;</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>         }</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       }</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       <span class="keywordtype">bool</span> doSort=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     nameVector.push_back(mapit->first);</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>         <span class="keywordflow">if</span>(cm.getClassIndex(type2string<short>(classValueMap[mapit->first]))<0)</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>           cm.pushBackClassName(type2string<short>(classValueMap[mapit->first]),doSort);</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       }</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>         std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>         exit(1);</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       }</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     }</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       cm.pushBackClassName(mapit->first,doSort);</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     ++mapit;</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>       }</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       <span class="keywordflow">if</span>(classname_opt.empty()){</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>         <span class="comment">//std::cerr << "Warning: no class name and value pair provided for all " << nclass << " classes, using string2type<int> instead!" << std::endl;</span></div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>             std::cout << iclass << <span class="stringliteral">" "</span> << cm.getClass(iclass) << <span class="stringliteral">" -> "</span> << string2type<short>(cm.getClass(iclass)) << std::endl;</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>           classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass));</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>         }</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       }</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       <span class="keywordflow">if</span>(priors_opt.size()==nameVector.size()){</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     std::cerr << <span class="stringliteral">"Warning: please check if priors are provided in correct order!!!"</span> << std::endl;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nameVector.size();++iclass)</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       std::cerr << nameVector[iclass] << <span class="stringliteral">" "</span> << priors_opt[iclass] << std::endl;</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       }</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     }<span class="comment">//if(!ibag)</span></div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span> </div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="comment">//Calculate features of training set</span></div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     vector< Vector2d<float> > trainingFeatures(nclass);</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       <span class="keywordtype">int</span> nctraining=0;</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         cout << <span class="stringliteral">"calculating features for class "</span> << iclass << endl;</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>         srand(time(NULL));</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       nctraining=(bagSize_opt[iclass]<100)? trainingPixels[iclass].size()/100.0*bagSize_opt[iclass] : trainingPixels[iclass].size();<span class="comment">//bagSize_opt[iclass] given in % of training size</span></div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       <span class="keywordflow">if</span>(nctraining<=0)</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>         nctraining=1;</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       assert(nctraining<=trainingPixels[iclass].size());</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       <span class="keywordtype">int</span> index=0;</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       <span class="keywordflow">if</span>(bagSize_opt[iclass]<100)</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>         random_shuffle(trainingPixels[iclass].begin(),trainingPixels[iclass].end());</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       </div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       trainingFeatures[iclass].resize(nctraining);</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining;++isample){</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>         <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>           <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>           trainingFeatures[iclass][isample].push_back((value-offset[ibag][iband])/scale[ibag][iband]);</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>         }</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       }</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       assert(trainingFeatures[iclass].size()==nctraining);</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     }</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     </div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ntraining=0;</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       ntraining+=trainingFeatures[iclass].size();</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span> </div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> num_layers = nneuron_opt.size()+2;</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     <span class="keyword">const</span> <span class="keywordtype">float</span> desired_error = 0.0003;</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterations_between_reports = (verbose_opt[0])? maxit_opt[0]+1:0;</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       cout << <span class="stringliteral">"number of features: "</span> << nFeatures << endl;</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       cout << <span class="stringliteral">"creating artificial neural network with "</span> << nneuron_opt.size() << <span class="stringliteral">" hidden layer, having "</span> << endl;</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nneuron_opt.size();++ilayer)</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>         cout << nneuron_opt[ilayer] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       cout << <span class="stringliteral">"neurons"</span> << endl;</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       cout << <span class="stringliteral">"connection_opt[0]: "</span> << connection_opt[0] << std::endl;</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       cout << <span class="stringliteral">"num_layers: "</span> << num_layers << std::endl;</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       cout << <span class="stringliteral">"nFeatures: "</span> << nFeatures << std::endl;</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       cout << <span class="stringliteral">"nneuron_opt[0]: "</span> << nneuron_opt[0] << std::endl;</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       cout << <span class="stringliteral">"number of classes (nclass): "</span> << nclass << std::endl;</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     }</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     <span class="keywordflow">switch</span>(num_layers){</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     <span class="keywordflow">case</span>(3):{</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <span class="comment">// net[ibag].create_sparse(connection_opt[0],num_layers, nFeatures, nneuron_opt[0], nclass);//replace all create_sparse with create_sparse_array due to bug in FANN!</span></div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> layers[3];</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       layers[0]=nFeatures;</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       layers[1]=nneuron_opt[0];</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       layers[2]=nclass;</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       net[ibag].create_sparse_array(connection_opt[0],num_layers,layers);</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     }</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="keywordflow">case</span>(4):{</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> layers[4];</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       layers[0]=nFeatures;</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       layers[1]=nneuron_opt[0];</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       layers[2]=nneuron_opt[1];</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       layers[3]=nclass;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       <span class="comment">// layers.push_back(nFeatures);</span></div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="comment">// for(int ihidden=0;ihidden<nneuron_opt.size();++ihidden)</span></div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="comment">//    layers.push_back(nneuron_opt[ihidden]);</span></div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="comment">// layers.push_back(nclass);</span></div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       net[ibag].create_sparse_array(connection_opt[0],num_layers,layers);</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     }</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       cerr << <span class="stringliteral">"Only 1 or 2 hidden layers are supported!"</span> << endl;</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       exit(1);</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     }</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       cout << <span class="stringliteral">"network created"</span> << endl;</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>   </div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     net[ibag].set_learning_rate(learning_opt[0]);</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span> </div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     <span class="comment">//   net.set_activation_steepness_hidden(1.0);</span></div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     <span class="comment">//   net.set_activation_steepness_output(1.0);</span></div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     </div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     net[ibag].set_activation_function_hidden(FANN::SIGMOID_SYMMETRIC_STEPWISE);</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>     net[ibag].set_activation_function_output(FANN::SIGMOID_SYMMETRIC_STEPWISE);</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span> </div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     <span class="comment">// Set additional properties such as the training algorithm</span></div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="comment">//   net.set_training_algorithm(FANN::TRAIN_QUICKPROP);</span></div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span> </div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="comment">// Output network type and parameters</span></div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       cout << endl << <span class="stringliteral">"Network Type                         :  "</span>;</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       <span class="keywordflow">switch</span> (net[ibag].get_network_type())</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         {</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         <span class="keywordflow">case</span> FANN::LAYER:</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>           cout << <span class="stringliteral">"LAYER"</span> << endl;</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>         <span class="keywordflow">case</span> FANN::SHORTCUT:</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>           cout << <span class="stringliteral">"SHORTCUT"</span> << endl;</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>           cout << <span class="stringliteral">"UNKNOWN"</span> << endl;</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>         }</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>       net[ibag].print_parameters();</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     }</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       </div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>         std::cout << <span class="stringliteral">"cross validation"</span> << std::endl;</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       vector<unsigned short> referenceVector;</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       vector<unsigned short> outputVector;</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       <span class="keywordtype">float</span> rmse=net[ibag].cross_validation(trainingFeatures,</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>                                             ntraining,</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>                                             cv_opt[0],</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>                                             maxit_opt[0],</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>                                             desired_error,</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>                                             referenceVector,</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>                                             outputVector,</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>                                             verbose_opt[0]);</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<referenceVector.size();++isample){</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     <span class="keywordtype">string</span> refClassName=nameVector[referenceVector[isample]];</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     <span class="keywordtype">string</span> className=nameVector[outputVector[isample]];</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       cm.incrementResult(type2string<short>(classValueMap[refClassName]),type2string<short>(classValueMap[className]),1.0/nbag);</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       cm.incrementResult(cm.getClass(referenceVector[isample]),cm.getClass(outputVector[isample]),1.0/nbag);</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>       }        </div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     }</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>   </div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>       cout << endl << <span class="stringliteral">"Set training data"</span> << endl;</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span> </div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       cout << endl << <span class="stringliteral">"Training network"</span> << endl;</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     </div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       cout << <span class="stringliteral">"Max Epochs "</span> << setw(8) << maxit_opt[0] << <span class="stringliteral">". "</span></div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>            << <span class="stringliteral">"Desired Error: "</span> << left << desired_error << right << endl;</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     }</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     <span class="keywordflow">if</span>(weights_opt.size()==net[ibag].get_total_connections()){<span class="comment">//no new training needed (same training sample)</span></div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       vector<fann_connection> convector;</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       net[ibag].get_connection_array(convector);</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i_connection=0;i_connection<net[ibag].get_total_connections();++i_connection)</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>         convector[i_connection].weight=weights_opt[i_connection];</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       net[ibag].set_weight_array(convector);</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     }</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       <span class="keywordtype">bool</span> initWeights=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       net[ibag].train_on_data(trainingFeatures,ntraining,initWeights, maxit_opt[0],</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>                               iterations_between_reports, desired_error);</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     }</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span> </div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span> </div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=2){</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       net[ibag].print_connections();</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       vector<fann_connection> convector;</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       net[ibag].get_connection_array(convector);</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i_connection=0;i_connection<net[ibag].get_total_connections();++i_connection)</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>         cout << <span class="stringliteral">"connection "</span> << i_connection << <span class="stringliteral">": "</span> << convector[i_connection].weight << endl;</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span> </div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     }</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>   }<span class="comment">//for ibag</span></div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     assert(cm.nReference());</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     cm.setFormat(cmformat_opt[0]);</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     cm.reportSE95(<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     std::cout << cm << std::endl;</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     cout << <span class="stringliteral">"class #samples userAcc prodAcc"</span> << endl;</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     <span class="keywordtype">double</span> se95_ua=0;</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     <span class="keywordtype">double</span> se95_pa=0;</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     <span class="keywordtype">double</span> se95_oa=0;</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     <span class="keywordtype">double</span> dua=0;</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     <span class="keywordtype">double</span> dpa=0;</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <span class="keywordtype">double</span> doa=0;</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<cm.nClasses();++iclass){</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>       cout << cm.getClass(iclass) << <span class="stringliteral">" "</span> << cm.nReference(cm.getClass(iclass)) << <span class="stringliteral">" "</span> << dua << <span class="stringliteral">" ("</span> << se95_ua << <span class="stringliteral">")"</span> << <span class="stringliteral">" "</span> <<  [...]
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     }</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     std::cout << <span class="stringliteral">"Kappa: "</span> << cm.kappa() << std::endl;</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     doa=cm.oa_pct(&se95_oa);</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     std::cout << <span class="stringliteral">"Overall Accuracy: "</span> << doa << <span class="stringliteral">" ("</span> << se95_oa << <span class="stringliteral">")"</span>  << std::endl;</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>   }</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   <span class="comment">//--------------------------------- end of training -----------------------------------</span></div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   <span class="keywordflow">if</span>(input_opt.empty())</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     exit(0);</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span> </div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="keywordtype">float</span> progress=0;</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>   <span class="comment">//-------------------------------- open image file ------------------------------------</span></div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>   <span class="keywordtype">bool</span> inputIsRaster=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> imgReaderOgr;</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>     imgReaderOgr.open(input_opt[0]);</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     imgReaderOgr.close();</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>   }</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     inputIsRaster=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>   }</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>   <span class="keywordflow">if</span>(inputIsRaster){</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>   <span class="comment">// if(input_opt[0].find(".shp")==string::npos){</span></div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> testImage;</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>         cout << <span class="stringliteral">"opening image "</span> << input_opt[0] << endl; </div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       testImage.open(input_opt[0]);</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>     }</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       cerr << error << endl;</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       exit(2);</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>     }</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> priorReader;</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>     <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>           std::cout << <span class="stringliteral">"opening prior image "</span> << priorimg_opt[0] << std::endl;</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>         priorReader.open(priorimg_opt[0]);</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>         assert(priorReader.nrOfCol()==testImage.nrOfCol());</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>         assert(priorReader.nrOfRow()==testImage.nrOfRow());</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       }</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>         exit(2);</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       }</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>         exit(1);</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       }</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     }</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span> </div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     <span class="keywordtype">int</span> nrow=testImage.nrOfRow();</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     <span class="keywordtype">int</span> ncol=testImage.nrOfCol();</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       theInterleave+=testImage.getInterleave();</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>     }</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>     vector<char> classOut(ncol);<span class="comment">//classified line for writing to image file</span></div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span> </div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     <span class="comment">//   assert(nband==testImage.nrOfBand());</span></div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageBag;</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageOut;</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> probImage;</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> entropyImage;</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span> </div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     <span class="keywordtype">string</span> imageType=testImage.getImageType();</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span> </div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>         cout << <span class="stringliteral">"opening class image for writing output "</span> << output_opt[0] << endl;</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         classImageBag.open(classBag_opt[0],ncol,nrow,nbag,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>     classImageBag.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>         classImageBag.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>         classImageBag.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       }</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>       classImageOut.open(output_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       classImageOut.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       classImageOut.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       classImageOut.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       <span class="keywordflow">if</span>(colorTable_opt.size())</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>         classImageOut.setColorTable(colorTable_opt[0],0);</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>         probImage.open(prob_opt[0],ncol,nrow,nclass,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     probImage.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>         probImage.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>         probImage.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       }</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>         entropyImage.open(entropy_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     entropyImage.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         entropyImage.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>         entropyImage.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       }</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     }</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       cerr << error << endl;</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     }</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>   </div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span> </div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     <span class="keywordflow">if</span>(maskIsVector){</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncol,nrow,1,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>     maskWriter.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         maskWriter.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>         maskWriter.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     maskWriter.rasterizeOgr(extentReader,burnValues);</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     extentReader.close();</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     maskWriter.close();</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>       }</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>         exit(2);</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       }</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>         exit(1);</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>       }</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>       mask_opt.clear();</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     }</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>           std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>         maskReader.open(mask_opt[0]);</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       }</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>         exit(2);</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       }</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>         exit(1);</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       }</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>     }</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span> </div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<nrow;++iline){</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       vector<float> buffer(ncol);</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       vector<short> lineMask;</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>         lineMask.resize(maskReader.nrOfCol());</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> linePrior;</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>      linePrior.resize(nclass,ncol);<span class="comment">//prior prob for each class</span></div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> hpixel(ncol);</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> fpixel(ncol);</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> probOut(nclass,ncol);<span class="comment">//posterior prob for each (internal) class</span></div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       vector<float> entropy(ncol);</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       <a class="code" href="classVector2d.html">Vector2d<char></a> classBag;<span class="comment">//classified line for writing to image file</span></div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>         classBag.resize(nbag,ncol);</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       <span class="comment">//read all bands of all pixels in this line in hline</span></div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>         <span class="keywordflow">if</span>(band_opt.size()){</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>               std::cout << <span class="stringliteral">"reading band "</span> << band_opt[iband] << std::endl;</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>             assert(band_opt[iband]>=0);</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>             assert(band_opt[iband]<testImage.nrOfBand());</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>             testImage.readData(buffer,GDT_Float32,iline,band_opt[iband]);</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>               hpixel[icol].push_back(buffer[icol]);</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>           }</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>         }</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>               std::cout << <span class="stringliteral">"reading band "</span> << iband << std::endl;</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>             assert(iband>=0);</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>             assert(iband<testImage.nrOfBand());</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>             testImage.readData(buffer,GDT_Float32,iline,iband);</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>               hpixel[icol].push_back(buffer[icol]);</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>           }</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>         }</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       }</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>         cerr << <span class="stringliteral">"Error reading "</span> << input_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>         exit(3);</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>       }</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>         exit(3);</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       }</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       assert(nband==hpixel[0].size());</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>         cout << <span class="stringliteral">"used bands: "</span> << nband << endl;</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       <span class="comment">//read prior</span></div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>         <span class="keywordflow">if</span>(verbose_opt.size()>1)</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>           std::cout << <span class="stringliteral">"Reading "</span> << priorimg_opt[0] << <span class="stringliteral">" band "</span> << iclass << <span class="stringliteral">" line "</span> << iline << std::endl;</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>         priorReader.readData(linePrior[iclass],GDT_Float32,iline,iclass);</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       }</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>         }</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       std::cerr << <span class="stringliteral">"Error reading "</span> << priorimg_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>           exit(3);</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>         }</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>         <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>           cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>           exit(3);</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>         }</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       }</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       <span class="comment">//process per pixel</span></div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>         assert(hpixel[icol].size()==nband);</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     <span class="keywordtype">bool</span> doClassify=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     <span class="keywordtype">double</span> geox=0;</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     <span class="keywordtype">double</span> geoy=0;</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>         <span class="keywordflow">if</span>(maskIsVector){</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       doClassify=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="comment">//check enveloppe first</span></div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>       <span class="keywordflow">if</span>(uly>=geoy&&lry<=geoy&&ulx<=geox&&lrx>=geox){</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>         doClassify=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       }</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     }</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       <span class="comment">//read mask</span></div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       <span class="keywordtype">double</span> colMask=0;</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       <span class="keywordtype">double</span> rowMask=0;</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span> </div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>           assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>         <span class="comment">// maskReader.readData(lineMask[imask],GDT_Int32,static_cast<int>(rowMask));</span></div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>         maskReader.readData(lineMask,GDT_Int16,static_cast<int>(rowMask));</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>           }</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>         cerr << errorstring << endl;</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>         exit(1);</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>           }</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>           <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>         exit(3);</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>           }</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>           oldRowMask=rowMask;</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>         }</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>         <span class="keywordtype">short</span> theMask=0;</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>           <span class="keywordflow">if</span>(msknodata_opt[ivalue]>=0){<span class="comment">//values set in msknodata_opt are invalid</span></div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>         <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[ivalue]){</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>           theMask=lineMask[colMask];</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>         }</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>           }</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>           <span class="keywordflow">else</span>{<span class="comment">//only values set in msknodata_opt are valid</span></div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>         <span class="keywordflow">if</span>(lineMask[colMask]!=-msknodata_opt[ivalue]){</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>           theMask=lineMask[colMask];</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>         }</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>           masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>         }</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>           }</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         }</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>         <span class="keywordflow">if</span>(masked){</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>           <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>           classBag[ibag][icol]=theMask;</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>           classOut[icol]=theMask;</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         }</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       }</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>       <span class="keywordtype">bool</span> valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<hpixel[icol].size();++iband){</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>         <span class="keywordflow">if</span>(hpixel[icol][iband]){</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>           valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>         }</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>       }</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       <span class="keywordflow">if</span>(!valid)</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>         doClassify=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span> </div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>     }</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>           probOut[iclass][icol]=0;</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>     <span class="keywordflow">if</span>(!doClassify){</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>           classBag[ibag][icol]=nodata_opt[0];</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>       classOut[icol]=nodata_opt[0];</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>       <span class="keywordflow">continue</span>;<span class="comment">//next column</span></div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>     }</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>       std::cout << <span class="stringliteral">"begin classification "</span> << std::endl;</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         <span class="comment">//----------------------------------- classification -------------------</span></div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>           <span class="comment">//calculate image features</span></div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>           fpixel[icol].clear();</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>             fpixel[icol].push_back((hpixel[icol][iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>           vector<float> result(nclass);</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>           result=net[ibag].run(fpixel[icol]);</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>           <span class="keywordtype">int</span> maxClass=0;</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>           vector<float> prValues(nclass);</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>           <span class="keywordtype">float</span> maxP=0;</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span> </div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>           <span class="comment">//calculate posterior prob of bag </span></div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>             <span class="comment">//search for max prob within bag</span></div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>             maxP=0;</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>             classBag[ibag][icol]=0;</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           }</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>       <span class="keywordtype">double</span> normPrior=0;</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>           normPrior+=linePrior[iclass][icol];</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>       }</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>         result[iclass]=(result[iclass]+1.0)/2.0;<span class="comment">//bring back to scale [0,1]</span></div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>         <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>           priors[iclass]=linePrior[iclass][icol]/normPrior;<span class="comment">//todo: check if correct for all cases... (automatic classValueMap and manual input for names and values)</span></div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>             <span class="keywordflow">switch</span>(comb_opt[0]){</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>             <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>             <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>               probOut[iclass][icol]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>             <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>               probOut[iclass][icol]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>             <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>               <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass][icol])</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>                 probOut[iclass][icol]=priors[iclass]*result[iclass];</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>             }</div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>             <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>               <span class="comment">//search for max prob within bag</span></div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>               <span class="comment">// if(prValues[iclass]>maxP){</span></div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>               <span class="comment">//   maxP=prValues[iclass];</span></div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>               <span class="comment">//   classBag[ibag][icol]=vcode[iclass];</span></div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>               <span class="comment">// }</span></div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>               <span class="keywordflow">if</span>(result[iclass]>maxP){</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>                 maxP=result[iclass];</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>                 classBag[ibag][icol]=iclass;</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>               }</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>             }</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>           }</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>         }<span class="comment">//ibag</span></div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span> </div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>         <span class="comment">//search for max class prob</span></div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>         <span class="keywordtype">float</span> maxBag1=0;<span class="comment">//max probability</span></div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>         <span class="keywordtype">float</span> maxBag2=0;<span class="comment">//second max probability</span></div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>         <span class="keywordtype">float</span> normBag=0;</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>           <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag1){</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>             maxBag1=probOut[iclass][icol];</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>             classOut[icol]=classValueMap[nameVector[iclass]];</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>           }</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag2)</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>             maxBag2=probOut[iclass][icol];</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>           normBag+=probOut[iclass][icol];</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>         }</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>         <span class="comment">//normalize probOut and convert to percentage</span></div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         entropy[icol]=0;</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>           <span class="keywordtype">float</span> prv=probOut[iclass][icol];</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>           prv/=normBag;</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>           entropy[icol]-=prv*log(prv)/log(2.0);</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>           prv*=100.0;</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>             </div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>           probOut[iclass][icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(prv+0.5);</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]<probOut.size());</span></div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]>=0);</span></div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>           <span class="comment">// probOut[classValueMap[nameVector[iclass]]][icol]=static_cast<short>(prv+0.5);</span></div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         }</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         entropy[icol]/=log(static_cast<double>(nclass))/log(2.0);</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         entropy[icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(100*entropy[icol]+0.5);</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>       <span class="keywordflow">if</span>(entropy[icol]>activePoints.back().value){</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>         activePoints.back().value=entropy[icol];<span class="comment">//replace largest value (last)</span></div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>         activePoints.back().posx=icol;</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>         activePoints.back().posy=iline;</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>         std::sort(activePoints.begin(),activePoints.end(),<a class="code" href="classDecrease__PosValue.html">Decrease_PosValue</a>());<span class="comment">//sort in descending order (largest first, smallest last)</span></div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>           std::cout << activePoints.back().posx << <span class="stringliteral">" "</span> << activePoints.back().posy << <span class="stringliteral">" "</span> << activePoints.back().value << std::endl;</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>       }</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>         }</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       }<span class="comment">//icol</span></div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>       <span class="comment">//----------------------------------- write output ------------------------------------------</span></div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>           classImageBag.writeData(classBag[ibag],GDT_Byte,iline,ibag);</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>           probImage.writeData(probOut[iclass],GDT_Float32,iline,iclass);</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>       }</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         entropyImage.writeData(entropy,GDT_Float32,iline);</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       }</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>       classImageOut.writeData(classOut,GDT_Byte,iline);</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(iline+1.0)/classImageOut.nrOfRow();</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       }</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>     }</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>     <span class="comment">//write active learning points</span></div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>     std::map<string,double> pointMap;</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<testImage.nrOfBand();++iband){</div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       <span class="keywordtype">double</span> value;</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       testImage.readData(value,GDT_Float64,static_cast<int>(activePoints[iactive].posx),static_cast<int>(activePoints[iactive].posy),iband);</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>       ostringstream fs;</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>       fs << <span class="stringliteral">"B"</span> << iband;</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>       pointMap[fs.str()]=value;</div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>     }</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>     pointMap[label_opt[0]]=0;</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>     <span class="keywordtype">double</span> x, y;</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>     testImage.image2geo(activePoints[iactive].posx,activePoints[iactive].posy,x,y);</div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>         std::string fieldname=<span class="stringliteral">"id"</span>;<span class="comment">//number of the point</span></div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>     activeWriter.addPoint(x,y,pointMap,fieldname,++nactive);</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>       }</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>     }</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span> </div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>     testImage.close();</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>       maskReader.close();</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>     <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>       priorReader.close();</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>     <span class="keywordflow">if</span>(prob_opt.size())</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>       probImage.close();</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>     <span class="keywordflow">if</span>(entropy_opt.size())</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       entropyImage.close();</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>     <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       classImageBag.close();</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>     classImageOut.close();</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>   }</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>   <span class="keywordflow">else</span>{<span class="comment">//classify vector file</span></div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>     cm.clearResults();</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>     <span class="comment">//notice that fields have already been set by readDataImageOgr (taking into account appropriate bands)</span></div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalidation=0;ivalidation<input_opt.size();++ivalidation){</div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>         assert(output_opt.size()==input_opt.size());</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>         cout << <span class="stringliteral">"opening img reader "</span> << input_opt[ivalidation] << endl;</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>       imgReaderOgr.open(input_opt[ivalidation]);</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> imgWriterOgr;</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> </div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       std::cout << <span class="stringliteral">"opening img writer and copying fields from img reader"</span> << output_opt[ivalidation] << std::endl;</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>     imgWriterOgr.open(output_opt[ivalidation],imgReaderOgr);</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>       }</div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>     cout << <span class="stringliteral">"number of layers in input ogr file: "</span> << imgReaderOgr.getLayerCount() << endl;</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<imgReaderOgr.getLayerCount();++ilayer){</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>       cout << <span class="stringliteral">"processing input layer "</span> << ilayer << endl;</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>     <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>         std::cout << <span class="stringliteral">"creating field class"</span> << std::endl;</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>       <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTInteger,ilayer);</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTString,ilayer);</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>     }</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=imgReaderOgr.getFeatureCount(ilayer);</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>     progress=0;</div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>     OGRFeature *poFeature;</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     <span class="keywordflow">while</span>( (poFeature = imgReaderOgr.getLayer(ilayer)->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>         cout << <span class="stringliteral">"feature "</span> << ifeature << endl;</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>       <span class="keywordflow">if</span>( poFeature == NULL ){</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>         cout << <span class="stringliteral">"Warning: could not read feature "</span> << ifeature << <span class="stringliteral">" in layer "</span> << imgReaderOgr.getLayerName(ilayer) << endl;</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>       }</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>       OGRFeature *poDstFeature = NULL;</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>         poDstFeature=imgWriterOgr.createFeature(ilayer);</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>         <span class="keywordflow">if</span>( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>           OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>         }</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>       }</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>       vector<float> validationPixel;</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>       vector<float> validationFeature;</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>         </div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>       imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature,ilayer);</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>       assert(validationPixel.size()==nband);</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       vector<float> probOut(nclass);<span class="comment">//posterior prob for each class</span></div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>         probOut[iclass]=0;</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>           validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>           <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>         std:: cout << <span class="stringliteral">" "</span> << validationFeature.back();</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>         }</div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>         <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>           std::cout << std:: endl;</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>         vector<float> result(nclass);</div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>         result=net[ibag].run(validationFeature);</div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span> </div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<result.size();++iclass)</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>         std::cout << result[iclass] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>           std::cout << std::endl;</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>         }</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>         <span class="comment">//calculate posterior prob of bag </span></div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>           result[iclass]=(result[iclass]+1.0)/2.0;<span class="comment">//bring back to scale [0,1]</span></div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>           <span class="keywordflow">switch</span>(comb_opt[0]){</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>           <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>         probOut[iclass]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>           <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>         probOut[iclass]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>           <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass])</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>           probOut[iclass]=priors[iclass]*result[iclass];</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>           }</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>         }</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>       }<span class="comment">//for ibag</span></div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>       <span class="comment">//search for max class prob</span></div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>       <span class="keywordtype">float</span> maxBag=0;</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>       <span class="keywordtype">float</span> normBag=0;</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>       <span class="keywordtype">string</span> classOut=<span class="stringliteral">"Unclassified"</span>;</div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>           std::cout << probOut[iclass] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>         <span class="keywordflow">if</span>(probOut[iclass]>maxBag){</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>           maxBag=probOut[iclass];</div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>           classOut=nameVector[iclass];</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>         }</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>       }</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>       <span class="comment">//look for class name</span></div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>           std::cout << <span class="stringliteral">"->"</span> << classValueMap[classOut] << std::endl;</div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>         <span class="keywordflow">else</span>        </div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>           std::cout << <span class="stringliteral">"->"</span> << classOut << std::endl;</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>       }</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classValueMap[classOut]);</div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>         <span class="keywordflow">else</span>        </div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classOut.c_str());</div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>         poDstFeature->SetFID( poFeature->GetFID() );</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>       }</div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>       <span class="keywordtype">int</span> labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>       <span class="keywordflow">if</span>(labelIndex>=0){</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>         <span class="keywordtype">string</span> classRef=poFeature->GetFieldAsString(labelIndex);</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>         <span class="keywordflow">if</span>(classRef!=<span class="stringliteral">"0"</span>){</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>           <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>         cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);</div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>         cm.incrementResult(classRef,classOut,1);</div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>         }</div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>       }</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>       CPLErrorReset();</div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>         <span class="keywordflow">if</span>(imgWriterOgr.createFeature(poDstFeature,ilayer) != OGRERR_NONE){</div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>         }</div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>       }</div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>       ++ifeature;</div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1.0)/nFeatures;</div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>       }</div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>       OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>       OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>     }<span class="comment">//get next feature</span></div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>       }<span class="comment">//next layer</span></div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>       imgReaderOgr.close();</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>       imgWriterOgr.close();</div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>     }</div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>     <span class="keywordflow">if</span>(cm.nReference()){</div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>       std::cout << cm << std::endl;</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>       <span class="comment">// cout << "class #samples userAcc prodAcc" << endl;</span></div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>       <span class="comment">// double se95_ua=0;</span></div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>       <span class="comment">// double se95_pa=0;</span></div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>       <span class="comment">// double se95_oa=0;</span></div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>       <span class="comment">// double dua=0;</span></div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>       <span class="comment">// double dpa=0;</span></div>
-<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>       <span class="comment">// double doa=0;</span></div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>       <span class="comment">// for(short iclass=0;iclass<cm.nClasses();++iclass){</span></div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>       <span class="comment">//    dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</span></div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>       <span class="comment">//    dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</span></div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>       <span class="comment">//    cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;</span></div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>       <span class="comment">// std::cout << "Kappa: " << cm.kappa() << std::endl;</span></div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>       <span class="comment">// doa=cm.oa_pct(&se95_oa);</span></div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>       <span class="comment">// std::cout << "Overall Accuracy: " << doa << " (" << se95_oa << ")"  << std::endl;</span></div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>     }</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>   }</div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>     <span class="keywordflow">if</span>(active_opt.size())</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>       activeWriter.close();</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>   }</div>
-<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>     std::cerr << <span class="stringliteral">"Error: errorString"</span> << std::endl;</div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>   }</div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>   <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     cout << <span class="stringliteral">"Usage: pkann -t training [-i input -o output] [-cv value]"</span> << endl;</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     cout << endl;</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << endl;</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   }</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span> </div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="keywordflow">if</span>(entropy_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     entropy_opt.clear();</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="keywordflow">if</span>(active_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     active_opt.clear();</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <span class="keywordflow">if</span>(priorimg_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     priorimg_opt.clear();</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span> </div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     <span class="keywordflow">if</span>(input_opt.size())</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>       cout << <span class="stringliteral">"image filename: "</span> << input_opt[0] << endl;</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>       cout << <span class="stringliteral">"mask filename: "</span> << mask_opt[0] << endl;</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     <span class="keywordflow">if</span>(training_opt.size()){</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       cout << <span class="stringliteral">"training vector file: "</span> << endl;</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<training_opt.size();++ifile)</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>         cout << training_opt[ifile] << endl;</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     }</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>       cerr << <span class="stringliteral">"no training file set!"</span> << endl;</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     cout << <span class="stringliteral">"verbose: "</span> << verbose_opt[0] << endl;</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   }</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nbag=(training_opt.size()>1)?training_opt.size():bag_opt[0];</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     cout << <span class="stringliteral">"number of bootstrap aggregations: "</span> << nbag << endl;</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   </div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   OGRLayer  *readLayer;</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span> </div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="keywordtype">double</span> ulx=0;</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordtype">double</span> uly=0;</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   <span class="keywordtype">double</span> lrx=0;</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="keywordtype">double</span> lry=0;</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span> </div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <span class="keywordtype">bool</span> maskIsVector=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>       extentReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       maskIsVector=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>       readLayer = extentReader.getDataSource()->GetLayer(0);</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(ulx,uly,lrx,lry))){</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     cerr << <span class="stringliteral">"Error: could not get extent from "</span> << mask_opt[0] << endl;</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     exit(1);</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>       }</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     }</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>       maskIsVector=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     }</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   }</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span> </div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> activeWriter;</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     activeWriter.open(active_opt[0],ogrformat_opt[0]);</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     activeWriter.createLayer(active_opt[0],trainingReader.getProjection(),wkbPoint,NULL);</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     activeWriter.copyFields(trainingReader);</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   }</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   vector<PosValue> activePoints(nactive_opt[0]);</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     activePoints[iactive].value=1.0;</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     activePoints[iactive].posx=0.0;</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     activePoints[iactive].posy=0.0;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   }</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span> </div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSamples=0;</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nactive=0;</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   vector<FANN::neural_net> net(nbag);<span class="comment">//the neural network</span></div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span> </div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nclass=0;</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   <span class="keywordtype">int</span> startBand=2;<span class="comment">//first two bands represent X and Y pos</span></div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span> </div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="keywordflow">if</span>(priors_opt.size()>1){<span class="comment">//priors from argument list</span></div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     priors.resize(priors_opt.size());</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="keywordtype">double</span> normPrior=0;</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<priors_opt.size();++iclass){</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>       priors[iclass]=priors_opt[iclass];</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       normPrior+=priors[iclass];</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     }</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     <span class="comment">//normalize</span></div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<priors_opt.size();++iclass)</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>       priors[iclass]/=normPrior;</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   }</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span> </div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       }</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       band_opt.clear();</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     }</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>       band_opt.push_back(iband);</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>       }</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     }</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   }</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     exit(1);</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   }</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   <span class="comment">//sort bands</span></div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     std::sort(band_opt.begin(),band_opt.end());</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span> </div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   map<string,short> classValueMap;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   vector<std::string> nameVector;</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   }</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   <a class="code" href="classconfusionmatrix_1_1ConfusionMatrix.html">confusionmatrix::ConfusionMatrix</a> cm;</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   vector< vector<double> > offset(nbag);</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   vector< vector<double> > scale(nbag);</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   map<string,Vector2d<float> > trainingMap;</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   vector<string> fields;</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     <span class="comment">//organize training data</span></div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="keywordflow">if</span>(ibag<training_opt.size()){<span class="comment">//if bag contains new training pixels</span></div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       trainingMap.clear();</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       trainingPixels.clear();</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>         cout << <span class="stringliteral">"reading imageVector file "</span> << training_opt[0] << endl;</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReaderBag(training_opt[ibag]);</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>         <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt);</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt);</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>         <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>           <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training file, did you provide class labels in training sample (see option label)?"</span>;</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>           <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>         }</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     trainingReaderBag.close();</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       }</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>         exit(1);</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       }</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>         exit(1);</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       }</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="comment">//delete class 0 ?</span></div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>       <span class="comment">// if(verbose_opt[0]>=1)</span></div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       <span class="comment">// trainingMap.erase(0);</span></div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       <span class="comment">//convert map to vector</span></div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>         std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>         <span class="comment">//delete small classes</span></div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>         <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>           trainingMap.erase(mapit);</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>         }</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>         trainingPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>           std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>         ++mapit;</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>         }</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="keywordflow">if</span>(!ibag){</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>         nclass=trainingPixels.size();</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     <span class="keywordflow">if</span>(classname_opt.size())</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       assert(nclass==classname_opt.size());</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>         nband=(training_opt.size())?trainingPixels[0][0].size()-2:trainingPixels[0][0].size();<span class="comment">//X and Y</span></div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       }</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>         assert(nclass==trainingPixels.size());</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>         assert(nband==(training_opt.size())?trainingPixels[0][0].size()-2:trainingPixels[0][0].size());</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       }</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span> </div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       <span class="comment">//balance training data</span></div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>       <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>         <span class="keywordflow">while</span>(balance_opt.size()<nclass)</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>           balance_opt.push_back(balance_opt.back());</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>         <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>           srand(time(NULL));</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         totalSamples=0;</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>           <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>             <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>               <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>               trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>             }</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           }</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>             <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[iclass];++isample){</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>               <span class="keywordtype">int</span> index = rand()%oldsize;</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>               trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>             }</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>           }</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>           totalSamples+=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         }</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       }</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>     </div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       <span class="comment">//set scale and offset</span></div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       offset[ibag].resize(nband);</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       scale[ibag].resize(nband);</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>         assert(offset_opt.size()==nband);</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         assert(scale_opt.size()==nband);</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>           cout << <span class="stringliteral">"scaling for band"</span> << iband << endl;</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         offset[ibag][iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>         scale[ibag][iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>         <span class="comment">//search for min and maximum</span></div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         <span class="keywordflow">if</span>(scale[ibag][iband]<=0){</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>           <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>               <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>                 theMin=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>               <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>                 theMax=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>             }</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           }</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           offset[ibag][iband]=theMin+(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>           scale[ibag][iband]=(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>           <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>             std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>             std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[ibag][iband] << <span class="stringliteral">", "</span> << scale[ibag][iband] << std::endl;</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>             std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">","</span> << (theMax-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">"]"</span> <&lt [...]
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>           }</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         }</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       }</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>     }</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     <span class="keywordflow">else</span>{<span class="comment">//use same offset and scale </span></div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       offset[ibag].resize(nband);</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       scale[ibag].resize(nband);</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>         offset[ibag][iband]=offset[0][iband];</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>         scale[ibag][iband]=scale[0][iband];</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>       }</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     }</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       </div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     <span class="keywordflow">if</span>(!ibag){</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>       <span class="keywordflow">if</span>(priors_opt.size()==1){<span class="comment">//default: equal priors for each class</span></div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>         priors.resize(nclass);</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>           priors[iclass]=1.0/nclass;</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       }</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       assert(priors_opt.size()==1||priors_opt.size()==nclass);</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     </div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       <span class="comment">//set bagsize for each class if not done already via command line</span></div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       <span class="keywordflow">while</span>(bagSize_opt.size()<nclass)</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>         bagSize_opt.push_back(bagSize_opt.back());</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span> </div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>         std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>         std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>         std::cout << <span class="stringliteral">"priors:"</span>;</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     <span class="keywordflow">if</span>(priorimg_opt.empty()){</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>             std::cout << <span class="stringliteral">" "</span> << priors[iclass];</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>           std::cout << std::endl;</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>         }</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       }</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       <span class="keywordtype">bool</span> doSort=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     nameVector.push_back(mapit->first);</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>         <span class="keywordflow">if</span>(cm.getClassIndex(type2string<short>(classValueMap[mapit->first]))<0)</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>           cm.pushBackClassName(type2string<short>(classValueMap[mapit->first]),doSort);</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       }</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>         std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>         exit(1);</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       }</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     }</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>       cm.pushBackClassName(mapit->first,doSort);</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     ++mapit;</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>       }</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       <span class="keywordflow">if</span>(classname_opt.empty()){</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>         <span class="comment">//std::cerr << "Warning: no class name and value pair provided for all " << nclass << " classes, using string2type<int> instead!" << std::endl;</span></div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>             std::cout << iclass << <span class="stringliteral">" "</span> << cm.getClass(iclass) << <span class="stringliteral">" -> "</span> << string2type<short>(cm.getClass(iclass)) << std::endl;</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>           classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass));</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>         }</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       }</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordflow">if</span>(priors_opt.size()==nameVector.size()){</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     std::cerr << <span class="stringliteral">"Warning: please check if priors are provided in correct order!!!"</span> << std::endl;</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nameVector.size();++iclass)</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       std::cerr << nameVector[iclass] << <span class="stringliteral">" "</span> << priors_opt[iclass] << std::endl;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       }</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     }<span class="comment">//if(!ibag)</span></div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span> </div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="comment">//Calculate features of training set</span></div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     vector< Vector2d<float> > trainingFeatures(nclass);</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       <span class="keywordtype">int</span> nctraining=0;</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>         cout << <span class="stringliteral">"calculating features for class "</span> << iclass << endl;</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         srand(time(NULL));</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       nctraining=(bagSize_opt[iclass]<100)? trainingPixels[iclass].size()/100.0*bagSize_opt[iclass] : trainingPixels[iclass].size();<span class="comment">//bagSize_opt[iclass] given in % of training size</span></div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       <span class="keywordflow">if</span>(nctraining<=0)</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>         nctraining=1;</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       assert(nctraining<=trainingPixels[iclass].size());</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="keywordtype">int</span> index=0;</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       <span class="keywordflow">if</span>(bagSize_opt[iclass]<100)</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>         random_shuffle(trainingPixels[iclass].begin(),trainingPixels[iclass].end());</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       </div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       trainingFeatures[iclass].resize(nctraining);</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining;++isample){</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>           <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>           trainingFeatures[iclass][isample].push_back((value-offset[ibag][iband])/scale[ibag][iband]);</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>         }</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       }</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       assert(trainingFeatures[iclass].size()==nctraining);</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     }</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     </div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ntraining=0;</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       ntraining+=trainingFeatures[iclass].size();</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span> </div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> num_layers = nneuron_opt.size()+2;</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     <span class="keyword">const</span> <span class="keywordtype">float</span> desired_error = 0.0003;</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterations_between_reports = (verbose_opt[0])? maxit_opt[0]+1:0;</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>       cout << <span class="stringliteral">"number of features: "</span> << nFeatures << endl;</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       cout << <span class="stringliteral">"creating artificial neural network with "</span> << nneuron_opt.size() << <span class="stringliteral">" hidden layer, having "</span> << endl;</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nneuron_opt.size();++ilayer)</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>         cout << nneuron_opt[ilayer] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       cout << <span class="stringliteral">"neurons"</span> << endl;</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       cout << <span class="stringliteral">"connection_opt[0]: "</span> << connection_opt[0] << std::endl;</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       cout << <span class="stringliteral">"num_layers: "</span> << num_layers << std::endl;</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       cout << <span class="stringliteral">"nFeatures: "</span> << nFeatures << std::endl;</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       cout << <span class="stringliteral">"nneuron_opt[0]: "</span> << nneuron_opt[0] << std::endl;</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       cout << <span class="stringliteral">"number of classes (nclass): "</span> << nclass << std::endl;</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     }</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     <span class="keywordflow">switch</span>(num_layers){</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     <span class="keywordflow">case</span>(3):{</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       <span class="comment">// net[ibag].create_sparse(connection_opt[0],num_layers, nFeatures, nneuron_opt[0], nclass);//replace all create_sparse with create_sparse_array due to bug in FANN!</span></div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> layers[3];</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       layers[0]=nFeatures;</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       layers[1]=nneuron_opt[0];</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       layers[2]=nclass;</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       net[ibag].create_sparse_array(connection_opt[0],num_layers,layers);</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>     }</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="keywordflow">case</span>(4):{</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> layers[4];</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       layers[0]=nFeatures;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       layers[1]=nneuron_opt[0];</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       layers[2]=nneuron_opt[1];</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       layers[3]=nclass;</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="comment">// layers.push_back(nFeatures);</span></div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="comment">// for(int ihidden=0;ihidden<nneuron_opt.size();++ihidden)</span></div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       <span class="comment">//    layers.push_back(nneuron_opt[ihidden]);</span></div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="comment">// layers.push_back(nclass);</span></div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       net[ibag].create_sparse_array(connection_opt[0],num_layers,layers);</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     }</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       cerr << <span class="stringliteral">"Only 1 or 2 hidden layers are supported!"</span> << endl;</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       exit(1);</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     }</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       cout << <span class="stringliteral">"network created"</span> << endl;</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>   </div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     net[ibag].set_learning_rate(learning_opt[0]);</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span> </div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     <span class="comment">//   net.set_activation_steepness_hidden(1.0);</span></div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     <span class="comment">//   net.set_activation_steepness_output(1.0);</span></div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>     </div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     net[ibag].set_activation_function_hidden(FANN::SIGMOID_SYMMETRIC_STEPWISE);</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     net[ibag].set_activation_function_output(FANN::SIGMOID_SYMMETRIC_STEPWISE);</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span> </div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     <span class="comment">// Set additional properties such as the training algorithm</span></div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="comment">//   net.set_training_algorithm(FANN::TRAIN_QUICKPROP);</span></div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span> </div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     <span class="comment">// Output network type and parameters</span></div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       cout << endl << <span class="stringliteral">"Network Type                         :  "</span>;</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       <span class="keywordflow">switch</span> (net[ibag].get_network_type())</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>         {</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>         <span class="keywordflow">case</span> FANN::LAYER:</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>           cout << <span class="stringliteral">"LAYER"</span> << endl;</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>         <span class="keywordflow">case</span> FANN::SHORTCUT:</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>           cout << <span class="stringliteral">"SHORTCUT"</span> << endl;</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>           cout << <span class="stringliteral">"UNKNOWN"</span> << endl;</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>         }</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       net[ibag].print_parameters();</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     }</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       </div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>         std::cout << <span class="stringliteral">"cross validation"</span> << std::endl;</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       vector<unsigned short> referenceVector;</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       vector<unsigned short> outputVector;</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       <span class="keywordtype">float</span> rmse=net[ibag].cross_validation(trainingFeatures,</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>                                             ntraining,</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>                                             cv_opt[0],</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>                                             maxit_opt[0],</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>                                             desired_error,</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>                                             referenceVector,</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>                                             outputVector,</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>                                             verbose_opt[0]);</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<referenceVector.size();++isample){</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     <span class="keywordtype">string</span> refClassName=nameVector[referenceVector[isample]];</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     <span class="keywordtype">string</span> className=nameVector[outputVector[isample]];</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       cm.incrementResult(type2string<short>(classValueMap[refClassName]),type2string<short>(classValueMap[className]),1.0/nbag);</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       cm.incrementResult(cm.getClass(referenceVector[isample]),cm.getClass(outputVector[isample]),1.0/nbag);</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       }        </div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     }</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   </div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>       cout << endl << <span class="stringliteral">"Set training data"</span> << endl;</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span> </div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       cout << endl << <span class="stringliteral">"Training network"</span> << endl;</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     </div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       cout << <span class="stringliteral">"Max Epochs "</span> << setw(8) << maxit_opt[0] << <span class="stringliteral">". "</span></div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>            << <span class="stringliteral">"Desired Error: "</span> << left << desired_error << right << endl;</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     }</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     <span class="keywordflow">if</span>(weights_opt.size()==net[ibag].get_total_connections()){<span class="comment">//no new training needed (same training sample)</span></div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       vector<fann_connection> convector;</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       net[ibag].get_connection_array(convector);</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i_connection=0;i_connection<net[ibag].get_total_connections();++i_connection)</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>         convector[i_connection].weight=weights_opt[i_connection];</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       net[ibag].set_weight_array(convector);</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     }</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>       <span class="keywordtype">bool</span> initWeights=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       net[ibag].train_on_data(trainingFeatures,ntraining,initWeights, maxit_opt[0],</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>                               iterations_between_reports, desired_error);</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     }</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span> </div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span> </div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=2){</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       net[ibag].print_connections();</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>       vector<fann_connection> convector;</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       net[ibag].get_connection_array(convector);</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i_connection=0;i_connection<net[ibag].get_total_connections();++i_connection)</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>         cout << <span class="stringliteral">"connection "</span> << i_connection << <span class="stringliteral">": "</span> << convector[i_connection].weight << endl;</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span> </div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     }</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>   }<span class="comment">//for ibag</span></div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>   <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     assert(cm.nReference());</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     cm.setFormat(cmformat_opt[0]);</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     cm.reportSE95(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     std::cout << cm << std::endl;</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     cout << <span class="stringliteral">"class #samples userAcc prodAcc"</span> << endl;</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     <span class="keywordtype">double</span> se95_ua=0;</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     <span class="keywordtype">double</span> se95_pa=0;</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     <span class="keywordtype">double</span> se95_oa=0;</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <span class="keywordtype">double</span> dua=0;</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     <span class="keywordtype">double</span> dpa=0;</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     <span class="keywordtype">double</span> doa=0;</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<cm.nClasses();++iclass){</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>       dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       cout << cm.getClass(iclass) << <span class="stringliteral">" "</span> << cm.nReference(cm.getClass(iclass)) << <span class="stringliteral">" "</span> << dua << <span class="stringliteral">" ("</span> << se95_ua << <span class="stringliteral">")"</span> << <span class="stringliteral">" "</span> <<  [...]
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     }</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     std::cout << <span class="stringliteral">"Kappa: "</span> << cm.kappa() << std::endl;</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>     doa=cm.oa_pct(&se95_oa);</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     std::cout << <span class="stringliteral">"Overall Accuracy: "</span> << doa << <span class="stringliteral">" ("</span> << se95_oa << <span class="stringliteral">")"</span>  << std::endl;</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   }</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>   <span class="comment">//--------------------------------- end of training -----------------------------------</span></div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>   <span class="keywordflow">if</span>(input_opt.empty())</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     exit(0);</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span> </div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     <span class="keywordtype">float</span> progress=0;</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>   <span class="comment">//-------------------------------- open image file ------------------------------------</span></div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>   <span class="keywordtype">bool</span> inputIsRaster=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> imgReaderOgr;</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     imgReaderOgr.open(input_opt[0]);</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>     imgReaderOgr.close();</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>   }</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     inputIsRaster=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>   }</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>   <span class="keywordflow">if</span>(inputIsRaster){</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>   <span class="comment">// if(input_opt[0].find(".shp")==string::npos){</span></div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> testImage;</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>         cout << <span class="stringliteral">"opening image "</span> << input_opt[0] << endl; </div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       testImage.open(input_opt[0]);</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     }</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       cerr << error << endl;</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>       exit(2);</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>     }</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> priorReader;</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>           std::cout << <span class="stringliteral">"opening prior image "</span> << priorimg_opt[0] << std::endl;</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>         priorReader.open(priorimg_opt[0]);</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>         assert(priorReader.nrOfCol()==testImage.nrOfCol());</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>         assert(priorReader.nrOfRow()==testImage.nrOfRow());</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>       }</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>         exit(2);</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       }</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>         exit(1);</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>       }</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     }</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span> </div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     <span class="keywordtype">int</span> nrow=testImage.nrOfRow();</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>     <span class="keywordtype">int</span> ncol=testImage.nrOfCol();</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       theInterleave+=testImage.getInterleave();</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>     }</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     vector<char> classOut(ncol);<span class="comment">//classified line for writing to image file</span></div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span> </div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     <span class="comment">//   assert(nband==testImage.nrOfBand());</span></div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageBag;</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageOut;</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> probImage;</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> entropyImage;</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span> </div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>     <span class="keywordtype">string</span> imageType;<span class="comment">//testImage.getImageType();</span></div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>     <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span> </div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         cout << <span class="stringliteral">"opening class image for writing output "</span> << output_opt[0] << endl;</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>         classImageBag.open(classBag_opt[0],ncol,nrow,nbag,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     classImageBag.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>         classImageBag.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>         classImageBag.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       }</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       classImageOut.open(output_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       classImageOut.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       classImageOut.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       classImageOut.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       <span class="keywordflow">if</span>(colorTable_opt.size())</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>         classImageOut.setColorTable(colorTable_opt[0],0);</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>         probImage.open(prob_opt[0],ncol,nrow,nclass,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     probImage.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>         probImage.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>         probImage.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       }</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         entropyImage.open(entropy_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>     entropyImage.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         entropyImage.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         entropyImage.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       }</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     }</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       cerr << error << endl;</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     }</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>   </div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span> </div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     <span class="keywordflow">if</span>(maskIsVector){</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>     maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncol,nrow,1,GDT_Float32,imageType,option_opt);</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>     maskWriter.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>         maskWriter.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         maskWriter.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     maskWriter.rasterizeOgr(extentReader,burnValues);</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>     extentReader.close();</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     maskWriter.close();</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>       }</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>         exit(2);</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       }</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>         exit(1);</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       }</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>       mask_opt.clear();</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>       mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     }</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>           std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>         maskReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>       }</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>         exit(2);</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       }</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>         exit(1);</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       }</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>     }</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span> </div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<nrow;++iline){</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       vector<float> buffer(ncol);</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       vector<short> lineMask;</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>       <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>         lineMask.resize(maskReader.nrOfCol());</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> linePrior;</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>      linePrior.resize(nclass,ncol);<span class="comment">//prior prob for each class</span></div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> hpixel(ncol);</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> fpixel(ncol);</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> probOut(nclass,ncol);<span class="comment">//posterior prob for each (internal) class</span></div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>       vector<float> entropy(ncol);</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       <a class="code" href="classVector2d.html">Vector2d<char></a> classBag;<span class="comment">//classified line for writing to image file</span></div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>         classBag.resize(nbag,ncol);</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       <span class="comment">//read all bands of all pixels in this line in hline</span></div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>         <span class="keywordflow">if</span>(band_opt.size()){</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>               std::cout << <span class="stringliteral">"reading band "</span> << band_opt[iband] << std::endl;</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>             assert(band_opt[iband]>=0);</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>             assert(band_opt[iband]<testImage.nrOfBand());</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>             testImage.readData(buffer,GDT_Float32,iline,band_opt[iband]);</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>               hpixel[icol].push_back(buffer[icol]);</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>           }</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>         }</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>               std::cout << <span class="stringliteral">"reading band "</span> << iband << std::endl;</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>             assert(iband>=0);</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>             assert(iband<testImage.nrOfBand());</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>             testImage.readData(buffer,GDT_Float32,iline,iband);</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>               hpixel[icol].push_back(buffer[icol]);</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>           }</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>         }</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       }</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>         cerr << <span class="stringliteral">"Error reading "</span> << input_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>         exit(3);</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       }</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>         exit(3);</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       }</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       assert(nband==hpixel[0].size());</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>         cout << <span class="stringliteral">"used bands: "</span> << nband << endl;</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       <span class="comment">//read prior</span></div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>         <span class="keywordflow">if</span>(verbose_opt.size()>1)</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>           std::cout << <span class="stringliteral">"Reading "</span> << priorimg_opt[0] << <span class="stringliteral">" band "</span> << iclass << <span class="stringliteral">" line "</span> << iline << std::endl;</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>         priorReader.readData(linePrior[iclass],GDT_Float32,iline,iclass);</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       }</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>         }</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       std::cerr << <span class="stringliteral">"Error reading "</span> << priorimg_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>           exit(3);</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>         }</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>         <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>           cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>           exit(3);</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>         }</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       }</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       <span class="comment">//process per pixel</span></div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>         assert(hpixel[icol].size()==nband);</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     <span class="keywordtype">bool</span> doClassify=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>     <span class="keywordtype">double</span> geox=0;</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>     <span class="keywordtype">double</span> geoy=0;</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>         <span class="keywordflow">if</span>(maskIsVector){</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       doClassify=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       <span class="comment">//check enveloppe first</span></div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       <span class="keywordflow">if</span>(uly>=geoy&&lry<=geoy&&ulx<=geox&&lrx>=geox){</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>         doClassify=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>       }</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>     }</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       <span class="comment">//read mask</span></div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       <span class="keywordtype">double</span> colMask=0;</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       <span class="keywordtype">double</span> rowMask=0;</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span> </div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>       <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>           assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>           <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>         <span class="comment">// maskReader.readData(lineMask[imask],GDT_Int32,static_cast<int>(rowMask));</span></div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>         maskReader.readData(lineMask,GDT_Int16,static_cast<int>(rowMask));</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>           }</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>         exit(1);</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>           }</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>           <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>         exit(3);</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>           }</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>           oldRowMask=rowMask;</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>         }</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>         <span class="keywordtype">short</span> theMask=0;</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>           <span class="comment">// if(msknodata_opt[ivalue]>=0){//values set in msknodata_opt are invalid</span></div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>         <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[ivalue]){</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>           theMask=lineMask[colMask];</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>         }</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>           <span class="comment">// }</span></div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>           <span class="comment">// else{//only values set in msknodata_opt are valid</span></div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>           <span class="comment">//    if(lineMask[colMask]!=-msknodata_opt[ivalue]){</span></div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>           <span class="comment">//      theMask=lineMask[colMask];</span></div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>           <span class="comment">//      masked=true;</span></div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>           <span class="comment">//    }</span></div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>           <span class="comment">//    else{</span></div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>           <span class="comment">//      masked=false;</span></div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>           <span class="comment">//      break;</span></div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>           <span class="comment">//    }</span></div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>           <span class="comment">// }</span></div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>         }</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>         <span class="keywordflow">if</span>(masked){</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>           <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>           classBag[ibag][icol]=theMask;</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>           classOut[icol]=theMask;</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         }</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       }</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>       <span class="keywordtype">bool</span> valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<hpixel[icol].size();++iband){</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>         <span class="keywordflow">if</span>(hpixel[icol][iband]){</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>           valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>         }</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>       }</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         doClassify=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span> </div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>     }</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>           probOut[iclass][icol]=0;</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>     <span class="keywordflow">if</span>(!doClassify){</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>           classBag[ibag][icol]=nodata_opt[0];</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>       classOut[icol]=nodata_opt[0];</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>       <span class="keywordflow">continue</span>;<span class="comment">//next column</span></div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     }</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>       std::cout << <span class="stringliteral">"begin classification "</span> << std::endl;</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>         <span class="comment">//----------------------------------- classification -------------------</span></div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>           <span class="comment">//calculate image features</span></div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>           fpixel[icol].clear();</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>             fpixel[icol].push_back((hpixel[icol][iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>           vector<float> result(nclass);</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>           result=net[ibag].run(fpixel[icol]);</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>           <span class="keywordtype">int</span> maxClass=0;</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>           vector<float> prValues(nclass);</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>           <span class="keywordtype">float</span> maxP=0;</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span> </div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>           <span class="comment">//calculate posterior prob of bag </span></div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>           <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>             <span class="comment">//search for max prob within bag</span></div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>             maxP=0;</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>             classBag[ibag][icol]=0;</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>           }</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>       <span class="keywordtype">double</span> normPrior=0;</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>           normPrior+=linePrior[iclass][icol];</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>       }</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>         result[iclass]=(result[iclass]+1.0)/2.0;<span class="comment">//bring back to scale [0,1]</span></div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>         <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>           priors[iclass]=linePrior[iclass][icol]/normPrior;<span class="comment">//todo: check if correct for all cases... (automatic classValueMap and manual input for names and values)</span></div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>             <span class="keywordflow">switch</span>(comb_opt[0]){</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>             <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>             <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>               probOut[iclass][icol]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>             <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>               probOut[iclass][icol]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>             <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>               <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass][icol])</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>                 probOut[iclass][icol]=priors[iclass]*result[iclass];</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>             }</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>             <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>               <span class="comment">//search for max prob within bag</span></div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>               <span class="comment">// if(prValues[iclass]>maxP){</span></div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>               <span class="comment">//   maxP=prValues[iclass];</span></div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>               <span class="comment">//   classBag[ibag][icol]=vcode[iclass];</span></div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>               <span class="comment">// }</span></div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>               <span class="keywordflow">if</span>(result[iclass]>maxP){</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>                 maxP=result[iclass];</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>                 classBag[ibag][icol]=iclass;</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>               }</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>             }</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>           }</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>         }<span class="comment">//ibag</span></div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span> </div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>         <span class="comment">//search for max class prob</span></div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>         <span class="keywordtype">float</span> maxBag1=0;<span class="comment">//max probability</span></div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>         <span class="keywordtype">float</span> maxBag2=0;<span class="comment">//second max probability</span></div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>         <span class="keywordtype">float</span> normBag=0;</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>           <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag1){</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>             maxBag1=probOut[iclass][icol];</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>             classOut[icol]=classValueMap[nameVector[iclass]];</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>           }</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag2)</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>             maxBag2=probOut[iclass][icol];</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>           normBag+=probOut[iclass][icol];</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         }</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>         <span class="comment">//normalize probOut and convert to percentage</span></div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>         entropy[icol]=0;</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>           <span class="keywordtype">float</span> prv=probOut[iclass][icol];</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>           prv/=normBag;</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>           entropy[icol]-=prv*log(prv)/log(2.0);</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>           prv*=100.0;</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>             </div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>           probOut[iclass][icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(prv+0.5);</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]<probOut.size());</span></div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]>=0);</span></div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>           <span class="comment">// probOut[classValueMap[nameVector[iclass]]][icol]=static_cast<short>(prv+0.5);</span></div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         }</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>         entropy[icol]/=log(static_cast<double>(nclass))/log(2.0);</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         entropy[icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(100*entropy[icol]+0.5);</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       <span class="keywordflow">if</span>(entropy[icol]>activePoints.back().value){</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>         activePoints.back().value=entropy[icol];<span class="comment">//replace largest value (last)</span></div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>         activePoints.back().posx=icol;</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         activePoints.back().posy=iline;</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>         std::sort(activePoints.begin(),activePoints.end(),<a class="code" href="classDecrease__PosValue.html">Decrease_PosValue</a>());<span class="comment">//sort in descending order (largest first, smallest last)</span></div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>           std::cout << activePoints.back().posx << <span class="stringliteral">" "</span> << activePoints.back().posy << <span class="stringliteral">" "</span> << activePoints.back().value << std::endl;</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       }</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>         }</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       }<span class="comment">//icol</span></div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>       <span class="comment">//----------------------------------- write output ------------------------------------------</span></div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>           classImageBag.writeData(classBag[ibag],GDT_Byte,iline,ibag);</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>           probImage.writeData(probOut[iclass],GDT_Float32,iline,iclass);</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>       }</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>         entropyImage.writeData(entropy,GDT_Float32,iline);</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       }</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>       classImageOut.writeData(classOut,GDT_Byte,iline);</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(iline+1.0)/classImageOut.nrOfRow();</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>       }</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>     }</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>     <span class="comment">//write active learning points</span></div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>     std::map<string,double> pointMap;</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<testImage.nrOfBand();++iband){</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>       <span class="keywordtype">double</span> value;</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>       testImage.readData(value,GDT_Float64,static_cast<int>(activePoints[iactive].posx),static_cast<int>(activePoints[iactive].posy),iband);</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>       ostringstream fs;</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>       fs << <span class="stringliteral">"B"</span> << iband;</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>       pointMap[fs.str()]=value;</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>     }</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>     pointMap[label_opt[0]]=0;</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>     <span class="keywordtype">double</span> x, y;</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>     testImage.image2geo(activePoints[iactive].posx,activePoints[iactive].posy,x,y);</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>         std::string fieldname=<span class="stringliteral">"id"</span>;<span class="comment">//number of the point</span></div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>     activeWriter.addPoint(x,y,pointMap,fieldname,++nactive);</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>       }</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>     }</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span> </div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>     testImage.close();</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>       maskReader.close();</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>     <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>       priorReader.close();</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>     <span class="keywordflow">if</span>(prob_opt.size())</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       probImage.close();</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>     <span class="keywordflow">if</span>(entropy_opt.size())</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       entropyImage.close();</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>     <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>       classImageBag.close();</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>     classImageOut.close();</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>   }</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>   <span class="keywordflow">else</span>{<span class="comment">//classify vector file</span></div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     cm.clearResults();</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>     <span class="comment">//notice that fields have already been set by readDataImageOgr (taking into account appropriate bands)</span></div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalidation=0;ivalidation<input_opt.size();++ivalidation){</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>         assert(output_opt.size()==input_opt.size());</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>         cout << <span class="stringliteral">"opening img reader "</span> << input_opt[ivalidation] << endl;</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>       imgReaderOgr.open(input_opt[ivalidation]);</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> imgWriterOgr;</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span> </div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>       std::cout << <span class="stringliteral">"opening img writer and copying fields from img reader"</span> << output_opt[ivalidation] << std::endl;</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>     imgWriterOgr.open(output_opt[ivalidation],imgReaderOgr);</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       }</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>     cout << <span class="stringliteral">"number of layers in input ogr file: "</span> << imgReaderOgr.getLayerCount() << endl;</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<imgReaderOgr.getLayerCount();++ilayer){</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       cout << <span class="stringliteral">"processing input layer "</span> << ilayer << endl;</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>         std::cout << <span class="stringliteral">"creating field class"</span> << std::endl;</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>       <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTInteger,ilayer);</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTString,ilayer);</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>     }</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=imgReaderOgr.getFeatureCount(ilayer);</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>     progress=0;</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>     OGRFeature *poFeature;</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     <span class="keywordflow">while</span>( (poFeature = imgReaderOgr.getLayer(ilayer)->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>         cout << <span class="stringliteral">"feature "</span> << ifeature << endl;</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>       <span class="keywordflow">if</span>( poFeature == NULL ){</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>         cout << <span class="stringliteral">"Warning: could not read feature "</span> << ifeature << <span class="stringliteral">" in layer "</span> << imgReaderOgr.getLayerName(ilayer) << endl;</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>       }</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>       OGRFeature *poDstFeature = NULL;</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>         poDstFeature=imgWriterOgr.createFeature(ilayer);</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>         <span class="keywordflow">if</span>( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>           OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>         }</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>       }</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>       vector<float> validationPixel;</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>       vector<float> validationFeature;</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>         </div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature,ilayer);</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       assert(validationPixel.size()==nband);</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>       vector<float> probOut(nclass);<span class="comment">//posterior prob for each class</span></div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>         probOut[iclass]=0;</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>           validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>           <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>         std:: cout << <span class="stringliteral">" "</span> << validationFeature.back();</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>         }</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>         <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>           std::cout << std:: endl;</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>         vector<float> result(nclass);</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>         result=net[ibag].run(validationFeature);</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span> </div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<result.size();++iclass)</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>         std::cout << result[iclass] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>           std::cout << std::endl;</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>         }</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>         <span class="comment">//calculate posterior prob of bag </span></div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>           result[iclass]=(result[iclass]+1.0)/2.0;<span class="comment">//bring back to scale [0,1]</span></div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>           <span class="keywordflow">switch</span>(comb_opt[0]){</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>           <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>         probOut[iclass]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>           <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         probOut[iclass]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>           <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>         <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass])</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>           probOut[iclass]=priors[iclass]*result[iclass];</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>           }</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>         }</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>       }<span class="comment">//for ibag</span></div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>       <span class="comment">//search for max class prob</span></div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>       <span class="keywordtype">float</span> maxBag=0;</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>       <span class="keywordtype">float</span> normBag=0;</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>       <span class="keywordtype">string</span> classOut=<span class="stringliteral">"Unclassified"</span>;</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>           std::cout << probOut[iclass] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>         <span class="keywordflow">if</span>(probOut[iclass]>maxBag){</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>           maxBag=probOut[iclass];</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>           classOut=nameVector[iclass];</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>         }</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>       }</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>       <span class="comment">//look for class name</span></div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>           std::cout << <span class="stringliteral">"->"</span> << classValueMap[classOut] << std::endl;</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>         <span class="keywordflow">else</span>        </div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>           std::cout << <span class="stringliteral">"->"</span> << classOut << std::endl;</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>       }</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classValueMap[classOut]);</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>         <span class="keywordflow">else</span>        </div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classOut.c_str());</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>         poDstFeature->SetFID( poFeature->GetFID() );</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>       }</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>       <span class="keywordtype">int</span> labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>       <span class="keywordflow">if</span>(labelIndex>=0){</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>         <span class="keywordtype">string</span> classRef=poFeature->GetFieldAsString(labelIndex);</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>         <span class="keywordflow">if</span>(classRef!=<span class="stringliteral">"0"</span>){</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>           <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>         cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);</div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>         cm.incrementResult(classRef,classOut,1);</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>         }</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>       }</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>       CPLErrorReset();</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>         <span class="keywordflow">if</span>(imgWriterOgr.createFeature(poDstFeature,ilayer) != OGRERR_NONE){</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>         }</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>       }</div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>       ++ifeature;</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1.0)/nFeatures;</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>       }</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>       OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>       OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>     }<span class="comment">//get next feature</span></div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>       }<span class="comment">//next layer</span></div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>       imgReaderOgr.close();</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>       imgWriterOgr.close();</div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>     }</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>     <span class="keywordflow">if</span>(cm.nReference()){</div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>       std::cout << cm << std::endl;</div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>       <span class="comment">// cout << "class #samples userAcc prodAcc" << endl;</span></div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>       <span class="comment">// double se95_ua=0;</span></div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>       <span class="comment">// double se95_pa=0;</span></div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>       <span class="comment">// double se95_oa=0;</span></div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>       <span class="comment">// double dua=0;</span></div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>       <span class="comment">// double dpa=0;</span></div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>       <span class="comment">// double doa=0;</span></div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>       <span class="comment">// for(short iclass=0;iclass<cm.nClasses();++iclass){</span></div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>       <span class="comment">//    dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</span></div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>       <span class="comment">//    dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</span></div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>       <span class="comment">//    cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;</span></div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>       <span class="comment">// std::cout << "Kappa: " << cm.kappa() << std::endl;</span></div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>       <span class="comment">// doa=cm.oa_pct(&se95_oa);</span></div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>       <span class="comment">// std::cout << "Overall Accuracy: " << doa << " (" << se95_oa << ")"  << std::endl;</span></div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>     }</div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>   }</div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>     <span class="keywordflow">if</span>(active_opt.size())</div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>       activeWriter.close();</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>   }</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>     std::cerr << <span class="stringliteral">"Error: errorString"</span> << std::endl;</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>   }</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>   <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span> }</div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classDecrease__PosValue_html"><div class="ttname"><a href="classDecrease__PosValue.html">Decrease_PosValue</a></div><div class="ttdef"><b>Definition:</b> <a href="PosValue_8h_source.html#l00034">PosValue.h:34</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
@@ -1343,7 +1345,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkascii2img.html b/doc/html/pkascii2img.html
index d3435be..bcf43d8 100644
--- a/doc/html/pkascii2img.html
+++ b/doc/html/pkascii2img.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -92,7 +92,7 @@ Usage: pkascii2img -i input.txt -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkascii2img_8cc_source.html b/doc/html/pkascii2img_8cc_source.html
index 2013918..e09eb69 100644
--- a/doc/html/pkascii2img_8cc_source.html
+++ b/doc/html/pkascii2img_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -222,13 +222,13 @@
 <div class="line"><a name="l00213"></a><span class="lineno">  213</span>   imgWriter.close();</div>
 <div class="line"><a name="l00214"></a><span class="lineno">  214</span> }</div>
 <div class="line"><a name="l00215"></a><span class="lineno">  215</span> </div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkascii2ogr.html b/doc/html/pkascii2ogr.html
index 5c970cf..52eb38d 100644
--- a/doc/html/pkascii2ogr.html
+++ b/doc/html/pkascii2ogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -90,7 +90,7 @@ Usage: pkascii2ogr -i input.txt -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkascii2ogr_8cc_source.html b/doc/html/pkascii2ogr_8cc_source.html
index 99fa631..61c2c7d 100644
--- a/doc/html/pkascii2ogr_8cc_source.html
+++ b/doc/html/pkascii2ogr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -175,7 +175,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite.html b/doc/html/pkcomposite.html
index 3550f88..d56601b 100644
--- a/doc/html/pkcomposite.html
+++ b/doc/html/pkcomposite.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -48,7 +48,7 @@
 <p><code> Usage: pkcomposite -i input [-i input]* -o output </code></p>
 <p><code></code></p>
 <p><code> Options: [-b band]* [-dx xres] [-dy yres] [-e vector] [-ulx ULX -uly ULY -lrx LRX -lry LRY] [-cr rule] [-cb band] [-srcnodata value] [-bndnodata band] [-min value] [-max value] [-dstnodata value] [-r resampling_method] [-ot {Byte / Int16 / UInt16 / UInt32 / Int32 / Float32 / Float64 / CInt16 / CInt32 / CFloat32 / CFloat64}] [-of format] [-co NAME=VALUE]* [-a_srs epsg:number]</code></p>
-<p><code> Advanced options: [-file] [-w weight]* [-c class]* [-ct colortable] [-d description] </code></p>
+<p><code> Advanced options: [-file] [-w weight]* [-c class]* [-ct colortable] [-d description] [-align] </code></p>
 <h1><a class="anchor" id="pkcomposite_description"></a>
 Description</h1>
 <p>The utility pkcomposite can be used to <em>mosaic</em> and <em>composite</em> multiple (georeferenced) raster datasets. A mosaic can merge images with different geographical extents into a single larger image. Compositing resolves the overlapping pixels according to some rule (e.g, the median of all overlapping pixels). This utility is complementary to GDAL, which currently does not support a composite step. Input datasets can have different bounding boxes and spatial resolutionsresol [...]
@@ -83,7 +83,7 @@ Description</h1>
 <div class="fragment"><div class="line">pkcomposite -i input1.tif -i input2.tif -o output.tif -cr maxndvi -cb 0 -cb 1</div>
 </div><!-- fragment --><p>Example: Calculate the minimum nadir composite of two input images, where the forth band (b=3) contains the view zenith angle</p>
 <div class="fragment"><div class="line">pkcomposite -i input1.tif -i input2.tif -o minzenith.tif -cr minband -cb 3</div>
-</div><!-- fragment --><p>Example: Calculate the minimum of two input images</p>
+</div><!-- fragment --><p>Example: Calculate the minimum of two input images in all bands</p>
 <div class="fragment"><div class="line">pkcomposite -i input1.tif -i input2.tif -o minimum.tif -cr minallbands</div>
 </div><!-- fragment --><h1><a class="anchor" id="pkcomposite_options"></a>
 Options</h1>
@@ -141,7 +141,7 @@ Options</h1>
 <tr>
 <td>ot </td><td>otype </td><td>std::string </td><td></td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td></td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). </td></tr>
 <tr>
 <td>co </td><td>co </td><td>std::string </td><td></td><td>Creation option for output file. Multiple options can be specified. </td></tr>
 <tr>
@@ -155,6 +155,8 @@ Options</h1>
 <tr>
 <td>ct </td><td>ct </td><td>std::string </td><td></td><td>color table file with 5 columns: id R G B ALFA (0: transparent, 255: solid) </td></tr>
 <tr>
+<td>align </td><td>align </td><td>bool </td><td></td><td>Align output bounding box to first input image </td></tr>
+<tr>
 <td>d </td><td>description </td><td>std::string </td><td></td><td>Set image description </td></tr>
 </table>
 <h1>Examples </h1>
@@ -165,7 +167,7 @@ Options</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite_8cc_source.html b/doc/html/pkcomposite_8cc_source.html
index ddea49e..f844591 100644
--- a/doc/html/pkcomposite_8cc_source.html
+++ b/doc/html/pkcomposite_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -83,1153 +83,1173 @@
 <div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="preprocessor">#include "algorithms/StatFactory.h"</span></div>
 <div class="line"><a name="l00030"></a><span class="lineno">   30</span> </div>
 <div class="line"><a name="l00031"></a><span class="lineno">   31</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span> <span class="keyword">namespace </span>crule{</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <span class="keyword">enum</span> CRULE_TYPE {overwrite=0, maxndvi=1, maxband=2, minband=3, validband=4, mean=5, mode=6, median=7,sum=8,minallbands=9,maxallbands=10,stdev=11};</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span> }</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span> </div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span> </div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span> {</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input image file(s). If input contains multiple images, a multi-band output is created"</span>);</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a>  band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index(es) to crop (leave empty if all bands must be retained)"</span>);</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dx_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"Output resolution in x (in meter) (empty: keep original resolution)"</span>);</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dy_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"Output resolution in y (in meter) (empty: keep original resolution)"</span>);</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  extent_opt(<span class="stringliteral">"e"</span>, <span class="stringliteral">"extent"</span>, <span class="stringliteral">"get boundary from extent from polygons in vector file"</span>);</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> cut_opt(<span class="stringliteral">"cut"</span>, <span class="stringliteral">"crop_to_cutline"</span>, <span class="stringliteral">"Crop the extent of the target dataset to the extent of the cutline."</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Use the first band of the specified file as a validity mask (0 is nodata)."</span>);</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value not to consider for composite."</span>, 0);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> mskband_opt(<span class="stringliteral">"mskband"</span>, <span class="stringliteral">"mskband"</span>, <span class="stringliteral">"Mask band to read (0 indexed). Provide band for each mask."</span>, 0);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  ulx_opt(<span class="stringliteral">"ulx"</span>, <span class="stringliteral">"ulx"</span>, <span class="stringliteral">"Upper left x value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  uly_opt(<span class="stringliteral">"uly"</span>, <span class="stringliteral">"uly"</span>, <span class="stringliteral">"Upper left y value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lrx_opt(<span class="stringliteral">"lrx"</span>, <span class="stringliteral">"lrx"</span>, <span class="stringliteral">"Lower right x value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lry_opt(<span class="stringliteral">"lry"</span>, <span class="stringliteral">"lry"</span>, <span class="stringliteral">"Lower right y value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> crule_opt(<span class="stringliteral">"cr"</span>, <span class="stringliteral">"crule"</span>, <span class="stringliteral">"Composite rule (overwrite, maxndvi, maxband, minband, mean, mode (only for byte images), median, sum, maxallbands, minallbands, stdev"</span>, <span class="stringliteral">"overwrite&qu [...]
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> ruleBand_opt(<span class="stringliteral">"cb"</span>, <span class="stringliteral">"cband"</span>, <span class="stringliteral">"band index used for the composite rule (e.g., for ndvi, use --cband=0 --cband=1 with 0 and 1 indices for red and nir band respectively"</span>, 0);</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> srcnodata_opt(<span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"invalid value(s) for input raster dataset"</span>);</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> bndnodata_opt(<span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (used for srcnodata, min and max options)"</span>, 0);</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> minValue_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"flag values smaller or equal to this value as invalid."</span>);</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> maxValue_opt(<span class="stringliteral">"max"</span>, <span class="stringliteral">"max"</span>, <span class="stringliteral">"flag values larger or equal to this value as invalid."</span>);</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dstnodata_opt(<span class="stringliteral">"dstnodata"</span>, <span class="stringliteral">"dstnodata"</span>, <span class="stringliteral">"nodata value to put in output raster dataset if not valid or out of bounds."</span>, 0);</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  resample_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"resampling-method"</span>, <span class="stringliteral">"Resampling method (near: nearest neighbor, bilinear: bi-linear interpolation)."</span>, <span class="stringliteral">"near"</span>);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringliter [...]
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"Override the spatial reference for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid"</span>);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> file_opt(<span class="stringliteral">"file"</span>, <span class="stringliteral">"file"</span>, <span class="stringliteral">"write number of observations (1) or sequence nr of selected file (2) for each pixels as additional layer in composite"</span>, 0);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> weight_opt(<span class="stringliteral">"w"</span>, <span class="stringliteral">"weight"</span>, <span class="stringliteral">"Weights (type: short) for the composite, use one weight for each input file in same order as input files are provided). Use value 1 for equal weights."</span>, 1);</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> class_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"classes for multi-band output image: each band represents the number of observations for one specific class. Use value 0 for no multi-band output image."</span>, 0);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  description_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"description"</span>, <span class="stringliteral">"Set image description"</span>);</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a>  verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0,2);</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span> </div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   extent_opt.setHide(1);</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   cut_opt.setHide(1);</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   mask_opt.setHide(1);</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   msknodata_opt.setHide(1);</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   mskband_opt.setHide(1);</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   option_opt.setHide(1);</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   file_opt.setHide(1);</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   weight_opt.setHide(1);</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   class_opt.setHide(1);</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   colorTable_opt.setHide(1);</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   description_opt.setHide(1);</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span> </div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     dx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     dy_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     extent_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     cut_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     mask_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     msknodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     mskband_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     ulx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     uly_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     lrx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     lry_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     crule_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     ruleBand_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     srcnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     bndnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     minValue_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     maxValue_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     dstnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     resample_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     otype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     projection_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     file_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     weight_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     class_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     description_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   }</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     exit(0);</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   }</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     cout << endl;</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     cout << <span class="stringliteral">"Usage: pkcomposite -i input [-i input]* -o output"</span> << endl;</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     cout << endl;</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   }</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span> </div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   std::map<std::string, crule::CRULE_TYPE> cruleMap;</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="comment">// //initialize cruleMap</span></div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="comment">// enum CRULE_TYPE {overwrite=0, maxndvi=1, maxband=2, minband=3, validband=4, mean=5, mode=6, median=7,sum=8};</span></div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span> </div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   cruleMap[<span class="stringliteral">"overwrite"</span>]=crule::overwrite;</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   cruleMap[<span class="stringliteral">"maxndvi"</span>]=crule::maxndvi;</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   cruleMap[<span class="stringliteral">"maxband"</span>]=crule::maxband;</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   cruleMap[<span class="stringliteral">"minband"</span>]=crule::minband;</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   cruleMap[<span class="stringliteral">"validband"</span>]=crule::validband;</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   cruleMap[<span class="stringliteral">"mean"</span>]=crule::mean;</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   cruleMap[<span class="stringliteral">"mode"</span>]=crule::mode;</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   cruleMap[<span class="stringliteral">"median"</span>]=crule::median;</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   cruleMap[<span class="stringliteral">"sum"</span>]=crule::sum;</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   cruleMap[<span class="stringliteral">"maxallbands"</span>]=crule::maxallbands;</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   cruleMap[<span class="stringliteral">"minallbands"</span>]=crule::minallbands;</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   cruleMap[<span class="stringliteral">"stdev"</span>]=crule::stdev;</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span> </div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     <span class="keywordflow">while</span>(srcnodata_opt.size()<bndnodata_opt.size())</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       srcnodata_opt.push_back(srcnodata_opt[0]);</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   }</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <span class="keywordflow">while</span>(bndnodata_opt.size()<srcnodata_opt.size())</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     bndnodata_opt.push_back(bndnodata_opt[0]);</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="keywordflow">if</span>(minValue_opt.size()){</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     <span class="keywordflow">while</span>(minValue_opt.size()<bndnodata_opt.size())</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       minValue_opt.push_back(minValue_opt[0]);</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     <span class="keywordflow">while</span>(bndnodata_opt.size()<minValue_opt.size())</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>       bndnodata_opt.push_back(bndnodata_opt[0]);</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   }</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="keywordflow">if</span>(maxValue_opt.size()){</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="keywordflow">while</span>(maxValue_opt.size()<bndnodata_opt.size())</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>       maxValue_opt.push_back(maxValue_opt[0]);</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     <span class="keywordflow">while</span>(bndnodata_opt.size()<maxValue_opt.size())</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>       bndnodata_opt.push_back(bndnodata_opt[0]);</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   }</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   RESAMPLE theResample;</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"near"</span>){</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     theResample=NEAR;</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       cout << <span class="stringliteral">"resampling: nearest neighbor"</span> << endl;</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   }</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"bilinear"</span>){</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     theResample=BILINEAR;</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>       cout << <span class="stringliteral">"resampling: bilinear interpolation"</span> << endl;</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   }</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     std::cout << <span class="stringliteral">"Error: resampling method "</span> << resample_opt[0] << <span class="stringliteral">" not supported"</span> << std::endl;</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     exit(1);</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   }</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   </div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     exit(0);</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   }</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="keywordtype">int</span> nwriteBand=0;</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   <span class="keywordtype">int</span> writeBand=0;</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   vector<short> bands;</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   </div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="comment">//get bounding box</span></div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="keywordtype">double</span> maxLRX=0;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="keywordtype">double</span> maxULY=0;</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="keywordtype">double</span> minULX=0;</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordtype">double</span> minLRY=0;</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keywordtype">double</span> magic_x=1,magic_y=1;<span class="comment">//magic pixel for GDAL map info</span></div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span> </div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   GDALDataType theType=GDT_Unknown;</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>                  otype_opt[0].c_str()))</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       theType=(GDALDataType) iType;</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   }</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     cout << endl;</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       cout << <span class="stringliteral">"Unknown output pixel type: "</span> << otype_opt[0] << endl;</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       cout << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   }</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span> </div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="keywordtype">double</span> dx=0;</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordtype">double</span> dy=0;</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="comment">//get bounding box from extentReader if defined</span></div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   <span class="keywordflow">if</span>(extent_opt.size()){</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordtype">double</span> e_ulx;</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordtype">double</span> e_uly;</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="keywordtype">double</span> e_lrx;</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordtype">double</span> e_lry;</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iextent=0;iextent<extent_opt.size();++iextent){</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       extentReader.open(extent_opt[iextent]);</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(e_ulx,e_uly,e_lrx,e_lry))){</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>         cerr << <span class="stringliteral">"Error: could not get extent from "</span> << extent_opt[0] << endl;</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>         exit(1);</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       }</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       <span class="keywordflow">if</span>(!iextent){</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     ulx_opt[0]=e_ulx;</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     uly_opt[0]=e_uly;</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     lrx_opt[0]=e_lrx;</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     lry_opt[0]=e_lry;</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       }</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     <span class="keywordflow">if</span>(e_ulx<ulx_opt[0])</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       ulx_opt[0]=e_ulx;</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     <span class="keywordflow">if</span>(e_uly>uly_opt[0])</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       uly_opt[0]=e_uly;</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     <span class="keywordflow">if</span>(e_lrx>lrx_opt[0])</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       lrx_opt[0]=e_lrx;</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     <span class="keywordflow">if</span>(e_lry<lry_opt[0])</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       lry_opt[0]=e_lry;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       }</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       extentReader.close();</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     }</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     <span class="keywordflow">if</span>(cut_opt.size())</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       extentReader.open(extent_opt[0]);</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   }</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span> </div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     cout << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span> <span class="keyword">namespace </span>crule{</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <span class="keyword">enum</span> CRULE_TYPE {overwrite=0, maxndvi=1, maxband=2, minband=3, validband=4, mean=5, mode=6, median=7,sum=8,minallbands=9,maxallbands=10,stdev=11};</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span> }</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span> </div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span> </div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span> {</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input image file(s). If input contains multiple images, a multi-band output is created"</span>);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a>  band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index(es) to crop (leave empty if all bands must be retained)"</span>);</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dx_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"Output resolution in x (in meter) (empty: keep original resolution)"</span>);</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dy_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"Output resolution in y (in meter) (empty: keep original resolution)"</span>);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  extent_opt(<span class="stringliteral">"e"</span>, <span class="stringliteral">"extent"</span>, <span class="stringliteral">"get boundary from extent from polygons in vector file"</span>);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> cut_opt(<span class="stringliteral">"cut"</span>, <span class="stringliteral">"crop_to_cutline"</span>, <span class="stringliteral">"Crop the extent of the target dataset to the extent of the cutline."</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Use the first band of the specified file as a validity mask (0 is nodata)."</span>);</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value not to consider for composite."</span>, 0);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> mskband_opt(<span class="stringliteral">"mskband"</span>, <span class="stringliteral">"mskband"</span>, <span class="stringliteral">"Mask band to read (0 indexed). Provide band for each mask."</span>, 0);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  ulx_opt(<span class="stringliteral">"ulx"</span>, <span class="stringliteral">"ulx"</span>, <span class="stringliteral">"Upper left x value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  uly_opt(<span class="stringliteral">"uly"</span>, <span class="stringliteral">"uly"</span>, <span class="stringliteral">"Upper left y value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lrx_opt(<span class="stringliteral">"lrx"</span>, <span class="stringliteral">"lrx"</span>, <span class="stringliteral">"Lower right x value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lry_opt(<span class="stringliteral">"lry"</span>, <span class="stringliteral">"lry"</span>, <span class="stringliteral">"Lower right y value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> crule_opt(<span class="stringliteral">"cr"</span>, <span class="stringliteral">"crule"</span>, <span class="stringliteral">"Composite rule (overwrite, maxndvi, maxband, minband, mean, mode (only for byte images), median, sum, maxallbands, minallbands, stdev"</span>, <span class="stringliteral">"overwrite&qu [...]
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> ruleBand_opt(<span class="stringliteral">"cb"</span>, <span class="stringliteral">"cband"</span>, <span class="stringliteral">"band index used for the composite rule (e.g., for ndvi, use --cband=0 --cband=1 with 0 and 1 indices for red and nir band respectively"</span>, 0);</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> srcnodata_opt(<span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"invalid value(s) for input raster dataset"</span>);</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> bndnodata_opt(<span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (used for srcnodata, min and max options)"</span>, 0);</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> minValue_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"flag values smaller or equal to this value as invalid."</span>);</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> maxValue_opt(<span class="stringliteral">"max"</span>, <span class="stringliteral">"max"</span>, <span class="stringliteral">"flag values larger or equal to this value as invalid."</span>);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dstnodata_opt(<span class="stringliteral">"dstnodata"</span>, <span class="stringliteral">"dstnodata"</span>, <span class="stringliteral">"nodata value to put in output raster dataset if not valid or out of bounds."</span>, 0);</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  resample_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"resampling-method"</span>, <span class="stringliteral">"Resampling method (near: nearest neighbor, bilinear: bi-linear interpolation)."</span>, <span class="stringliteral">"near"</span>);</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringliter [...]
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>,<span class="stringliteral">"GTiff"</span>);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"Override the spatial reference for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid"</span>);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> file_opt(<span class="stringliteral">"file"</span>, <span class="stringliteral">"file"</span>, <span class="stringliteral">"write number of observations (1) or sequence nr of selected file (2) for each pixels as additional layer in composite"</span>, 0);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> weight_opt(<span class="stringliteral">"w"</span>, <span class="stringliteral">"weight"</span>, <span class="stringliteral">"Weights (type: short) for the composite, use one weight for each input file in same order as input files are provided). Use value 1 for equal weights."</span>, 1);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> class_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"classes for multi-band output image: each band represents the number of observations for one specific class. Use value 0 for no multi-band output image."</span>, 0);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  description_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"description"</span>, <span class="stringliteral">"Set image description"</span>);</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a>  align_opt(<span class="stringliteral">"align"</span>, <span class="stringliteral">"align"</span>, <span class="stringliteral">"Align output bounding box to input image"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a>  verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0,2);</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span> </div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   extent_opt.setHide(1);</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   cut_opt.setHide(1);</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   mask_opt.setHide(1);</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   msknodata_opt.setHide(1);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   mskband_opt.setHide(1);</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   file_opt.setHide(1);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   weight_opt.setHide(1);</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   class_opt.setHide(1);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   colorTable_opt.setHide(1);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   description_opt.setHide(1);</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span> </div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     dx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     dy_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     extent_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     cut_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     mask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     msknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     mskband_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     ulx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     uly_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     lrx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     lry_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     crule_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     ruleBand_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     srcnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     bndnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     minValue_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     maxValue_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     dstnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     resample_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     projection_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     file_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     weight_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     class_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     description_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     align_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   }</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     exit(0);</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   }</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     cout << endl;</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     cout << <span class="stringliteral">"Usage: pkcomposite -i input [-i input]* -o output"</span> << endl;</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     cout << endl;</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   }</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span> </div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   std::map<std::string, crule::CRULE_TYPE> cruleMap;</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <span class="comment">// //initialize cruleMap</span></div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="comment">// enum CRULE_TYPE {overwrite=0, maxndvi=1, maxband=2, minband=3, validband=4, mean=5, mode=6, median=7,sum=8};</span></div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span> </div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   cruleMap[<span class="stringliteral">"overwrite"</span>]=crule::overwrite;</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   cruleMap[<span class="stringliteral">"maxndvi"</span>]=crule::maxndvi;</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   cruleMap[<span class="stringliteral">"maxband"</span>]=crule::maxband;</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   cruleMap[<span class="stringliteral">"minband"</span>]=crule::minband;</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   cruleMap[<span class="stringliteral">"validband"</span>]=crule::validband;</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   cruleMap[<span class="stringliteral">"mean"</span>]=crule::mean;</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   cruleMap[<span class="stringliteral">"mode"</span>]=crule::mode;</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   cruleMap[<span class="stringliteral">"median"</span>]=crule::median;</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   cruleMap[<span class="stringliteral">"sum"</span>]=crule::sum;</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   cruleMap[<span class="stringliteral">"maxallbands"</span>]=crule::maxallbands;</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   cruleMap[<span class="stringliteral">"minallbands"</span>]=crule::minallbands;</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   cruleMap[<span class="stringliteral">"stdev"</span>]=crule::stdev;</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span> </div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     <span class="keywordflow">while</span>(srcnodata_opt.size()<bndnodata_opt.size())</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>       srcnodata_opt.push_back(srcnodata_opt[0]);</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   }</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordflow">while</span>(bndnodata_opt.size()<srcnodata_opt.size())</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     bndnodata_opt.push_back(bndnodata_opt[0]);</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordflow">if</span>(minValue_opt.size()){</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     <span class="keywordflow">while</span>(minValue_opt.size()<bndnodata_opt.size())</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>       minValue_opt.push_back(minValue_opt[0]);</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     <span class="keywordflow">while</span>(bndnodata_opt.size()<minValue_opt.size())</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>       bndnodata_opt.push_back(bndnodata_opt[0]);</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   }</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordflow">if</span>(maxValue_opt.size()){</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     <span class="keywordflow">while</span>(maxValue_opt.size()<bndnodata_opt.size())</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>       maxValue_opt.push_back(maxValue_opt[0]);</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     <span class="keywordflow">while</span>(bndnodata_opt.size()<maxValue_opt.size())</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>       bndnodata_opt.push_back(bndnodata_opt[0]);</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   }</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   RESAMPLE theResample;</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"near"</span>){</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>     theResample=NEAR;</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       cout << <span class="stringliteral">"resampling: nearest neighbor"</span> << endl;</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   }</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"bilinear"</span>){</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     theResample=BILINEAR;</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>       cout << <span class="stringliteral">"resampling: bilinear interpolation"</span> << endl;</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   }</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     std::cout << <span class="stringliteral">"Error: resampling method "</span> << resample_opt[0] << <span class="stringliteral">" not supported"</span> << std::endl;</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     exit(1);</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   }</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   </div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     exit(0);</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   }</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="keywordtype">int</span> nwriteBand=0;</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="keywordtype">int</span> writeBand=0;</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   vector<short> bands;</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   </div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="comment">//get bounding box</span></div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordtype">double</span> maxLRX=0;</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keywordtype">double</span> maxULY=0;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordtype">double</span> minULX=0;</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keywordtype">double</span> minLRY=0;</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordtype">double</span> magic_x=1,magic_y=1;<span class="comment">//magic pixel for GDAL map info</span></div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span> </div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   GDALDataType theType=GDT_Unknown;</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>                  otype_opt[0].c_str()))</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       theType=(GDALDataType) iType;</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   }</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     cout << endl;</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>       cout << <span class="stringliteral">"Unknown output pixel type: "</span> << otype_opt[0] << endl;</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       cout << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   }</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span> </div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <span class="keywordtype">double</span> dx=0;</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   <span class="keywordtype">double</span> dy=0;</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>   <span class="comment">//get bounding box from extentReader if defined</span></div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>   <span class="keywordflow">if</span>(extent_opt.size()){</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordtype">double</span> e_ulx;</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     <span class="keywordtype">double</span> e_uly;</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     <span class="keywordtype">double</span> e_lrx;</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="keywordtype">double</span> e_lry;</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iextent=0;iextent<extent_opt.size();++iextent){</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>       extentReader.open(extent_opt[iextent]);</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(e_ulx,e_uly,e_lrx,e_lry))){</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>         cerr << <span class="stringliteral">"Error: could not get extent from "</span> << extent_opt[0] << endl;</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>         exit(1);</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>       }</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>       <span class="keywordflow">if</span>(!iextent){</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     ulx_opt[0]=e_ulx;</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     uly_opt[0]=e_uly;</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     lrx_opt[0]=e_lrx;</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     lry_opt[0]=e_lry;</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       }</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     <span class="keywordflow">if</span>(e_ulx<ulx_opt[0])</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       ulx_opt[0]=e_ulx;</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     <span class="keywordflow">if</span>(e_uly>uly_opt[0])</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       uly_opt[0]=e_uly;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     <span class="keywordflow">if</span>(e_lrx>lrx_opt[0])</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       lrx_opt[0]=e_lrx;</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     <span class="keywordflow">if</span>(e_lry<lry_opt[0])</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       lry_opt[0]=e_lry;</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       }</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       extentReader.close();</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>     }</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     <span class="keywordflow">if</span>(cut_opt.size())</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>       extentReader.open(extent_opt[0]);</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   }</div>
 <div class="line"><a name="l00359"></a><span class="lineno">  359</span> </div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   vector<ImgReaderGdal> imgReader(input_opt.size());</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   <span class="keywordtype">string</span> theProjection=<span class="stringliteral">""</span>;</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>   GDALColorTable* theColorTable=NULL;</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   <span class="keywordtype">string</span> imageType;</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   <span class="keywordtype">bool</span> init=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       imgReader[ifile].open(input_opt[ifile]);</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     }</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       cerr << errorstring << <span class="stringliteral">" "</span> << input_opt[ifile] << endl;</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     cout << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span> </div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   vector<ImgReaderGdal> imgReader(input_opt.size());</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   <span class="keywordtype">string</span> theProjection=<span class="stringliteral">""</span>;</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   GDALColorTable* theColorTable=NULL;</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   <span class="keywordtype">string</span> imageType;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>   <span class="keywordtype">bool</span> init=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       imgReader[ifile].open(input_opt[ifile]);</div>
 <div class="line"><a name="l00371"></a><span class="lineno">  371</span>     }</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span> </div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="comment">//todo: must be in init part only?</span></div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     <span class="keywordflow">if</span>(colorTable_opt.empty())</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       <span class="keywordflow">if</span>(imgReader[ifile].getColorTable())</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     theColorTable=(imgReader[ifile].getColorTable()->Clone());</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     <span class="keywordflow">if</span>(projection_opt.empty())</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       theProjection=imgReader[ifile].getProjection();</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       theInterleave+=imgReader[ifile].getInterleave();</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     }</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span> </div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     <span class="keywordflow">if</span>((ulx_opt[0]||uly_opt[0]||lrx_opt[0]||lry_opt[0])&&(!imgReader[ifile].covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     cout << input_opt[ifile] << <span class="stringliteral">" not within bounding box, skipping..."</span> << endl;</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       <span class="comment">// imgReader.close();</span></div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     }</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="keywordtype">double</span> theULX, theULY, theLRX, theLRY;</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     imgReader[ifile].getBoundingBox(theULX,theULY,theLRX,theLRY);</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     <span class="keywordflow">if</span>(theLRY>theULY){</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       cerr << <span class="stringliteral">"Error: "</span> << input_opt[ifile] << <span class="stringliteral">" is not georeferenced, only referenced images are supported for pkcomposite "</span> << endl;</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       exit(1);</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     }</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       cout << <span class="stringliteral">"Bounding Box (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << theULX << <span class="stringliteral">" "</span> << theULY << <span class="stringliteral">" "</span> << theLRX << <span class="stringliteral">" "</span> << theLRY << endl;</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     <span class="keywordflow">if</span>(!init){</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>         <span class="keywordflow">case</span>(crule::overwrite):</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>           cout << <span class="stringliteral">"Composite rule: overwrite"</span> << endl;</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>         <span class="keywordflow">case</span>(crule::maxndvi):</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>           cout << <span class="stringliteral">"Composite rule: max ndvi"</span> << endl;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       cerr << errorstring << <span class="stringliteral">" "</span> << input_opt[ifile] << endl;</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     }</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span> </div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="comment">//todo: must be in init part only?</span></div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     <span class="keywordflow">if</span>(colorTable_opt.empty())</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="keywordflow">if</span>(imgReader[ifile].getColorTable())</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     theColorTable=(imgReader[ifile].getColorTable()->Clone());</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="keywordflow">if</span>(projection_opt.empty())</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       theProjection=imgReader[ifile].getProjection();</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       theInterleave+=imgReader[ifile].getInterleave();</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     }</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span> </div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     <span class="keywordflow">if</span>((ulx_opt[0]||uly_opt[0]||lrx_opt[0]||lry_opt[0])&&(!imgReader[ifile].covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     cout << input_opt[ifile] << <span class="stringliteral">" not within bounding box, skipping..."</span> << endl;</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       <span class="comment">// imgReader.close();</span></div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     }</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordtype">double</span> theULX, theULY, theLRX, theLRY;</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     imgReader[ifile].getBoundingBox(theULX,theULY,theLRX,theLRY);</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">if</span>(theLRY>theULY){</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       cerr << <span class="stringliteral">"Error: "</span> << input_opt[ifile] << <span class="stringliteral">" is not georeferenced, only referenced images are supported for pkcomposite "</span> << endl;</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       exit(1);</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     }</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       cout << <span class="stringliteral">"Bounding Box (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << theULX << <span class="stringliteral">" "</span> << theULY << <span class="stringliteral">" "</span> << theLRX << <span class="stringliteral">" "</span> << theLRY << endl;</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     <span class="keywordflow">if</span>(!init){</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>         <span class="keywordflow">case</span>(crule::overwrite):</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>           cout << <span class="stringliteral">"Composite rule: overwrite"</span> << endl;</div>
 <div class="line"><a name="l00408"></a><span class="lineno">  408</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>         <span class="keywordflow">case</span>(crule::maxband):</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>           cout << <span class="stringliteral">"Composite rule: max band"</span> << endl;</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>         <span class="keywordflow">case</span>(crule::maxndvi):</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>           cout << <span class="stringliteral">"Composite rule: max ndvi"</span> << endl;</div>
 <div class="line"><a name="l00411"></a><span class="lineno">  411</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>         <span class="keywordflow">case</span>(crule::minband):</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>           cout << <span class="stringliteral">"Composite rule: min band"</span> << endl;</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>         <span class="keywordflow">case</span>(crule::maxband):</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>           cout << <span class="stringliteral">"Composite rule: max band"</span> << endl;</div>
 <div class="line"><a name="l00414"></a><span class="lineno">  414</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>         <span class="keywordflow">case</span>(crule::validband):</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>           cout << <span class="stringliteral">"Composite rule: valid band"</span> << endl;</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>         <span class="keywordflow">case</span>(crule::minband):</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>           cout << <span class="stringliteral">"Composite rule: min band"</span> << endl;</div>
 <div class="line"><a name="l00417"></a><span class="lineno">  417</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>         <span class="keywordflow">case</span>(crule::mean):</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>           cout << <span class="stringliteral">"Composite rule: mean value"</span> << endl;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>         <span class="keywordflow">case</span>(crule::validband):</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>           cout << <span class="stringliteral">"Composite rule: valid band"</span> << endl;</div>
 <div class="line"><a name="l00420"></a><span class="lineno">  420</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         <span class="keywordflow">case</span>(crule::mode):</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           cout << <span class="stringliteral">"Composite rule: max voting (only for byte images)"</span> << endl;</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         <span class="keywordflow">case</span>(crule::mean):</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           cout << <span class="stringliteral">"Composite rule: mean value"</span> << endl;</div>
 <div class="line"><a name="l00423"></a><span class="lineno">  423</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>         <span class="keywordflow">case</span>(crule::median):</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>           cout << <span class="stringliteral">"Composite rule: median"</span> << endl;</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>         <span class="keywordflow">case</span>(crule::mode):</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>           cout << <span class="stringliteral">"Composite rule: max voting (only for byte images)"</span> << endl;</div>
 <div class="line"><a name="l00426"></a><span class="lineno">  426</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         <span class="keywordflow">case</span>(crule::stdev):</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>           cout << <span class="stringliteral">"Composite rule: stdev"</span> << endl;</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         <span class="keywordflow">case</span>(crule::median):</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>           cout << <span class="stringliteral">"Composite rule: median"</span> << endl;</div>
 <div class="line"><a name="l00429"></a><span class="lineno">  429</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>         <span class="keywordflow">case</span>(crule::sum):</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>           cout << <span class="stringliteral">"Composite rule: sum"</span> << endl;</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>         <span class="keywordflow">case</span>(crule::stdev):</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>           cout << <span class="stringliteral">"Composite rule: stdev"</span> << endl;</div>
 <div class="line"><a name="l00432"></a><span class="lineno">  432</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>         <span class="keywordflow">case</span>(crule::minallbands):</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           cout << <span class="stringliteral">"Composite rule: minallbands"</span> << endl;</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>         <span class="keywordflow">case</span>(crule::sum):</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           cout << <span class="stringliteral">"Composite rule: sum"</span> << endl;</div>
 <div class="line"><a name="l00435"></a><span class="lineno">  435</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>         <span class="keywordflow">case</span>(crule::maxallbands):</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>           cout << <span class="stringliteral">"Composite rule: maxallbands"</span> << endl;</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>         <span class="keywordflow">case</span>(crule::minallbands):</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>           cout << <span class="stringliteral">"Composite rule: minallbands"</span> << endl;</div>
 <div class="line"><a name="l00438"></a><span class="lineno">  438</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>         }</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       }</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       <span class="keywordflow">if</span>(band_opt.size()){</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     nband=band_opt.size();</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         bands.resize(band_opt.size());</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>           bands[iband]=band_opt[iband];</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>           assert(bands[iband]<imgReader[ifile].nrOfBand());</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         }</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       }</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>     nband=imgReader[ifile].nrOfBand();</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         bands.resize(nband);</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>           bands[iband]=iband;</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       }</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<bndnodata_opt.size();++iband){</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         assert(bndnodata_opt[iband]>=0&&bndnodata_opt[iband]<nband);</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>         <span class="keywordflow">case</span>(crule::maxallbands):</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>           cout << <span class="stringliteral">"Composite rule: maxallbands"</span> << endl;</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         }</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       }</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       <span class="keywordflow">if</span>(band_opt.size()){</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>     nband=band_opt.size();</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>         bands.resize(band_opt.size());</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>           bands[iband]=band_opt[iband];</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>           assert(bands[iband]<imgReader[ifile].nrOfBand());</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>         }</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       }</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     nband=imgReader[ifile].nrOfBand();</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>         bands.resize(nband);</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>           bands[iband]=iband;</div>
 <div class="line"><a name="l00457"></a><span class="lineno">  457</span>       }</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       <span class="comment">//if output type not set, get type from input image</span></div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       <span class="keywordflow">if</span>(theType==GDT_Unknown){</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>         theType=imgReader[ifile].getDataType();</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>           cout << <span class="stringliteral">"Using data type from input image: "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       }</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span> </div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>         imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         imageType=imgReader[ifile].getImageType();</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span> </div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       <span class="comment">// dataType=imgReader.getDataType(0);</span></div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>         cout << <span class="stringliteral">"type of data for "</span> << input_opt[ifile] << <span class="stringliteral">": "</span> << theType << endl;</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>         cout << <span class="stringliteral">"nband: "</span> << nband << endl;</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       }</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       </div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       maxLRX=theLRX;</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       maxULY=theULY;</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       minULX=theULX;</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       minLRY=theLRY;</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">if</span>(dx_opt.size())</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     dx=dx_opt[0];</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         dx=imgReader[ifile].getDeltaX();</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       <span class="keywordflow">if</span>(dy_opt.size())</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     dy=dy_opt[0];</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         dy=imgReader[ifile].getDeltaY();</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       <span class="comment">// imgReader.getMagicPixel(magic_x,magic_y);</span></div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       init=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     }</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       <span class="comment">//convert bounding box to magic coordinates</span></div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>       <span class="comment">//check uniformity magic pixel</span></div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       <span class="comment">// double test_x,test_y;</span></div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       <span class="comment">// imgReader.getMagicPixel(test_x,test_y);</span></div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="comment">// if(verbose_opt[0]){</span></div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       <span class="comment">//   cout << "magic_x, magic_y: " << magic_x << ", " << magic_y << endl;</span></div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       <span class="comment">// assert(magic_x==test_x);</span></div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       <span class="comment">// assert(magic_y==test_y);</span></div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       maxLRX=(theLRX>maxLRX)?theLRX:maxLRX;</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       maxULY=(theULY>maxULY)?theULY:maxULY;</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       minULX=(theULX<minULX)?theULX:minULX;</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>       minLRY=(theLRY<minLRY)?theLRY:minLRY;</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     }</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>     <span class="comment">// imgReader.close();</span></div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>   }</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     cout << <span class="stringliteral">"bounding box input images (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << minULX << <span class="stringliteral">" "</span> << maxULY << <span class="stringliteral">" "</span> << maxLRX << <span class="stringliteral">" "</span> << minLRY << endl;</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   <span class="keywordflow">if</span>(ulx_opt[0]||uly_opt[0]||lrx_opt[0]||lry_opt[0]){</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>     maxLRX=lrx_opt[0];</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     maxULY=uly_opt[0];</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     minULX=ulx_opt[0];</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     minLRY=lry_opt[0];</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>   }</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>   </div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>   <span class="keywordtype">bool</span> forceEUgrid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   <span class="keywordflow">if</span>(projection_opt.size())</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     forceEUgrid=(!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||projection_opt[0].find(<span class="stringliteral">"ETRS-LAEA"</span>)!=string::npos);</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="keywordflow">if</span>(forceEUgrid){</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     <span class="comment">//force to LAEA grid</span></div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     minULX=floor(minULX);</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     minULX-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(minULX)%(static_cast<int>(dx));</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     maxULY=ceil(maxULY);</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     <span class="keywordflow">if</span>(static_cast<int>(maxULY)%static_cast<int>(dy))</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       maxULY+=dy;</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     maxULY-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(maxULY)%(static_cast<int>(dy));</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     maxLRX=ceil(maxLRX);</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     <span class="keywordflow">if</span>(static_cast<int>(maxLRX)%static_cast<int>(dx))</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       maxLRX+=dx;</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     maxLRX-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(maxLRX)%(static_cast<int>(dx));</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     minLRY=floor(minLRY);</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     minLRY-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(minLRY)%(static_cast<int>(dy));</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>   }</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span> </div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     cout << <span class="stringliteral">"bounding box composite image (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << minULX << <span class="stringliteral">" "</span> << maxULY << <span class="stringliteral">" "</span> << maxLRX << <span class="stringliteral">" "</span> << minLRY << endl;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>   <span class="comment">//initialize image</span></div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     cout << <span class="stringliteral">"initializing composite image..."</span> << endl;</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span> <span class="comment">//   double dcol=(maxLRX-minULX+dx-1)/dx;</span></div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span> <span class="comment">//   double drow=(maxULY-minLRY+dy-1)/dy;</span></div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span> <span class="comment">//   int ncol=static_cast<int>(dcol);</span></div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span> <span class="comment">//   int nrow=static_cast<int>(drow);</span></div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span> </div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>   <span class="keywordtype">int</span> ncol=ceil((maxLRX-minULX)/dx);</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   <span class="keywordtype">int</span> nrow=ceil((maxULY-minLRY)/dy);</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span> </div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     cout << <span class="stringliteral">"composite image dim (nrow x ncol): "</span> << nrow << <span class="stringliteral">" x "</span> << ncol << endl;</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriter;</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>   <span class="keywordflow">while</span>(weight_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     weight_opt.push_back(weight_opt[0]);</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     std::cout << weight_opt << std::endl;</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>   }</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     nwriteBand=(file_opt[0])? class_opt.size()+1:class_opt.size();</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   }</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     nwriteBand=(file_opt[0])? bands.size()+1:bands.size();</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     std::cerr << <span class="stringliteral">"No output file provided (use option -o). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     exit(0);</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>   }</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     cout << <span class="stringliteral">"open output image "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << nwriteBand << <span class="stringliteral">" bands"</span> << endl << flush;</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     imgWriter.open(output_opt[0],ncol,nrow,nwriteBand,theType,imageType,option_opt);</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nwriteBand;++iband)</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       imgWriter.GDALSetNoDataValue(dstnodata_opt[0],iband);</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   }</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     cout << error << endl;</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   }</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   <span class="keywordflow">if</span>(description_opt.size())</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     imgWriter.setImageDescription(description_opt[0]);</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   gt[0]=minULX;</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   gt[1]=dx;</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   gt[2]=0;</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   gt[3]=maxULY;</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   gt[4]=0;</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   gt[5]=-dy;</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>   imgWriter.setGeoTransform(gt);</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   <span class="comment">// imgWriter.setGeoTransform(minULX,maxULY,dx,dy,0,0);</span></div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   <span class="keywordflow">if</span>(projection_opt.size()){</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       cout << <span class="stringliteral">"projection: "</span> << projection_opt[0] << endl;</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     imgWriter.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   }</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(theProjection!=<span class="stringliteral">""</span>){</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       cout << <span class="stringliteral">"projection: "</span> << theProjection << endl;</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     imgWriter.setProjection(theProjection);</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<bndnodata_opt.size();++iband){</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         assert(bndnodata_opt[iband]>=0&&bndnodata_opt[iband]<nband);</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       }</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       <span class="comment">//if output type not set, get type from input image</span></div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>       <span class="keywordflow">if</span>(theType==GDT_Unknown){</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>         theType=imgReader[ifile].getDataType();</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>           cout << <span class="stringliteral">"Using data type from input image: "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       }</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span> </div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>         imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>         imageType=imgReader[ifile].getImageType();</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span> </div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="comment">// dataType=imgReader.getDataType(0);</span></div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>         cout << <span class="stringliteral">"type of data for "</span> << input_opt[ifile] << <span class="stringliteral">": "</span> << theType << endl;</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         cout << <span class="stringliteral">"nband: "</span> << nband << endl;</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       }</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       </div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       maxLRX=theLRX;</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       maxULY=theULY;</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       minULX=theULX;</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       minLRY=theLRY;</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>       <span class="keywordflow">if</span>(dx_opt.size())</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     dx=dx_opt[0];</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         dx=imgReader[ifile].getDeltaX();</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       <span class="keywordflow">if</span>(dy_opt.size())</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     dy=dy_opt[0];</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>         dy=imgReader[ifile].getDeltaY();</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       <span class="comment">// imgReader.getMagicPixel(magic_x,magic_y);</span></div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       init=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     }</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       <span class="comment">//convert bounding box to magic coordinates</span></div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="comment">//check uniformity magic pixel</span></div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       <span class="comment">// double test_x,test_y;</span></div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       <span class="comment">// imgReader.getMagicPixel(test_x,test_y);</span></div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       <span class="comment">// if(verbose_opt[0]){</span></div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       <span class="comment">//   cout << "magic_x, magic_y: " << magic_x << ", " << magic_y << endl;</span></div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       <span class="comment">// assert(magic_x==test_x);</span></div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       <span class="comment">// assert(magic_y==test_y);</span></div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>       maxLRX=(theLRX>maxLRX)?theLRX:maxLRX;</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>       maxULY=(theULY>maxULY)?theULY:maxULY;</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       minULX=(theULX<minULX)?theULX:minULX;</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       minLRY=(theLRY<minLRY)?theLRY:minLRY;</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     }</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     <span class="comment">// imgReader.close();</span></div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   }</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     cout << <span class="stringliteral">"bounding box input images (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << minULX << <span class="stringliteral">" "</span> << maxULY << <span class="stringliteral">" "</span> << maxLRX << <span class="stringliteral">" "</span> << minLRY << endl;</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   <span class="keywordflow">if</span>(ulx_opt[0]||uly_opt[0]||lrx_opt[0]||lry_opt[0]){</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     maxLRX=lrx_opt[0];</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     maxULY=uly_opt[0];</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     minULX=ulx_opt[0];</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     minLRY=lry_opt[0];</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   }</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   </div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="keywordtype">bool</span> forceEUgrid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="keywordflow">if</span>(projection_opt.size())</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     forceEUgrid=(!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||projection_opt[0].find(<span class="stringliteral">"ETRS-LAEA"</span>)!=string::npos);</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   <span class="keywordflow">if</span>(forceEUgrid){</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     <span class="comment">//force to LAEA grid</span></div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     minULX=floor(minULX);</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     minULX-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(minULX)%(static_cast<int>(dx));</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     maxULY=ceil(maxULY);</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     <span class="keywordflow">if</span>(static_cast<int>(maxULY)%static_cast<int>(dy))</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>       maxULY+=dy;</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     maxULY-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(maxULY)%(static_cast<int>(dy));</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     maxLRX=ceil(maxLRX);</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     <span class="keywordflow">if</span>(static_cast<int>(maxLRX)%static_cast<int>(dx))</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       maxLRX+=dx;</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     maxLRX-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(maxLRX)%(static_cast<int>(dx));</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>     minLRY=floor(minLRY);</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>     minLRY-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(minLRY)%(static_cast<int>(dy));</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>   }</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(align_opt[0]){</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     <span class="keywordflow">if</span>(minULX>imgReader[0].getUlx())</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       minULX-=fmod(minULX-imgReader[0].getUlx(),dx);</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(minULX<imgReader[0].getUlx())</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       minULX+=fmod(imgReader[0].getUlx()-minULX,dx)-dx;</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">if</span>(maxLRX<imgReader[0].getLrx())</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       maxLRX+=fmod(imgReader[0].getLrx()-maxLRX,dx);</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(maxLRX>imgReader[0].getLrx())</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       maxLRX-=fmod(maxLRX-imgReader[0].getLrx(),dx)+dx;</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     <span class="keywordflow">if</span>(minLRY>imgReader[0].getLry())</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       minLRY-=fmod(minLRY-imgReader[0].getLry(),dy);</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(minLRY<imgReader[0].getLry())</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       minLRY+=fmod(imgReader[0].getLry()-minLRY,dy)-dy;</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     <span class="keywordflow">if</span>(maxULY<imgReader[0].getUly())</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       maxULY+=fmod(imgReader[0].getUly()-maxULY,dy);</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(maxULY>imgReader[0].getUly())</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       maxULY-=fmod(maxULY-imgReader[0].getUly(),dy)+dy;</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>   }</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span> </div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     cout << <span class="stringliteral">"bounding box composite image (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << minULX << <span class="stringliteral">" "</span> << maxULY << <span class="stringliteral">" "</span> << maxLRX << <span class="stringliteral">" "</span> << minLRY << endl;</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   <span class="comment">//initialize image</span></div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     cout << <span class="stringliteral">"initializing composite image..."</span> << endl;</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span> <span class="comment">//   double dcol=(maxLRX-minULX+dx-1)/dx;</span></div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span> <span class="comment">//   double drow=(maxULY-minLRY+dy-1)/dy;</span></div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span> <span class="comment">//   int ncol=static_cast<int>(dcol);</span></div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span> <span class="comment">//   int nrow=static_cast<int>(drow);</span></div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span> </div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   <span class="keywordtype">int</span> ncol=ceil((maxLRX-minULX)/dx);</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   <span class="keywordtype">int</span> nrow=ceil((maxULY-minLRY)/dy);</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span> </div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     cout << <span class="stringliteral">"composite image dim (nrow x ncol): "</span> << nrow << <span class="stringliteral">" x "</span> << ncol << endl;</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriter;</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   <span class="keywordflow">while</span>(weight_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     weight_opt.push_back(weight_opt[0]);</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     std::cout << weight_opt << std::endl;</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>   }</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     nwriteBand=(file_opt[0])? class_opt.size()+1:class_opt.size();</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   }</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     nwriteBand=(file_opt[0])? bands.size()+1:bands.size();</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     std::cerr << <span class="stringliteral">"No output file provided (use option -o). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     exit(0);</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   }</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     cout << <span class="stringliteral">"open output image "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << nwriteBand << <span class="stringliteral">" bands"</span> << endl << flush;</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     imgWriter.open(output_opt[0],ncol,nrow,nwriteBand,theType,imageType,option_opt);</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nwriteBand;++iband)</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       imgWriter.GDALSetNoDataValue(dstnodata_opt[0],iband);</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>   }</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     cout << error << endl;</div>
 <div class="line"><a name="l00596"></a><span class="lineno">  596</span>   }</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>   <span class="keywordflow">if</span>(imgWriter.getDataType()==GDT_Byte){</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     imgWriter.setColorTable(colorTable_opt[0]);</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>     }</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(theColorTable)</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       imgWriter.setColorTable(theColorTable);</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>   }</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span> </div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt[0]){</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncol,nrow,1,GDT_Float32,<span class="stringliteral">"GTiff"</span>,option_opt);</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       gt[0]=minULX;</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       gt[1]=dx;</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       gt[2]=0;</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       gt[3]=maxULY;</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       gt[4]=0;</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       gt[5]=-dy;</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       maskWriter.setGeoTransform(gt);</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       <span class="keywordflow">if</span>(projection_opt.size())</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     maskWriter.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(theProjection!=<span class="stringliteral">""</span>){</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       cout << <span class="stringliteral">"projection: "</span> << theProjection << endl;</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     maskWriter.setProjection(theProjection);</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       }</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     </div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       <span class="comment">//todo: handle multiple extent options</span></div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       maskWriter.rasterizeOgr(extentReader,burnValues);</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       maskWriter.close();</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     }</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       cerr << error << std::endl;</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       exit(2);</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     }</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       exit(1);</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     }</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     <span class="comment">//todo: support multiple masks</span></div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     mask_opt.clear();</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   }</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       maskReader.open(mask_opt[0]);</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <span class="keywordflow">if</span>(mskband_opt[0]>=maskReader.nrOfBand()){</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Error: illegal mask band"</span>;</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       }</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     }</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       cerr << error << std::endl;</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       exit(2);</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     }</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>       cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       exit(1);</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     }</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   }</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span> </div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   <span class="comment">//create composite image</span></div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>      cout << <span class="stringliteral">"creating composite image"</span> << endl;</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> writeBuffer(nband,imgWriter.nrOfCol());</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   vector<short> fileBuffer(ncol);<span class="comment">//holds the number of used files</span></div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <a class="code" href="classVector2d.html">Vector2d<short></a> maxBuffer;<span class="comment">//buffer used for maximum voting</span></div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   <span class="comment">// Vector2d<double> readBuffer(nband);</span></div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   vector<Vector2d<double> > readBuffer(input_opt.size());</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile)</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     readBuffer[ifile].resize(imgReader[ifile].nrOfBand());</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::maxndvi)<span class="comment">//ndvi</span></div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     assert(ruleBand_opt.size()==2);</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){<span class="comment">//max voting</span></div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     maxBuffer.resize(imgWriter.nrOfCol(),256);<span class="comment">//use only byte images for max voting</span></div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       assert(class_opt[iclass]<maxBuffer.size());</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>   }</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   <span class="keywordtype">int</span> jb=0;</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   <span class="keywordtype">double</span> readRow=0;</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>   <span class="keywordtype">double</span> readCol=0;</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>   <span class="keywordtype">double</span> lowerCol=0;</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>   <span class="keywordtype">double</span> upperCol=0;</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriter.nrOfRow();++irow){</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     vector<float> lineMask;</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     <a class="code" href="classVector2d.html">Vector2d< vector<double></a> > storeBuffer;</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     vector<bool> writeValid(ncol);</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span> </div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     <span class="comment">//convert irow to geo</span></div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordtype">double</span> x=0;</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     <span class="keywordtype">double</span> y=0;</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     imgWriter.image2geo(0,irow,x,y);</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span> </div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span> </div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mean ||</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>        cruleMap[crule_opt[0]]==crule::median ||</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>        cruleMap[crule_opt[0]]==crule::sum ||</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>        cruleMap[crule_opt[0]]==crule::minallbands ||</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>        cruleMap[crule_opt[0]]==crule::maxallbands ||</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>        cruleMap[crule_opt[0]]==crule::stdev)</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       storeBuffer.resize(nband,ncol);</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       writeValid[icol]=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>       fileBuffer[icol]=0;</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>       <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){<span class="comment">//max voting</span></div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<256;++iclass)</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>           maxBuffer[icol][iclass]=0;</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>       }</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>           writeBuffer[iband][icol]=dstnodata_opt[0];</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       }</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     }</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>   <span class="keywordflow">if</span>(description_opt.size())</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     imgWriter.setImageDescription(description_opt[0]);</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>   <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>   gt[0]=minULX;</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>   gt[1]=dx;</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>   gt[2]=0;</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>   gt[3]=maxULY;</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>   gt[4]=0;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>   gt[5]=-dy;</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>   imgWriter.setGeoTransform(gt);</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>   <span class="comment">// imgWriter.setGeoTransform(minULX,maxULY,dx,dy,0,0);</span></div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>   <span class="keywordflow">if</span>(projection_opt.size()){</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       cout << <span class="stringliteral">"projection: "</span> << projection_opt[0] << endl;</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     imgWriter.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>   }</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(theProjection!=<span class="stringliteral">""</span>){</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       cout << <span class="stringliteral">"projection: "</span> << theProjection << endl;</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     imgWriter.setProjection(theProjection);</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>   }</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>   <span class="keywordflow">if</span>(imgWriter.getDataType()==GDT_Byte){</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     imgWriter.setColorTable(colorTable_opt[0]);</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     }</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(theColorTable)</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       imgWriter.setColorTable(theColorTable);</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>   }</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span> </div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt[0]){</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncol,nrow,1,GDT_Float32,<span class="stringliteral">"GTiff"</span>,option_opt);</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       gt[0]=minULX;</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       gt[1]=dx;</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       gt[2]=0;</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       gt[3]=maxULY;</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       gt[4]=0;</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       gt[5]=-dy;</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       maskWriter.setGeoTransform(gt);</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       <span class="keywordflow">if</span>(projection_opt.size())</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     maskWriter.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(theProjection!=<span class="stringliteral">""</span>){</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       cout << <span class="stringliteral">"projection: "</span> << theProjection << endl;</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     maskWriter.setProjection(theProjection);</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       }</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     </div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>       <span class="comment">//todo: handle multiple extent options</span></div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       maskWriter.rasterizeOgr(extentReader,burnValues);</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       maskWriter.close();</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     }</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       exit(2);</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     }</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>       exit(1);</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     }</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>     <span class="comment">//todo: support multiple masks</span></div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     mask_opt.clear();</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>   }</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>       maskReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       <span class="keywordflow">if</span>(mskband_opt[0]>=maskReader.nrOfBand()){</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Error: illegal mask band"</span>;</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       }</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     }</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>       exit(2);</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     }</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       exit(1);</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     }</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   }</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span> </div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>   <span class="comment">//create composite image</span></div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>      cout << <span class="stringliteral">"creating composite image"</span> << endl;</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> writeBuffer(nband,imgWriter.nrOfCol());</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   vector<short> fileBuffer(ncol);<span class="comment">//holds the number of used files</span></div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   <a class="code" href="classVector2d.html">Vector2d<short></a> maxBuffer;<span class="comment">//buffer used for maximum voting</span></div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>   <span class="comment">// Vector2d<double> readBuffer(nband);</span></div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>   vector<Vector2d<double> > readBuffer(input_opt.size());</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile)</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     readBuffer[ifile].resize(imgReader[ifile].nrOfBand());</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::maxndvi)<span class="comment">//ndvi</span></div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     assert(ruleBand_opt.size()==2);</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){<span class="comment">//max voting</span></div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     maxBuffer.resize(imgWriter.nrOfCol(),256);<span class="comment">//use only byte images for max voting</span></div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       assert(class_opt[iclass]<maxBuffer.size());</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>   }</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>   <span class="keywordtype">int</span> jb=0;</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>   <span class="keywordtype">double</span> readRow=0;</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>   <span class="keywordtype">double</span> readCol=0;</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>   <span class="keywordtype">double</span> lowerCol=0;</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   <span class="keywordtype">double</span> upperCol=0;</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriter.nrOfRow();++irow){</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     vector<float> lineMask;</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     <a class="code" href="classVector2d.html">Vector2d< vector<double></a> > storeBuffer;</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     vector<bool> writeValid(ncol);</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span> </div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <span class="comment">//convert irow to geo</span></div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     <span class="keywordtype">double</span> x=0;</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     <span class="keywordtype">double</span> y=0;</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     imgWriter.image2geo(0,irow,x,y);</div>
 <div class="line"><a name="l00722"></a><span class="lineno">  722</span> </div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span> </div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>       <span class="comment">//imgReader already open...</span></div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       <span class="comment">// try{</span></div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>       <span class="comment">//   imgReader.open(input_opt[ifile]);</span></div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>       <span class="comment">// catch(string error){</span></div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>       <span class="comment">//   cout << error << endl;</span></div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       <span class="comment">// assert(imgReader.getDataType()==theType);</span></div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       assert(imgReader[ifile].nrOfBand()>=nband);</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       <span class="keywordflow">if</span>(!imgReader[ifile].covers(minULX,maxULY,maxLRX,minLRY)){</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>         <span class="comment">// imgReader.close();</span></div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       }</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>       <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>       imgReader[ifile].geo2image(minULX+(magic_x-1.0)*imgReader[ifile].getDeltaX(),maxULY-(magic_y-1.0)*imgReader[ifile].getDeltaY(),uli,ulj);</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>       imgReader[ifile].geo2image(maxLRX+(magic_x-2.0)*imgReader[ifile].getDeltaX(),minLRY-(magic_y-2.0)*imgReader[ifile].getDeltaY(),lri,lrj);</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>       uli=floor(uli);</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>       ulj=floor(ulj);</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>       lri=floor(lri);</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       lrj=floor(lrj);</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>         </div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>       <span class="keywordtype">double</span> startCol=uli;</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       <span class="keywordtype">double</span> endCol=lri;</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       <span class="keywordflow">if</span>(uli<0)</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>         startCol=0;</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uli>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>         startCol=imgReader[ifile].nrOfCol()-1;</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>       <span class="keywordflow">if</span>(lri<0)</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>         endCol=0;</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lri>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>         endCol=imgReader[ifile].nrOfCol()-1;</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       <span class="keywordtype">int</span> readncol=endCol-startCol+1;</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span> </div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       <span class="comment">//lookup corresponding row for irow in this file</span></div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       imgReader[ifile].geo2image(x,y,readCol,readRow);</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>       <span class="keywordflow">if</span>(readRow<0||readRow>=imgReader[ifile].nrOfRow()){</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         <span class="comment">// imgReader.close();</span></div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       }</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       <span class="comment">// for(int iband=0;iband<imgReader.nrOfBand();++iband){</span></div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     <span class="keywordtype">int</span> readBand=(band_opt.size()>iband)? band_opt[iband] : iband;</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>         <span class="comment">// readBuffer[iband].resize(readncol);</span></div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>           imgReader[ifile].readData(readBuffer[ifile][iband],GDT_Float64,startCol,endCol,readRow,readBand,theResample);</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>     }</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       cerr << <span class="stringliteral">"error reading image "</span> << input_opt[ifile] << <span class="stringliteral">": "</span> << endl;</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       <span class="keywordflow">throw</span>;</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     }</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>       }</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>         </div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ib=0;ib<ncol;++ib){</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>         imgWriter.image2geo(ib,irow,x,y);</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>     <span class="comment">//check mask first</span></div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>     <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       <span class="comment">//read mask</span></div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       <span class="keywordtype">double</span> colMask=0;</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       <span class="keywordtype">double</span> rowMask=0;</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span> </div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       maskReader.geo2image(x,y,colMask,rowMask);</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span> </div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>           assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>         maskReader.readData(lineMask,GDT_Float32,static_cast<int>(rowMask),mskband_opt[0]);</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>           }</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>         cerr << errorstring << endl;</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>         exit(1);</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>           }</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>           <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>         exit(3);</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>           }</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>           oldRowMask=rowMask;</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>         }</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>         <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[0])</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>           valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       }</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     }</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span> </div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     <span class="keywordflow">if</span>(!valid)</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span> </div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>         <span class="comment">//lookup corresponding row for irow in this file</span></div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>         imgReader[ifile].geo2image(x,y,readCol,readRow);</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>         <span class="keywordflow">if</span>(readCol<0||readCol>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         <span class="keywordtype">double</span> val_current=0;</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         <span class="keywordtype">double</span> val_new=0;</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>         <span class="keywordtype">bool</span> readValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>           lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>           upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>             lowerCol=0;</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>           <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>             upperCol=imgReader[ifile].nrOfCol()-1;</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>             val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][bndnodata_opt[vband]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][bndnodata_opt[vband]][lowerCol-startCol];</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         <span class="keywordflow">if</span>(minValue_opt.size()>vband){</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>           <span class="keywordflow">if</span>(val_new<=minValue_opt[vband]){</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>           }</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>         }</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>         <span class="keywordflow">if</span>(maxValue_opt.size()>vband){</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>           <span class="keywordflow">if</span>(val_new>=maxValue_opt[vband]){</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>           }</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>         }</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()>vband){</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>           <span class="keywordflow">if</span>(val_new==srcnodata_opt[vband]){</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>           }</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>         }</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>       }</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>           readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>             val_new=readBuffer[ifile][bndnodata_opt[vband]][readCol-startCol];</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>         <span class="keywordflow">if</span>(minValue_opt.size()>vband){</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>           <span class="keywordflow">if</span>(val_new<=minValue_opt[vband]){</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>           }</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>         }</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>         <span class="keywordflow">if</span>(maxValue_opt.size()>vband){</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>           <span class="keywordflow">if</span>(val_new>=maxValue_opt[vband]){</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>           }</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>         }</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()>vband){</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>           <span class="keywordflow">if</span>(val_new==srcnodata_opt[vband]){</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>           }</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>         }</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       }</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     }</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>     <span class="keywordflow">if</span>(readValid){</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       <span class="keywordflow">if</span>(file_opt[0]==1)</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>         ++fileBuffer[ib];</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>           <span class="keywordflow">if</span>(writeValid[ib]){</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>             <span class="keywordtype">int</span> iband=0;</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>         <span class="keywordflow">case</span>(crule::maxndvi):{<span class="comment">//max ndvi</span></div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>               <span class="keywordtype">double</span> red_current=writeBuffer[ruleBand_opt[0]][ib];</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>               <span class="keywordtype">double</span> nir_current=writeBuffer[ruleBand_opt[1]][ib];</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>           <span class="keywordtype">double</span> ndvi_current=0;</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>               <span class="keywordflow">if</span>(red_current+nir_current>0&&red_current>=0&&nir_current>=0)</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>                 ndvi_current=(nir_current-red_current)/(nir_current+red_current);</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>           <span class="keywordtype">double</span> ndvi_new=0;</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>               <span class="keywordtype">double</span> red_new=0;</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>               <span class="keywordtype">double</span> nir_new=0;</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>                   lowerCol=0;</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>                 red_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[0]][lowerCol-startCol];</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>                 nir_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[1]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[1]][lowerCol-startCol];</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>                 <span class="keywordflow">if</span>(red_new+nir_new>0&&red_new>=0&&nir_new>=0)</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>                   ndvi_new=(nir_new-red_new)/(nir_new+red_new);</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>                 <span class="keywordflow">if</span>(ndvi_new>=ndvi_current){</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>                     val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>                     writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>                   }</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>             fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>                 }</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>                 red_new=readBuffer[ifile][ruleBand_opt[0]][readCol-startCol];</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>                 nir_new=readBuffer[ifile][ruleBand_opt[1]][readCol-startCol];</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>                 <span class="keywordflow">if</span>(red_new+nir_new>0&&red_new>=0&&nir_new>=0)</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>                   ndvi_new=(nir_new-red_new)/(nir_new+red_new);</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>                 <span class="keywordflow">if</span>(ndvi_new>=ndvi_current){</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>                     val_new=readBuffer[ifile][iband][readCol-startCol];</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>                     writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>                   }</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>             fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>                 }</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>               }</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>             }</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>         <span class="keywordflow">case</span>(crule::maxband):</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>             <span class="keywordflow">case</span>(crule::minband):</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>             <span class="keywordflow">case</span>(crule::validband):<span class="comment">//max,min,valid band</span></div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>               val_current=writeBuffer[ruleBand_opt[0]][ib];</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>                   lowerCol=0;</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>                 val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[0]][lowerCol-startCol];</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>                 val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>                 <span class="keywordflow">if</span>((cruleMap[crule_opt[0]]==crule::maxband&&val_new>val_current)||(cruleMap[crule_opt[0]]==crule::minband&&val_new<val_current)||(cruleMap[crule_opt[0]]==crule::validband)){<span class="comment">//&&val_new>minValue_opt[0]&&val_new<maxValue_opt[0])){</span></div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>                     val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>                     val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>                     writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>                   }</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>             fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>                 }</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>                 val_new=readBuffer[ifile][ruleBand_opt[0]][readCol-startCol];</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>                 val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>                 <span class="keywordflow">if</span>((cruleMap[crule_opt[0]]==crule::maxband&&val_new>val_current)||(cruleMap[crule_opt[0]]==crule::minband&&val_new<val_current)||(cruleMap[crule_opt[0]]==crule::validband)){<span class="comment">//&&val_new>minValue_opt[0]&&val_new<maxValue_opt[0])){</span></div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>                     val_new=readBuffer[ifile][iband][readCol-startCol];</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>                     val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>                     writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>                   }</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>             fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>                 }</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>               }</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>             <span class="keywordflow">case</span>(crule::mode):<span class="comment">//max voting (only for Byte images)</span></div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>                   lowerCol=0;</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>                 }</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         }</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>           }</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>             <span class="keywordflow">case</span>(crule::mean):<span class="comment">//mean value</span></div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>         <span class="keywordflow">case</span>(crule::median):<span class="comment">//median value</span></div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>         <span class="keywordflow">case</span>(crule::sum):<span class="comment">//sum value</span></div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         <span class="keywordflow">case</span>(crule::minallbands):<span class="comment">//minimum for each and every band</span></div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>         <span class="keywordflow">case</span>(crule::maxallbands):<span class="comment">//maximum for each and every band</span></div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         <span class="keywordflow">case</span>(crule::stdev):<span class="comment">//maximum for each and every band</span></div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>                   lowerCol=0;</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>                 }</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>                   assert(ifile>0);</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>                   <span class="comment">// assert(weight_opt[ifile]>=0);</span></div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>                   <span class="comment">// assert(storeBuffer[iband][ib].back()>=0);</span></div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>                 }</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>               }</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>           fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>         <span class="keywordflow">case</span>(crule::overwrite):</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>                   lowerCol=0;</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>                   writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>                 }</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>                   writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>                 }</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>               }</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>           fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>         }</div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>       }</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>             writeValid[ib]=<span class="keyword">true</span>;<span class="comment">//readValid was true</span></div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>             <span class="keywordtype">int</span> iband=0;</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>             <span class="keywordflow">case</span>(crule::mean):</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>             <span class="keywordflow">case</span>(crule::median):</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>             <span class="keywordflow">case</span>(crule::sum):</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>             <span class="keywordflow">case</span>(crule::minallbands):</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>             <span class="keywordflow">case</span>(crule::maxallbands):</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>             <span class="keywordflow">case</span>(crule::stdev):</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>                   lowerCol=0;</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>                 }</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>                 }</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>               }</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>           fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>             <span class="keywordflow">case</span>(crule::mode):</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>                   lowerCol=0;</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span> </div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mean ||</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>        cruleMap[crule_opt[0]]==crule::median ||</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>        cruleMap[crule_opt[0]]==crule::sum ||</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>        cruleMap[crule_opt[0]]==crule::minallbands ||</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>        cruleMap[crule_opt[0]]==crule::maxallbands ||</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>        cruleMap[crule_opt[0]]==crule::stdev)</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>       storeBuffer.resize(nband,ncol);</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>       writeValid[icol]=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       fileBuffer[icol]=0;</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){<span class="comment">//max voting</span></div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<256;++iclass)</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>           maxBuffer[icol][iclass]=0;</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>       }</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>           writeBuffer[iband][icol]=dstnodata_opt[0];</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>       }</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     }</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span> </div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span> </div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>       <span class="comment">//imgReader already open...</span></div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       <span class="comment">// try{</span></div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       <span class="comment">//   imgReader.open(input_opt[ifile]);</span></div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       <span class="comment">// catch(string error){</span></div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       <span class="comment">//   cout << error << endl;</span></div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       <span class="comment">// assert(imgReader.getDataType()==theType);</span></div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       assert(imgReader[ifile].nrOfBand()>=nband);</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       <span class="keywordflow">if</span>(!imgReader[ifile].covers(minULX,maxULY,maxLRX,minLRY)){</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>         <span class="comment">// imgReader.close();</span></div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       }</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>       imgReader[ifile].geo2image(minULX+(magic_x-1.0)*imgReader[ifile].getDeltaX(),maxULY-(magic_y-1.0)*imgReader[ifile].getDeltaY(),uli,ulj);</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>       imgReader[ifile].geo2image(maxLRX+(magic_x-2.0)*imgReader[ifile].getDeltaX(),minLRY-(magic_y-2.0)*imgReader[ifile].getDeltaY(),lri,lrj);</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       uli=floor(uli);</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       ulj=floor(ulj);</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       lri=floor(lri);</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       lrj=floor(lrj);</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>         </div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>       <span class="keywordtype">double</span> startCol=uli;</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>       <span class="keywordtype">double</span> endCol=lri;</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       <span class="keywordflow">if</span>(uli<0)</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>         startCol=0;</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uli>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>         startCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       <span class="keywordflow">if</span>(lri<0)</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>         endCol=0;</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lri>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>         endCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>       <span class="keywordtype">int</span> readncol=endCol-startCol+1;</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span> </div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       <span class="comment">//lookup corresponding row for irow in this file</span></div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       imgReader[ifile].geo2image(x,y,readCol,readRow);</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       <span class="keywordflow">if</span>(readRow<0||readRow>=imgReader[ifile].nrOfRow()){</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>         <span class="comment">// imgReader.close();</span></div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       }</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       <span class="comment">// for(int iband=0;iband<imgReader.nrOfBand();++iband){</span></div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     <span class="keywordtype">int</span> readBand=(band_opt.size()>iband)? band_opt[iband] : iband;</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>         <span class="comment">// readBuffer[iband].resize(readncol);</span></div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>           imgReader[ifile].readData(readBuffer[ifile][iband],GDT_Float64,startCol,endCol,readRow,readBand,theResample);</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     }</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       cerr << <span class="stringliteral">"error reading image "</span> << input_opt[ifile] << <span class="stringliteral">": "</span> << endl;</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       <span class="keywordflow">throw</span>;</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>     }</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       }</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>         </div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ib=0;ib<ncol;++ib){</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         imgWriter.image2geo(ib,irow,x,y);</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>     <span class="comment">//check mask first</span></div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>     <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       <span class="comment">//read mask</span></div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>       <span class="keywordtype">double</span> colMask=0;</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       <span class="keywordtype">double</span> rowMask=0;</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span> </div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       maskReader.geo2image(x,y,colMask,rowMask);</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span> </div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>           assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>           <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>         maskReader.readData(lineMask,GDT_Float32,static_cast<int>(rowMask),mskband_opt[0]);</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>           }</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         exit(1);</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>           }</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>           <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>         exit(3);</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>           }</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>           oldRowMask=rowMask;</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>         }</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>         <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[0])</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>           valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>       }</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>     }</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span> </div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>     <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span> </div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>         <span class="comment">//lookup corresponding row for irow in this file</span></div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         imgReader[ifile].geo2image(x,y,readCol,readRow);</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>         <span class="keywordflow">if</span>(readCol<0||readCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>         <span class="keywordtype">double</span> val_current=0;</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>         <span class="keywordtype">double</span> val_new=0;</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         <span class="keywordtype">bool</span> readValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>         <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>         <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>           lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>           upperCol=readCol+0.5;</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>             lowerCol=0;</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>           <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>             upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>             val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][bndnodata_opt[vband]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][bndnodata_opt[vband]][lowerCol-startCol];</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>         <span class="keywordflow">if</span>(minValue_opt.size()>vband){</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>           <span class="keywordflow">if</span>(val_new<=minValue_opt[vband]){</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>           }</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         }</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>         <span class="keywordflow">if</span>(maxValue_opt.size()>vband){</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>           <span class="keywordflow">if</span>(val_new>=maxValue_opt[vband]){</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>           }</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>         }</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()>vband){</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>           <span class="keywordflow">if</span>(val_new==srcnodata_opt[vband]){</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>           }</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>         }</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       }</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>           readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>             val_new=readBuffer[ifile][bndnodata_opt[vband]][readCol-startCol];</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>         <span class="keywordflow">if</span>(minValue_opt.size()>vband){</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>           <span class="keywordflow">if</span>(val_new<=minValue_opt[vband]){</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>           }</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>         }</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>         <span class="keywordflow">if</span>(maxValue_opt.size()>vband){</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>           <span class="keywordflow">if</span>(val_new>=maxValue_opt[vband]){</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>           }</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>         }</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()>vband){</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>           <span class="keywordflow">if</span>(val_new==srcnodata_opt[vband]){</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>           }</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>         }</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>       }</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>     }</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>     <span class="keywordflow">if</span>(readValid){</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>       <span class="keywordflow">if</span>(file_opt[0]==1)</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>         ++fileBuffer[ib];</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>           <span class="keywordflow">if</span>(writeValid[ib]){</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>             <span class="keywordtype">int</span> iband=0;</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>         <span class="keywordflow">case</span>(crule::maxndvi):{<span class="comment">//max ndvi</span></div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>               <span class="keywordtype">double</span> red_current=writeBuffer[ruleBand_opt[0]][ib];</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>               <span class="keywordtype">double</span> nir_current=writeBuffer[ruleBand_opt[1]][ib];</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>           <span class="keywordtype">double</span> ndvi_current=0;</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>               <span class="keywordflow">if</span>(red_current+nir_current>0&&red_current>=0&&nir_current>=0)</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>                 ndvi_current=(nir_current-red_current)/(nir_current+red_current);</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>           <span class="keywordtype">double</span> ndvi_new=0;</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>               <span class="keywordtype">double</span> red_new=0;</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>               <span class="keywordtype">double</span> nir_new=0;</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>                   lowerCol=0;</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>                 red_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[0]][lowerCol-startCol];</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>                 nir_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[1]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[1]][lowerCol-startCol];</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>                 <span class="keywordflow">if</span>(red_new+nir_new>0&&red_new>=0&&nir_new>=0)</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>                   ndvi_new=(nir_new-red_new)/(nir_new+red_new);</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>                 <span class="keywordflow">if</span>(ndvi_new>=ndvi_current){</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>                     val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>                     writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>                   }</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>             fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>                 }</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>                 red_new=readBuffer[ifile][ruleBand_opt[0]][readCol-startCol];</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>                 nir_new=readBuffer[ifile][ruleBand_opt[1]][readCol-startCol];</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>                 <span class="keywordflow">if</span>(red_new+nir_new>0&&red_new>=0&&nir_new>=0)</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>                   ndvi_new=(nir_new-red_new)/(nir_new+red_new);</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>                 <span class="keywordflow">if</span>(ndvi_new>=ndvi_current){</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>                     val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>                     writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>                   }</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>             fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>                 }</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>               }</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>             }</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>         <span class="keywordflow">case</span>(crule::maxband):</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>             <span class="keywordflow">case</span>(crule::minband):</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>             <span class="keywordflow">case</span>(crule::validband):<span class="comment">//max,min,valid band</span></div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>               val_current=writeBuffer[ruleBand_opt[0]][ib];</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>                   lowerCol=0;</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>                 val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[0]][lowerCol-startCol];</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>                 val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>                 <span class="keywordflow">if</span>((cruleMap[crule_opt[0]]==crule::maxband&&val_new>val_current)||(cruleMap[crule_opt[0]]==crule::minband&&val_new<val_current)||(cruleMap[crule_opt[0]]==crule::validband)){<span class="comment">//&&val_new>minValue_opt[0]&&val_new<maxValue_opt[0])){</span></div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>                     val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>                     val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>                     writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>                   }</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>             fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>                 }</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>                 val_new=readBuffer[ifile][ruleBand_opt[0]][readCol-startCol];</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>                 val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>                 <span class="keywordflow">if</span>((cruleMap[crule_opt[0]]==crule::maxband&&val_new>val_current)||(cruleMap[crule_opt[0]]==crule::minband&&val_new<val_current)||(cruleMap[crule_opt[0]]==crule::validband)){<span class="comment">//&&val_new>minValue_opt[0]&&val_new<maxValue_opt[0])){</span></div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>                     val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>                     val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>                     writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>                   }</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>             fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>                 }</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>               }</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>             <span class="keywordflow">case</span>(crule::mode):<span class="comment">//max voting (only for Byte images)</span></div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>                   lowerCol=0;</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>                 }</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         }</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>           }</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>             <span class="keywordflow">case</span>(crule::mean):<span class="comment">//mean value</span></div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>         <span class="keywordflow">case</span>(crule::median):<span class="comment">//median value</span></div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>         <span class="keywordflow">case</span>(crule::sum):<span class="comment">//sum value</span></div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>         <span class="keywordflow">case</span>(crule::minallbands):<span class="comment">//minimum for each and every band</span></div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         <span class="keywordflow">case</span>(crule::maxallbands):<span class="comment">//maximum for each and every band</span></div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>         <span class="keywordflow">case</span>(crule::stdev):<span class="comment">//maximum for each and every band</span></div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>                   lowerCol=0;</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>                 }</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>                   assert(ifile>0);</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>                   <span class="comment">// assert(weight_opt[ifile]>=0);</span></div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>                   <span class="comment">// assert(storeBuffer[iband][ib].back()>=0);</span></div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>                 }</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>               }</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>           fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>         <span class="keywordflow">case</span>(crule::overwrite):</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>                   lowerCol=0;</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>                   writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>                 }</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>                   writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>                 }</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>               }</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>           fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>         }</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>       }</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>             writeValid[ib]=<span class="keyword">true</span>;<span class="comment">//readValid was true</span></div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>             <span class="keywordtype">int</span> iband=0;</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>             <span class="keywordflow">case</span>(crule::mean):</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>             <span class="keywordflow">case</span>(crule::median):</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>             <span class="keywordflow">case</span>(crule::sum):</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>             <span class="keywordflow">case</span>(crule::minallbands):</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>             <span class="keywordflow">case</span>(crule::maxallbands):</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>             <span class="keywordflow">case</span>(crule::stdev):</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>                   lowerCol=0;</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>                 }</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
 <div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>         }</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>                 }</div>
 <div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>           val_new=readBuffer[ifile][iband][readCol-startCol];</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         }</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>               }</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>             <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>                   lowerCol=0;</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>                   writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>                 }</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>                   writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>                 }</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>               }</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>         fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>             }</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>           }</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>         }</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       }</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>       <span class="comment">// imgReader.close();</span></div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>     }</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>     <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>       vector<short> classBuffer(imgWriter.nrOfCol());</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>       <span class="keywordflow">if</span>(class_opt.size()>1){</div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol)</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>             classBuffer[icol]=maxBuffer[icol][class_opt[iclass]];</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>             imgWriter.writeData(classBuffer,GDT_Int16,irow,iclass);</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>           }</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>             cerr << <span class="stringliteral">"error writing image file "</span> << output_opt[0] << <span class="stringliteral">": "</span> << error << endl;</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>             <span class="keywordflow">throw</span>;</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>           }</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>         }</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>       }</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>           vector<short>::iterator maxit=maxBuffer[icol].begin();</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>           maxit=stat.mymax(maxBuffer[icol],maxBuffer[icol].begin(),maxBuffer[icol].end());</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>           writeBuffer[0][icol]=distance(maxBuffer[icol].begin(),maxit);</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>       <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>         fileBuffer[icol]=*(maxit);</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>         }</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>           imgWriter.writeData(writeBuffer[0],GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>           <span class="keywordflow">if</span>(file_opt[0])</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>             imgWriter.writeData(fileBuffer,GDT_Int16,irow,1);</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>         }</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>           cerr << <span class="stringliteral">"error writing image file "</span> << output_opt[0] << <span class="stringliteral">": "</span> << error << endl;</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>           <span class="keywordflow">throw</span>;</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>         }</div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>       }</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>     }</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<bands.size();++iband){</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>         <span class="comment">// assert(writeBuffer[bands[iband]].size()==imgWriter.nrOfCol());</span></div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>         assert(writeBuffer[iband].size()==imgWriter.nrOfCol());</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>         <span class="keywordflow">case</span>(crule::mean):</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mean(storeBuffer[bands[iband]][icol]);</span></div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>           writeBuffer[iband][icol]=stat.mean(storeBuffer[iband][icol]);</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>         <span class="keywordflow">case</span>(crule::median):</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>           <span class="comment">// writeBuffer[iband][icol]=stat.median(storeBuffer[bands[iband]][icol]);</span></div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>           writeBuffer[iband][icol]=stat.median(storeBuffer[iband][icol]);</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>         <span class="keywordflow">case</span>(crule::sum):</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>           <span class="comment">// writeBuffer[iband][icol]=stat.sum(storeBuffer[bands[iband]][icol]);</span></div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>           writeBuffer[iband][icol]=stat.sum(storeBuffer[iband][icol]);</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>         <span class="keywordflow">case</span>(crule::minallbands):</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mymin(storeBuffer[bands[iband]][icol]);</span></div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>           writeBuffer[iband][icol]=stat.mymin(storeBuffer[iband][icol]);</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>         <span class="keywordflow">case</span>(crule::maxallbands):</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mymax(storeBuffer[bands[iband]][icol]);</span></div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>           writeBuffer[iband][icol]=stat.mymax(storeBuffer[iband][icol]);</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>         <span class="keywordflow">case</span>(crule::stdev):</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>           <span class="comment">// writeBuffer[iband][icol]=sqrt(stat.var(storeBuffer[bands[iband]][icol]));</span></div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>           writeBuffer[iband][icol]=sqrt(stat.var(storeBuffer[iband][icol]));</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>         }</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>       }</div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>           cerr << error << endl;</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>         writeBuffer[iband][icol]=dstnodata_opt[0];</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>       }</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>         }</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>           imgWriter.writeData(writeBuffer[iband],GDT_Float64,irow,iband);</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>         }</div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>           cerr << error << <span class="stringliteral">" in "</span> << output_opt[0] << endl;</div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>           <span class="keywordflow">throw</span>;</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>         }</div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>       }</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>       <span class="keywordflow">if</span>(file_opt[0]){</div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>           imgWriter.writeData(fileBuffer,GDT_Int16,irow,bands.size());</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         }</div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>           cerr << error << <span class="stringliteral">" in "</span> << output_opt[0] << endl;</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>           <span class="keywordflow">throw</span>;</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>         }</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>       }</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>     }</div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/imgWriter.nrOfRow();</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>   }</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt.size()){</div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>     extentReader.close();</div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>   }</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile)</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>     imgReader[ifile].close();</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>   <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>     maskReader.close();</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>   imgWriter.close();</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span> }</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>   </div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>               }</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>           fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>             <span class="keywordflow">case</span>(crule::mode):</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>                   lowerCol=0;</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>         }</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>           val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>         }</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>               }</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>             <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>                   lowerCol=0;</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>                   writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>                 }</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>                   writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>                 }</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>               }</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>         fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>             }</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>           }</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>         }</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>       }</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>       <span class="comment">// imgReader.close();</span></div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>     }</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>     <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       vector<short> classBuffer(imgWriter.nrOfCol());</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>       <span class="keywordflow">if</span>(class_opt.size()>1){</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol)</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>             classBuffer[icol]=maxBuffer[icol][class_opt[iclass]];</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>           <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>             imgWriter.writeData(classBuffer,GDT_Int16,irow,iclass);</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>           }</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>             cerr << <span class="stringliteral">"error writing image file "</span> << output_opt[0] << <span class="stringliteral">": "</span> << error << endl;</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>             <span class="keywordflow">throw</span>;</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>           }</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>         }</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       }</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>           vector<short>::iterator maxit=maxBuffer[icol].begin();</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>           maxit=stat.mymax(maxBuffer[icol],maxBuffer[icol].begin(),maxBuffer[icol].end());</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>           writeBuffer[0][icol]=distance(maxBuffer[icol].begin(),maxit);</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>       <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>         fileBuffer[icol]=*(maxit);</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>         }</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>           imgWriter.writeData(writeBuffer[0],GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>           <span class="keywordflow">if</span>(file_opt[0])</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>             imgWriter.writeData(fileBuffer,GDT_Int16,irow,1);</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>         }</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>           cerr << <span class="stringliteral">"error writing image file "</span> << output_opt[0] << <span class="stringliteral">": "</span> << error << endl;</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>           <span class="keywordflow">throw</span>;</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>         }</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>       }</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     }</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<bands.size();++iband){</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>         <span class="comment">// assert(writeBuffer[bands[iband]].size()==imgWriter.nrOfCol());</span></div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>         assert(writeBuffer[iband].size()==imgWriter.nrOfCol());</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>         <span class="keywordflow">case</span>(crule::mean):</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mean(storeBuffer[bands[iband]][icol]);</span></div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>           writeBuffer[iband][icol]=stat.mean(storeBuffer[iband][icol]);</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>         <span class="keywordflow">case</span>(crule::median):</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>           <span class="comment">// writeBuffer[iband][icol]=stat.median(storeBuffer[bands[iband]][icol]);</span></div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>           writeBuffer[iband][icol]=stat.median(storeBuffer[iband][icol]);</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>         <span class="keywordflow">case</span>(crule::sum):</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>           <span class="comment">// writeBuffer[iband][icol]=stat.sum(storeBuffer[bands[iband]][icol]);</span></div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>           writeBuffer[iband][icol]=stat.sum(storeBuffer[iband][icol]);</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>         <span class="keywordflow">case</span>(crule::minallbands):</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mymin(storeBuffer[bands[iband]][icol]);</span></div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>           writeBuffer[iband][icol]=stat.mymin(storeBuffer[iband][icol]);</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>         <span class="keywordflow">case</span>(crule::maxallbands):</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mymax(storeBuffer[bands[iband]][icol]);</span></div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>           writeBuffer[iband][icol]=stat.mymax(storeBuffer[iband][icol]);</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>         <span class="keywordflow">case</span>(crule::stdev):</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>           <span class="comment">// writeBuffer[iband][icol]=sqrt(stat.var(storeBuffer[bands[iband]][icol]));</span></div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>           writeBuffer[iband][icol]=sqrt(stat.var(storeBuffer[iband][icol]));</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         }</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>       }</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>           cerr << error << endl;</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>         writeBuffer[iband][icol]=dstnodata_opt[0];</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>       }</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>         }</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>           imgWriter.writeData(writeBuffer[iband],GDT_Float64,irow,iband);</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         }</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>           cerr << error << <span class="stringliteral">" in "</span> << output_opt[0] << endl;</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>           <span class="keywordflow">throw</span>;</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>         }</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>       }</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>       <span class="keywordflow">if</span>(file_opt[0]){</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>           imgWriter.writeData(fileBuffer,GDT_Int16,irow,bands.size());</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>         }</div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>           cerr << error << <span class="stringliteral">" in "</span> << output_opt[0] << endl;</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>           <span class="keywordflow">throw</span>;</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>         }</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>       }</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>     }</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/imgWriter.nrOfRow();</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>   }</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt.size()){</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>     extentReader.close();</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>   }</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile)</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>     imgReader[ifile].close();</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>   <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>     maskReader.close();</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>   imgWriter.close();</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span> }</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>   </div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
@@ -1238,7 +1258,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite_8py_source.html b/doc/html/pkcomposite_8py_source.html
index 34708be..740587a 100644
--- a/doc/html/pkcomposite_8py_source.html
+++ b/doc/html/pkcomposite_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -233,7 +233,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite__gui_2main_8cc_source.html b/doc/html/pkcomposite__gui_2main_8cc_source.html
index cb02e95..377ee74 100644
--- a/doc/html/pkcomposite__gui_2main_8cc_source.html
+++ b/doc/html/pkcomposite__gui_2main_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -88,7 +88,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite__gui_2mainwindow_8cc_source.html b/doc/html/pkcomposite__gui_2mainwindow_8cc_source.html
index 39d6e9e..1f3a245 100644
--- a/doc/html/pkcomposite__gui_2mainwindow_8cc_source.html
+++ b/doc/html/pkcomposite__gui_2mainwindow_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -316,7 +316,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite__gui_2mainwindow_8h_source.html b/doc/html/pkcomposite__gui_2mainwindow_8h_source.html
index f6c88c6..5fb9dff 100644
--- a/doc/html/pkcomposite__gui_2mainwindow_8h_source.html
+++ b/doc/html/pkcomposite__gui_2mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -129,7 +129,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcreatect.html b/doc/html/pkcreatect.html
index b71fefc..0f307fc 100644
--- a/doc/html/pkcreatect.html
+++ b/doc/html/pkcreatect.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@ Options</h1>
 <tr>
 <td>d </td><td>description </td><td>std::string </td><td></td><td>Set image description </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). </td></tr>
 <tr>
 <td>co </td><td>co </td><td>std::string </td><td></td><td>Creation option for output file. Multiple options can be specified. </td></tr>
 </table>
@@ -90,7 +90,7 @@ Usage: pkcreatect -i input.txt -o output [-ct colortable | -min value -max value
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcreatect_8cc_source.html b/doc/html/pkcreatect_8cc_source.html
index 70457e6..6a359ed 100644
--- a/doc/html/pkcreatect_8cc_source.html
+++ b/doc/html/pkcreatect_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -93,7 +93,7 @@
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  max_opt(<span class="stringliteral">"max"</span>, <span class="stringliteral">"max"</span>, <span class="stringliteral">"maximum value"</span>, 100);</div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a>  grey_opt(<span class="stringliteral">"g"</span>, <span class="stringliteral">"grey"</span>, <span class="stringliteral">"grey scale"</span>, <span class="keyword">false</span>);</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>, <span class="stringliteral">"GTiff"</span>);</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>, <span class="stringliteral">"GTiff"</span>);</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  description_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"description"</span>, <span class="stringliteral">"Set image description"</span>);</div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a>  verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, <span class="keyword">false</span>,2);</div>
@@ -257,14 +257,14 @@
 <div class="line"><a name="l00248"></a><span class="lineno">  248</span>     legendWriter.close();</div>
 <div class="line"><a name="l00249"></a><span class="lineno">  249</span> }</div>
 <div class="line"><a name="l00250"></a><span class="lineno">  250</span> </div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop.html b/doc/html/pkcrop.html
index 80eb5de..e1f5418 100644
--- a/doc/html/pkcrop.html
+++ b/doc/html/pkcrop.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -48,7 +48,7 @@
 <p><code> Usage: pkcrop -i input -o output </code></p>
 <p><code></code></p>
 <p><code> Options: [-of out_format] [-ot {Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}] [-b band]* [-ulx ULX -uly ULY -lrx LRX -lry LRY] [-dx xres] [-dy yres] [-r resampling_method] [-a_srs epsg:number] [-nodata value]</code></p>
-<p><code> Advanced options: [-e vector [-cut]] [-sband band -eband band]* [-co NAME=VALUE]* [-x center_x -y center_y] [-nx size_x -ny size_y] [-ns nsample -nl nlines] [-as min -as max] [-scale value]* [-off offset]* [-ct colortable] [-d description] </code></p>
+<p><code> Advanced options: [-e vector [-cut]] [-sband band -eband band]* [-co NAME=VALUE]* [-x center_x -y center_y] [-nx size_x -ny size_y] [-ns nsample -nl nlines] [-as min -as max] [-scale value]* [-off offset]* [-ct colortable] [-d description] [-align] </code></p>
 <h1><a class="anchor" id="pkcrop_description"></a>
 Description</h1>
 <p>The utility pkcrop can subset and stack raster images. In the spatial domain it can crop a bounding box from a larger image. The output bounding box is selected by setting the new corner coordinates using the options -ulx -uly -lrx -lry. Alternatively you can set the new image center (-x -y) and size. This can be done either in projected coordinates (using the options -nx -ny) or in image coordinates (using the options -ns -nl). You can also use a vector file to set the new bounding b [...]
@@ -84,7 +84,7 @@ Options</h1>
 <tr>
 <td>ot </td><td>otype </td><td>std::string </td><td></td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td></td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate) </td></tr>
 <tr>
 <td>ct </td><td>ct </td><td>std::string </td><td></td><td>color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) </td></tr>
 <tr>
@@ -126,17 +126,19 @@ Options</h1>
 <tr>
 <td>nodata </td><td>nodata </td><td>float </td><td></td><td>Nodata value to put in image if out of bounds. </td></tr>
 <tr>
+<td>align </td><td>align </td><td>bool </td><td></td><td>Align output bounding box to input image </td></tr>
+<tr>
 <td>d </td><td>description </td><td>std::string </td><td></td><td>Set image description </td></tr>
 </table>
-Usage: pkcrop -i input -o output</li>
-</ul>
 <h1>Examples </h1>
+</li>
+</ul>
 <p>Some examples how to use pkcrop can be found <a class="el" href="md_examples_pkcrop.html#examples_pkcrop">here</a> </p>
 </div></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop_8cc_source.html b/doc/html/pkcrop_8cc_source.html
index 79a17d8..c0d48ba 100644
--- a/doc/html/pkcrop_8cc_source.html
+++ b/doc/html/pkcrop_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -116,703 +116,721 @@
 <div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"output=scale*input+offset"</span>);</div>
 <div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"output=scale*input+offset"</span>);</div>
 <div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>,<span class="stringlitera [...]
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>,<span class="stringliteral">"GTiff"</span>);</div>
 <div class="line"><a name="l00132"></a><span class="lineno">  132</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
 <div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
 <div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a>  nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"Nodata value to put in image if out of bounds."</span>);</div>
 <div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  resample_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"resampling-method"</span>, <span class="stringliteral">"Resampling method (near: nearest neighbor, bilinear: bi-linear interpolation)."</span>, <span class="stringliteral">"near"</span>);</div>
 <div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  description_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"description"</span>, <span class="stringliteral">"Set image description"</span>);</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a>  verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0,2);</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span> </div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   extent_opt.setHide(1);</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   cut_opt.setHide(1);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   bstart_opt.setHide(1);</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   bend_opt.setHide(1);</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   mask_opt.setHide(1);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   msknodata_opt.setHide(1);</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   mskband_opt.setHide(1);</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   option_opt.setHide(1);</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   cx_opt.setHide(1);</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   cy_opt.setHide(1);</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   nx_opt.setHide(1);</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   ny_opt.setHide(1);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   ns_opt.setHide(1);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   nl_opt.setHide(1);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   scale_opt.setHide(1);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   offset_opt.setHide(1);</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   nodata_opt.setHide(1);</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   description_opt.setHide(1);</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   </div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     projection_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     ulx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     uly_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     lrx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     lry_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     bstart_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     bend_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     autoscale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     otype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     dx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     dy_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     resample_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     extent_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     cut_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     mask_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     msknodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     mskband_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     cx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     cy_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     nx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     ny_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     ns_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     nl_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     scale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     offset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     description_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   }</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     exit(0);</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   }</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     cout << setprecision(12) << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span> </div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     cout << endl;</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     cout << <span class="stringliteral">"Usage: pkcrop -i input -o output"</span> << endl;</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a>  align_opt(<span class="stringliteral">"align"</span>, <span class="stringliteral">"align"</span>, <span class="stringliteral">"Align output bounding box to input image"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a>  verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0,2);</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span> </div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   extent_opt.setHide(1);</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   cut_opt.setHide(1);</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   bstart_opt.setHide(1);</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   bend_opt.setHide(1);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   mask_opt.setHide(1);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   msknodata_opt.setHide(1);</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   mskband_opt.setHide(1);</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   cx_opt.setHide(1);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   cy_opt.setHide(1);</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   nx_opt.setHide(1);</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   ny_opt.setHide(1);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   ns_opt.setHide(1);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   nl_opt.setHide(1);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   scale_opt.setHide(1);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   offset_opt.setHide(1);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   nodata_opt.setHide(1);</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   description_opt.setHide(1);</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   </div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     projection_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     ulx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     uly_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     lrx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     lry_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     bstart_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     bend_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     autoscale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     dx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     dy_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     resample_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     extent_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     cut_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     mask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     msknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     mskband_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     cx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     cy_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     nx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     ny_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     ns_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     nl_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     scale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     offset_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     description_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     align_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   }</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     exit(0);</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   }</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     cout << setprecision(12) << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span> </div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   <span class="keywordflow">if</span>(!doProcess){</div>
 <div class="line"><a name="l00205"></a><span class="lineno">  205</span>     cout << endl;</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   }</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     exit(0);</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   }</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     std::cerr << <span class="stringliteral">"No output file provided (use option -o). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     exit(0);</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   }</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span> </div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keywordtype">float</span> nodataValue=nodata_opt.size()? nodata_opt[0] : 0;</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   RESAMPLE theResample;</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"near"</span>){</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     theResample=NEAR;</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       cout << <span class="stringliteral">"resampling: nearest neighbor"</span> << endl;</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   }</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"bilinear"</span>){</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     theResample=BILINEAR;</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       cout << <span class="stringliteral">"resampling: bilinear interpolation"</span> << endl;</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   }</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     std::cout << <span class="stringliteral">"Error: resampling method "</span> << resample_opt[0] << <span class="stringliteral">" not supported"</span> << std::endl;</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     exit(1);</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   }</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span> </div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader;</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriter;</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <span class="comment">//open input images to extract number of bands and spatial resolution</span></div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <span class="keywordtype">int</span> ncropband=0;<span class="comment">//total number of bands to write</span></div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="keywordtype">double</span> dx=0;</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordtype">double</span> dy=0;</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="keywordflow">if</span>(dx_opt.size())</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     dx=dx_opt[0];</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="keywordflow">if</span>(dy_opt.size())</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     dy=dy_opt[0];</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span> </div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>       }</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>       band_opt.clear();</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     }</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>       band_opt.push_back(iband);</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>       }</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     }</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   }</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     cerr << error << std::endl;</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     exit(1);</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   }</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span> </div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="keywordtype">bool</span> isGeoRef=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordtype">string</span> projectionString;</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iimg=0;iimg<input_opt.size();++iimg){</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     imgReader.open(input_opt[iimg]);</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     <span class="keywordflow">if</span>(!isGeoRef)</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>       isGeoRef=imgReader.isGeoRef();</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     <span class="keywordflow">if</span>(imgReader.isGeoRef()&&projection_opt.empty())</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>       projectionString=imgReader.getProjection();</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordflow">if</span>(dx_opt.empty()){</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       <span class="keywordflow">if</span>(!iimg||imgReader.getDeltaX()<dx)</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>         dx=imgReader.getDeltaX();</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     }</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     <span class="keywordflow">if</span>(dy_opt.empty()){</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>       <span class="keywordflow">if</span>(!iimg||imgReader.getDeltaY()<dy)</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>         dy=imgReader.getDeltaY();</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     }</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>       ncropband+=band_opt.size();</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>       ncropband+=imgReader.nrOfBand();</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     imgReader.close();</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   }</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span> </div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   GDALDataType theType=GDT_Unknown;</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>                  otype_opt[0].c_str()))</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       theType=(GDALDataType) iType;</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   }</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     cout << endl;</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>       cout << <span class="stringliteral">"Unknown output pixel type: "</span> << otype_opt[0] << endl;</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       cout << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   }</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="comment">//bounding box of cropped image</span></div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   <span class="keywordtype">double</span> cropulx=ulx_opt[0];</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   <span class="keywordtype">double</span> cropuly=uly_opt[0];</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <span class="keywordtype">double</span> croplrx=lrx_opt[0];</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordtype">double</span> croplry=lry_opt[0];</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="comment">//get bounding box from extentReader if defined</span></div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span> </div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <span class="keywordflow">if</span>(extent_opt.size()){</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordtype">double</span> e_ulx;</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordtype">double</span> e_uly;</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordtype">double</span> e_lrx;</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="keywordtype">double</span> e_lry;</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iextent=0;iextent<extent_opt.size();++iextent){</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       extentReader.open(extent_opt[iextent]);</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(e_ulx,e_uly,e_lrx,e_lry))){</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>         cerr << <span class="stringliteral">"Error: could not get extent from "</span> << extent_opt[0] << endl;</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>         exit(1);</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>       }</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       <span class="keywordflow">if</span>(!iextent){</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     ulx_opt[0]=e_ulx;</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     uly_opt[0]=e_uly;</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     lrx_opt[0]=e_lrx;</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     lry_opt[0]=e_lry;</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       }</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     <span class="keywordflow">if</span>(e_ulx<ulx_opt[0])</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       ulx_opt[0]=e_ulx;</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     <span class="keywordflow">if</span>(e_uly>uly_opt[0])</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       uly_opt[0]=e_uly;</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     <span class="keywordflow">if</span>(e_lrx>lrx_opt[0])</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       lrx_opt[0]=e_lrx;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     <span class="keywordflow">if</span>(e_lry<lry_opt[0])</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       lry_opt[0]=e_lry;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       }</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       extentReader.close();</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     }</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     <span class="keywordflow">if</span>(cut_opt.size())</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       extentReader.open(extent_opt[0]);</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   }</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(cx_opt.size()&&cy_opt.size()&&nx_opt.size()&&ny_opt.size()){</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     ulx_opt[0]=cx_opt[0]-nx_opt[0]/2.0;</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     uly_opt[0]=(isGeoRef) ? cy_opt[0]+ny_opt[0]/2.0 : cy_opt[0]-ny_opt[0]/2.0;</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     lrx_opt[0]=cx_opt[0]+nx_opt[0]/2.0;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     lry_opt[0]=(isGeoRef) ? cy_opt[0]-ny_opt[0]/2.0 : cy_opt[0]+ny_opt[0]/2.0;</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     <span class="comment">// if(cropulx<ulx_opt[0])</span></div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     <span class="comment">//   cropulx=ulx_opt[0];</span></div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="comment">// if(cropuly>uly_opt[0])</span></div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     <span class="comment">//   cropuly=uly_opt[0];</span></div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="comment">// if(croplrx>lrx_opt[0])</span></div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="comment">//   croplrx=lrx_opt[0];</span></div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="comment">// if(croplry<lry_opt[0])</span></div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     <span class="comment">//   croplry=lry_opt[0];</span></div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   }</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(cx_opt.size()&&cy_opt.size()&&ns_opt.size()&&nl_opt.size()){</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     ulx_opt[0]=cx_opt[0]-ns_opt[0]*dx/2.0;</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     uly_opt[0]=(isGeoRef) ? cy_opt[0]+nl_opt[0]*dy/2.0 : cy_opt[0]-nl_opt[0]*dy/2.0;</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     lrx_opt[0]=cx_opt[0]+ns_opt[0]*dx/2.0;</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     lry_opt[0]=(isGeoRef) ? cy_opt[0]-nl_opt[0]*dy/2.0 : cy_opt[0]+nl_opt[0]*dy/2.0;</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     <span class="comment">// if(cropulx<ulx_opt[0])</span></div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     <span class="comment">//   cropulx=ulx_opt[0];</span></div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="comment">// if(cropuly>uly_opt[0])</span></div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     <span class="comment">//   cropuly=uly_opt[0];</span></div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="comment">// if(croplrx>lrx_opt[0])</span></div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     <span class="comment">//   croplrx=lrx_opt[0];</span></div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="comment">// if(croplry<lry_opt[0])</span></div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     <span class="comment">//   croplry=lry_opt[0];</span></div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   }</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span> </div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     cout << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span> </div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   <span class="keywordtype">int</span> ncropcol=0;</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   <span class="keywordtype">int</span> ncroprow=0;</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span> </div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt[0]){</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       ncropcol=abs(static_cast<int>(ceil((lrx_opt[0]-ulx_opt[0])/dx)));</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       ncroprow=abs(static_cast<int>(ceil((uly_opt[0]-lry_opt[0])/dy)));</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncropcol,ncroprow,1,GDT_Float32,<span class="stringliteral">"GTiff"</span>,option_opt);</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       gt[0]=ulx_opt[0];</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       gt[1]=dx;</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       gt[2]=0;</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       gt[3]=uly_opt[0];</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       gt[4]=0;</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       gt[5]=-dy;</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       maskWriter.setGeoTransform(gt);</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       <span class="keywordflow">if</span>(projection_opt.size())</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     maskWriter.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(projectionString.size())</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     maskWriter.setProjection(projectionString);</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     </div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="comment">//todo: handle multiple extent options</span></div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       maskWriter.rasterizeOgr(extentReader,burnValues);</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       maskWriter.close();</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     }</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       cerr << error << std::endl;</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       exit(2);</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     }</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       exit(1);</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     }</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     <span class="comment">//todo: support multiple masks</span></div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     mask_opt.clear();</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>   }</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>     std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       maskReader.open(mask_opt[0]);</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       <span class="keywordflow">if</span>(mskband_opt[0]>=maskReader.nrOfBand()){</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Error: illegal mask band"</span>;</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       }</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     }</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       cerr << error << std::endl;</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       exit(2);</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     }</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       exit(1);</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     }</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>   }</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span> </div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>   <span class="comment">//determine number of output bands</span></div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>   <span class="keywordtype">int</span> writeBand=0;<span class="comment">//write band</span></div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span> </div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   <span class="keywordflow">if</span>(scale_opt.size()){</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     <span class="keywordflow">while</span>(scale_opt.size()<band_opt.size())</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       scale_opt.push_back(scale_opt[0]);</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>   }</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>   <span class="keywordflow">if</span>(offset_opt.size()){</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     <span class="keywordflow">while</span>(offset_opt.size()<band_opt.size())</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       offset_opt.push_back(offset_opt[0]);</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>   }</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>   <span class="keywordflow">if</span>(autoscale_opt.size()){</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>     assert(autoscale_opt.size()%2==0);</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     <span class="comment">// while(autoscale_opt.size()<band_opt.size()*2){</span></div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     <span class="comment">//   autoscale_opt.push_back(autoscale_opt[0]);</span></div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     <span class="comment">//   autoscale_opt.push_back(autoscale_opt[1]);</span></div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     <span class="comment">// }</span></div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>   }</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span> </div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iimg=0;iimg<input_opt.size();++iimg){</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       cout << <span class="stringliteral">"opening image "</span> << input_opt[iimg] << endl;</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>     imgReader.open(input_opt[iimg]);</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     <span class="comment">//if output type not set, get type from input image</span></div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown){</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       theType=imgReader.getDataType();</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>         cout << <span class="stringliteral">"Using data type from input image: "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     }</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       theInterleave+=imgReader.getInterleave();</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     }</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     <span class="keywordtype">int</span> nrow=imgReader.nrOfRow();</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     <span class="keywordtype">int</span> ncol=imgReader.nrOfCol();</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     <span class="comment">// if(!dx||!dy){</span></div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     <span class="comment">//   dx=imgReader.getDeltaX();</span></div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     <span class="comment">//   dy=imgReader.getDeltaY();</span></div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     <span class="comment">// }</span></div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       cout << <span class="stringliteral">"size of "</span> << input_opt[iimg] << <span class="stringliteral">": "</span> << ncol << <span class="stringliteral">" cols, "</span><< nrow << <span class="stringliteral">" rows"</span> << endl;</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     <span class="keywordtype">double</span> uli,ulj,lri,lrj;<span class="comment">//image coordinates</span></div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="keywordtype">bool</span> forceEUgrid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     <span class="keywordflow">if</span>(projection_opt.size())</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       forceEUgrid=(!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||projection_opt[0].find(<span class="stringliteral">"ETRS-LAEA"</span>)!=string::npos);</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     <span class="keywordflow">if</span>(ulx_opt[0]>=lrx_opt[0]){<span class="comment">//default bounding box: no cropping</span></div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       uli=0;</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       lri=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       ulj=0;</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       lrj=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       ncropcol=imgReader.nrOfCol();</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       ncroprow=imgReader.nrOfRow();</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       imgReader.getBoundingBox(cropulx,cropuly,croplrx,croplry);</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       <span class="keywordtype">double</span> magicX=1,magicY=1;</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       <span class="comment">// imgReader.getMagicPixel(magicX,magicY);</span></div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       <span class="keywordflow">if</span>(forceEUgrid){</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     <span class="comment">//force to LAEA grid</span></div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     <a class="code" href="classEgcs.html">Egcs</a> egcs;</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>         egcs.setLevel(egcs.res2level(dx));</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>     egcs.force2grid(cropulx,cropuly,croplrx,croplry);</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       }</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       <span class="comment">//test</span></div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       ncropcol=abs(static_cast<int>(ceil((croplrx-cropulx)/dx)));</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       ncroprow=abs(static_cast<int>(ceil((cropuly-croplry)/dy)));</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     }</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       <span class="keywordtype">double</span> magicX=1,magicY=1;</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       <span class="comment">// imgReader.getMagicPixel(magicX,magicY);</span></div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       cropulx=ulx_opt[0];</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>       cropuly=uly_opt[0];</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       croplrx=lrx_opt[0];</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       croplry=lry_opt[0];</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       <span class="keywordflow">if</span>(forceEUgrid){</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     <span class="comment">//force to LAEA grid</span></div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     <a class="code" href="classEgcs.html">Egcs</a> egcs;</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>         egcs.setLevel(egcs.res2level(dx));</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     egcs.force2grid(cropulx,cropuly,croplrx,croplry);</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     cout << <span class="stringliteral">"Usage: pkcrop -i input -o output"</span> << endl;</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     cout << endl;</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   }</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     exit(0);</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   }</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     std::cerr << <span class="stringliteral">"No output file provided (use option -o). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     exit(0);</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   }</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span> </div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="keywordtype">float</span> nodataValue=nodata_opt.size()? nodata_opt[0] : 0;</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   RESAMPLE theResample;</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"near"</span>){</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     theResample=NEAR;</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>       cout << <span class="stringliteral">"resampling: nearest neighbor"</span> << endl;</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   }</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"bilinear"</span>){</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     theResample=BILINEAR;</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>       cout << <span class="stringliteral">"resampling: bilinear interpolation"</span> << endl;</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   }</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     std::cout << <span class="stringliteral">"Error: resampling method "</span> << resample_opt[0] << <span class="stringliteral">" not supported"</span> << std::endl;</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     exit(1);</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   }</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span> </div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader;</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriter;</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="comment">//open input images to extract number of bands and spatial resolution</span></div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordtype">int</span> ncropband=0;<span class="comment">//total number of bands to write</span></div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="keywordtype">double</span> dx=0;</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <span class="keywordtype">double</span> dy=0;</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="keywordflow">if</span>(dx_opt.size())</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     dx=dx_opt[0];</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   <span class="keywordflow">if</span>(dy_opt.size())</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     dy=dy_opt[0];</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span> </div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       }</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>       band_opt.clear();</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     }</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>       band_opt.push_back(iband);</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>       }</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     }</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   }</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     exit(1);</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   }</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span> </div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordtype">bool</span> isGeoRef=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="keywordtype">string</span> projectionString;</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iimg=0;iimg<input_opt.size();++iimg){</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     imgReader.open(input_opt[iimg]);</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     <span class="keywordflow">if</span>(!isGeoRef)</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>       isGeoRef=imgReader.isGeoRef();</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordflow">if</span>(imgReader.isGeoRef()&&projection_opt.empty())</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       projectionString=imgReader.getProjection();</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     <span class="keywordflow">if</span>(dx_opt.empty()){</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       <span class="keywordflow">if</span>(!iimg||imgReader.getDeltaX()<dx)</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>         dx=imgReader.getDeltaX();</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     }</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     <span class="keywordflow">if</span>(dy_opt.empty()){</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       <span class="keywordflow">if</span>(!iimg||imgReader.getDeltaY()<dy)</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>         dy=imgReader.getDeltaY();</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     }</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>       ncropband+=band_opt.size();</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>       ncropband+=imgReader.nrOfBand();</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     imgReader.close();</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   }</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span> </div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   GDALDataType theType=GDT_Unknown;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>                  otype_opt[0].c_str()))</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       theType=(GDALDataType) iType;</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   }</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     cout << endl;</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       cout << <span class="stringliteral">"Unknown output pixel type: "</span> << otype_opt[0] << endl;</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       cout << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   }</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   <span class="comment">//bounding box of cropped image</span></div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <span class="keywordtype">double</span> cropulx=ulx_opt[0];</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordtype">double</span> cropuly=uly_opt[0];</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="keywordtype">double</span> croplrx=lrx_opt[0];</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordtype">double</span> croplry=lry_opt[0];</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="comment">//get bounding box from extentReader if defined</span></div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span> </div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>   <span class="keywordflow">if</span>(extent_opt.size()){</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordtype">double</span> e_ulx;</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="keywordtype">double</span> e_uly;</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordtype">double</span> e_lrx;</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     <span class="keywordtype">double</span> e_lry;</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iextent=0;iextent<extent_opt.size();++iextent){</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       extentReader.open(extent_opt[iextent]);</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(e_ulx,e_uly,e_lrx,e_lry))){</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>         cerr << <span class="stringliteral">"Error: could not get extent from "</span> << extent_opt[0] << endl;</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>         exit(1);</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       }</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>       <span class="keywordflow">if</span>(!iextent){</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     ulx_opt[0]=e_ulx;</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     uly_opt[0]=e_uly;</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     lrx_opt[0]=e_lrx;</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     lry_opt[0]=e_lry;</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       }</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     <span class="keywordflow">if</span>(e_ulx<ulx_opt[0])</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       ulx_opt[0]=e_ulx;</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     <span class="keywordflow">if</span>(e_uly>uly_opt[0])</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       uly_opt[0]=e_uly;</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     <span class="keywordflow">if</span>(e_lrx>lrx_opt[0])</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       lrx_opt[0]=e_lrx;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     <span class="keywordflow">if</span>(e_lry<lry_opt[0])</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       lry_opt[0]=e_lry;</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       }</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       extentReader.close();</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     }</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>     <span class="keywordflow">if</span>(cut_opt.size())</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       extentReader.open(extent_opt[0]);</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   }</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(cx_opt.size()&&cy_opt.size()&&nx_opt.size()&&ny_opt.size()){</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     ulx_opt[0]=cx_opt[0]-nx_opt[0]/2.0;</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     uly_opt[0]=(isGeoRef) ? cy_opt[0]+ny_opt[0]/2.0 : cy_opt[0]-ny_opt[0]/2.0;</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     lrx_opt[0]=cx_opt[0]+nx_opt[0]/2.0;</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     lry_opt[0]=(isGeoRef) ? cy_opt[0]-ny_opt[0]/2.0 : cy_opt[0]+ny_opt[0]/2.0;</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="comment">// if(cropulx<ulx_opt[0])</span></div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     <span class="comment">//   cropulx=ulx_opt[0];</span></div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="comment">// if(cropuly>uly_opt[0])</span></div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="comment">//   cropuly=uly_opt[0];</span></div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="comment">// if(croplrx>lrx_opt[0])</span></div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     <span class="comment">//   croplrx=lrx_opt[0];</span></div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     <span class="comment">// if(croplry<lry_opt[0])</span></div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="comment">//   croplry=lry_opt[0];</span></div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   }</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(cx_opt.size()&&cy_opt.size()&&ns_opt.size()&&nl_opt.size()){</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     ulx_opt[0]=cx_opt[0]-ns_opt[0]*dx/2.0;</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     uly_opt[0]=(isGeoRef) ? cy_opt[0]+nl_opt[0]*dy/2.0 : cy_opt[0]-nl_opt[0]*dy/2.0;</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     lrx_opt[0]=cx_opt[0]+ns_opt[0]*dx/2.0;</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     lry_opt[0]=(isGeoRef) ? cy_opt[0]-nl_opt[0]*dy/2.0 : cy_opt[0]+nl_opt[0]*dy/2.0;</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="comment">// if(cropulx<ulx_opt[0])</span></div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     <span class="comment">//   cropulx=ulx_opt[0];</span></div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="comment">// if(cropuly>uly_opt[0])</span></div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     <span class="comment">//   cropuly=uly_opt[0];</span></div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="comment">// if(croplrx>lrx_opt[0])</span></div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     <span class="comment">//   croplrx=lrx_opt[0];</span></div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="comment">// if(croplry<lry_opt[0])</span></div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     <span class="comment">//   croplry=lry_opt[0];</span></div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   }</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span> </div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     cout << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span> </div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>   <span class="keywordtype">int</span> ncropcol=0;</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   <span class="keywordtype">int</span> ncroprow=0;</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span> </div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt[0]){</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       ncropcol=abs(static_cast<int>(ceil((lrx_opt[0]-ulx_opt[0])/dx)));</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       ncroprow=abs(static_cast<int>(ceil((uly_opt[0]-lry_opt[0])/dy)));</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncropcol,ncroprow,1,GDT_Float32,<span class="stringliteral">"GTiff"</span>,option_opt);</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       gt[0]=ulx_opt[0];</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       gt[1]=dx;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       gt[2]=0;</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       gt[3]=uly_opt[0];</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       gt[4]=0;</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       gt[5]=-dy;</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       maskWriter.setGeoTransform(gt);</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">if</span>(projection_opt.size())</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     maskWriter.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(projectionString.size())</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     maskWriter.setProjection(projectionString);</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>     </div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       <span class="comment">//todo: handle multiple extent options</span></div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       maskWriter.rasterizeOgr(extentReader,burnValues);</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       maskWriter.close();</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     }</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       exit(2);</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     }</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>       exit(1);</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     }</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     <span class="comment">//todo: support multiple masks</span></div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     mask_opt.clear();</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>   }</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>     std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>       maskReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       <span class="keywordflow">if</span>(mskband_opt[0]>=maskReader.nrOfBand()){</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>     <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Error: illegal mask band"</span>;</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>       }</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>     }</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       exit(2);</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     }</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       exit(1);</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     }</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>   }</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span> </div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>   <span class="comment">//determine number of output bands</span></div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   <span class="keywordtype">int</span> writeBand=0;<span class="comment">//write band</span></div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span> </div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>   <span class="keywordflow">if</span>(scale_opt.size()){</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     <span class="keywordflow">while</span>(scale_opt.size()<band_opt.size())</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       scale_opt.push_back(scale_opt[0]);</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>   }</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>   <span class="keywordflow">if</span>(offset_opt.size()){</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     <span class="keywordflow">while</span>(offset_opt.size()<band_opt.size())</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       offset_opt.push_back(offset_opt[0]);</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>   }</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>   <span class="keywordflow">if</span>(autoscale_opt.size()){</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     assert(autoscale_opt.size()%2==0);</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     <span class="comment">// while(autoscale_opt.size()<band_opt.size()*2){</span></div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     <span class="comment">//   autoscale_opt.push_back(autoscale_opt[0]);</span></div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     <span class="comment">//   autoscale_opt.push_back(autoscale_opt[1]);</span></div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>   }</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span> </div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iimg=0;iimg<input_opt.size();++iimg){</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       cout << <span class="stringliteral">"opening image "</span> << input_opt[iimg] << endl;</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     imgReader.open(input_opt[iimg]);</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>     <span class="comment">//if output type not set, get type from input image</span></div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown){</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       theType=imgReader.getDataType();</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         cout << <span class="stringliteral">"Using data type from input image: "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     }</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       theInterleave+=imgReader.getInterleave();</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     }</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     <span class="keywordtype">int</span> nrow=imgReader.nrOfRow();</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     <span class="keywordtype">int</span> ncol=imgReader.nrOfCol();</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     <span class="comment">// if(!dx||!dy){</span></div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     <span class="comment">//   dx=imgReader.getDeltaX();</span></div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     <span class="comment">//   dy=imgReader.getDeltaY();</span></div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>       cout << <span class="stringliteral">"size of "</span> << input_opt[iimg] << <span class="stringliteral">": "</span> << ncol << <span class="stringliteral">" cols, "</span><< nrow << <span class="stringliteral">" rows"</span> << endl;</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     <span class="keywordtype">double</span> uli,ulj,lri,lrj;<span class="comment">//image coordinates</span></div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     <span class="keywordtype">bool</span> forceEUgrid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     <span class="keywordflow">if</span>(projection_opt.size())</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       forceEUgrid=(!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||projection_opt[0].find(<span class="stringliteral">"ETRS-LAEA"</span>)!=string::npos);</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     <span class="keywordflow">if</span>(ulx_opt[0]>=lrx_opt[0]){<span class="comment">//default bounding box: no cropping</span></div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       uli=0;</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       lri=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       ulj=0;</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       lrj=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       ncropcol=imgReader.nrOfCol();</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       ncroprow=imgReader.nrOfRow();</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       imgReader.getBoundingBox(cropulx,cropuly,croplrx,croplry);</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       <span class="keywordtype">double</span> magicX=1,magicY=1;</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>       <span class="comment">// imgReader.getMagicPixel(magicX,magicY);</span></div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>       <span class="keywordflow">if</span>(forceEUgrid){</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>     <span class="comment">//force to LAEA grid</span></div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>     <a class="code" href="classEgcs.html">Egcs</a> egcs;</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>         egcs.setLevel(egcs.res2level(dx));</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     egcs.force2grid(cropulx,cropuly,croplrx,croplry);</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>     imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>     imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       }</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       ncropcol=abs(static_cast<int>(ceil((croplrx-cropulx)/dx)));</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       ncroprow=abs(static_cast<int>(ceil((cropuly-croplry)/dy)));</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>     }</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       <span class="keywordtype">double</span> magicX=1,magicY=1;</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>       <span class="comment">// imgReader.getMagicPixel(magicX,magicY);</span></div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       cropulx=ulx_opt[0];</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       cropuly=uly_opt[0];</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       croplrx=lrx_opt[0];</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       croplry=lry_opt[0];</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       <span class="keywordflow">if</span>(forceEUgrid){</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     <span class="comment">//force to LAEA grid</span></div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     <a class="code" href="classEgcs.html">Egcs</a> egcs;</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>         egcs.setLevel(egcs.res2level(dx));</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     egcs.force2grid(cropulx,cropuly,croplrx,croplry);</div>
 <div class="line"><a name="l00531"></a><span class="lineno">  531</span>       }</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span> </div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       ncropcol=abs(static_cast<int>(ceil((croplrx-cropulx)/dx)));</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       ncroprow=abs(static_cast<int>(ceil((cropuly-croplry)/dy)));</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       uli=floor(uli);</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       ulj=floor(ulj);</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       lri=floor(lri);</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       lrj=floor(lrj);</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     }</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span> </div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordtype">double</span> dcropcol=0;</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     <span class="keywordtype">double</span> dcroprow=0;</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="keywordtype">double</span> deltaX=imgReader.getDeltaX();</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     <span class="keywordtype">double</span> deltaY=imgReader.getDeltaY();</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     dcropcol=(lri-uli+1)/(dx/deltaX);</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     dcroprow=(lrj-ulj+1)/(dy/deltaY);</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     <span class="keywordflow">if</span>(!imgWriter.nrOfBand()){<span class="comment">//not opened yet</span></div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     cout << <span class="stringliteral">"cropulx: "</span> << cropulx << endl;</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     cout << <span class="stringliteral">"cropuly: "</span> << cropuly << endl;</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     cout << <span class="stringliteral">"croplrx: "</span> << croplrx << endl;</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     cout << <span class="stringliteral">"croplry: "</span> << croplry << endl;</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     cout << <span class="stringliteral">"ncropcol: "</span> << ncropcol << endl;</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     cout << <span class="stringliteral">"ncroprow: "</span> << ncroprow << endl;</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     cout << <span class="stringliteral">"cropulx+ncropcol*dx: "</span> << cropulx+ncropcol*dx << endl;</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     cout << <span class="stringliteral">"cropuly-ncroprow*dy: "</span> << cropuly-ncroprow*dy << endl;</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     cout << <span class="stringliteral">"upper left column of input image: "</span> << uli << endl;</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     cout << <span class="stringliteral">"upper left row of input image: "</span> << ulj << endl;</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     cout << <span class="stringliteral">"lower right column of input image: "</span> << lri << endl;</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     cout << <span class="stringliteral">"lower right row of input image: "</span> << lrj << endl;</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     cout << <span class="stringliteral">"new number of cols: "</span> << ncropcol << endl;</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     cout << <span class="stringliteral">"new number of rows: "</span> << ncroprow << endl;</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     cout << <span class="stringliteral">"new number of bands: "</span> << ncropband << endl;</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       }</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       <span class="comment">// string theCompression;</span></div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       <span class="comment">// if(compress_opt[0]!="")//default</span></div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="comment">//   theCompression=compress_opt[0];</span></div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       <span class="comment">// else</span></div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       <span class="comment">//   theCompression=imgReader.getCompression();</span></div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       <span class="comment">// string theInterleave;</span></div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="comment">// if(interleave_opt[0]!="")//default</span></div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       <span class="comment">//   theInterleave=interleave_opt[0];</span></div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       <span class="comment">// else</span></div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       <span class="comment">//   theInterleave=imgReader.getInterleave();</span></div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       <span class="keywordtype">string</span> imageType=imgReader.getImageType();</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>         imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>         imgWriter.open(output_opt[0],ncropcol,ncroprow,ncropband,theType,imageType,option_opt);</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="keywordflow">if</span>(nodata_opt.size()){</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<ncropband;++iband)</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>         imgWriter.GDALSetNoDataValue(nodata_opt[0],iband);</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     }</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       }</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>         cout << errorstring << endl;</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         exit(4);</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       }</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">if</span>(description_opt.size())</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     imgWriter.setImageDescription(description_opt[0]);</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       gt[0]=cropulx;</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       gt[1]=dx;</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       gt[2]=0;</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       gt[3]=cropuly;</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       gt[4]=0;</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       gt[5]=(imgReader.isGeoRef())? -dy : dy;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       imgWriter.setGeoTransform(gt);</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordflow">if</span>(projection_opt.size()){</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       cout << <span class="stringliteral">"projection: "</span> << projection_opt[0] << endl;</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     imgWriter.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       }</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     imgWriter.setProjection(imgReader.getProjection());</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="keywordflow">if</span>(imgWriter.getDataType()==GDT_Byte){</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>         imgWriter.setColorTable(colorTable_opt[0]);</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     }</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (imgReader.getColorTable()!=NULL)<span class="comment">//copy colorTable from input image</span></div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       imgWriter.setColorTable(imgReader.getColorTable());</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       }</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     }</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span> </div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordtype">double</span> startCol=uli;</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     <span class="keywordtype">double</span> endCol=lri;</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordflow">if</span>(uli<0)</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       startCol=0;</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       startCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     <span class="keywordflow">if</span>(lri<0)</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       endCol=0;</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       endCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     <span class="keywordtype">double</span> startRow=ulj;</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     <span class="keywordtype">double</span> endRow=lrj;</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="keywordflow">if</span>(ulj<0)</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       startRow=0;</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       startRow=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     <span class="keywordflow">if</span>(lrj<0)</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       endRow=0;</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       endRow=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span> </div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span> </div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span> </div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     <span class="keywordtype">int</span> readncol=endCol-startCol+1;</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     vector<double> readBuffer(readncol+1);</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>     <span class="keywordtype">int</span> nband=(band_opt.size())?band_opt.size() : imgReader.nrOfBand();</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       <span class="keywordtype">int</span> readBand=(band_opt.size()>iband)?band_opt[iband]:iband;</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     cout << <span class="stringliteral">"extracting band "</span> << readBand << endl;</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       }</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       <span class="keywordtype">double</span> theMin=0;</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       <span class="keywordtype">double</span> theMax=0;</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       <span class="keywordflow">if</span>(autoscale_opt.size()){</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       imgReader.getMinMax(static_cast<int>(startCol),static_cast<int>(endCol),static_cast<int>(startRow),static_cast<int>(endRow),readBand,theMin,theMax);</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     }</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       cout << errorString << endl;</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     }</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       cout << <span class="stringliteral">"minmax: "</span> << theMin << <span class="stringliteral">", "</span> << theMax << endl;</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <span class="keywordtype">double</span> theScale=(autoscale_opt[1]-autoscale_opt[0])/(theMax-theMin);</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     <span class="keywordtype">double</span> theOffset=autoscale_opt[0]-theScale*theMin;</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     imgReader.setScale(theScale,readBand);</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     imgReader.setOffset(theOffset,readBand);</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       } </div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     <span class="keywordflow">if</span>(scale_opt.size()){</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       <span class="keywordflow">if</span>(scale_opt.size()>iband)</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>         imgReader.setScale(scale_opt[iband],readBand);</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>         imgReader.setScale(scale_opt[0],readBand);</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     }</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     <span class="keywordflow">if</span>(offset_opt.size()){</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       <span class="keywordflow">if</span>(offset_opt.size()>iband)</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>         imgReader.setOffset(offset_opt[iband],readBand);</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         imgReader.setOffset(offset_opt[0],readBand);</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     }</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>       }</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span> </div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       <span class="keywordtype">double</span> readRow=0;</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>       <span class="keywordtype">double</span> readCol=0;</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       <span class="keywordtype">double</span> lowerCol=0;</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       <span class="keywordtype">double</span> upperCol=0;</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriter.nrOfRow();++irow){</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     vector<float> lineMask;</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     <span class="keywordtype">double</span> x=0;</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     <span class="keywordtype">double</span> y=0;</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     <span class="comment">//convert irow to geo</span></div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     imgWriter.image2geo(0,irow,x,y);</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     <span class="comment">//lookup corresponding row for irow in this file</span></div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     imgReader.geo2image(x,y,readCol,readRow);</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     vector<double> writeBuffer;</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     <span class="keywordflow">if</span>(readRow<0||readRow>=imgReader.nrOfRow()){</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       <span class="comment">//if(readRow<0)</span></div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       <span class="comment">//readRow=0;</span></div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       <span class="comment">//else if(readRow>=imgReader.nrOfRow())</span></div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       <span class="comment">//readRow=imgReader.nrOfRow()-1;</span></div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol)</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>         writeBuffer.push_back(nodataValue);</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>     }</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>         cout << <span class="stringliteral">"reading row: "</span> << readRow << endl;</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>             <span class="keywordflow">if</span>(endCol<imgReader.nrOfCol()-1)</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>               imgReader.readData(readBuffer,GDT_Float64,startCol,endCol+1,readRow,readBand,theResample);</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>               imgReader.readData(readBuffer,GDT_Float64,startCol,endCol,readRow,readBand,theResample);</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>         <span class="comment">// for(int icol=0;icol<ncropcol;++icol){</span></div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>         <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>           imgWriter.image2geo(icol,irow,x,y);</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>           <span class="comment">//lookup corresponding row for irow in this file</span></div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>           imgReader.geo2image(x,y,readCol,readRow);</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>           <span class="keywordflow">if</span>(readCol<0||readCol>=imgReader.nrOfCol()){</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>           <span class="comment">// if(readCol<0||readCol>=imgReader.nrOfCol()){</span></div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>         <span class="comment">//               if(readCol<0)</span></div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>         <span class="comment">//                 readCol=0;</span></div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>         <span class="comment">//               else if(readCol>=imgReader.nrOfCol())</span></div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>         <span class="comment">//                 readCol=imgReader.nrOfCol()-1;</span></div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>         writeBuffer.push_back(nodataValue);</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>           }</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>                 <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>         <span class="keywordtype">double</span> geox=0;</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>         <span class="keywordtype">double</span> geoy=0;</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>                 <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>           <span class="comment">//read mask</span></div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>           <span class="keywordtype">double</span> colMask=0;</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>           <span class="keywordtype">double</span> rowMask=0;</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span> </div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>           imgWriter.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>           maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>           colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>           rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>           <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>             <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span> </div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>               assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>               <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>             maskReader.readData(lineMask,GDT_Float32,static_cast<int>(rowMask),mskband_opt[0]);</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>               }</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>               <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>             cerr << errorstring << endl;</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>             exit(1);</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>               }</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>               <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>             cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>             exit(3);</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>               }</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>               oldRowMask=rowMask;</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>             }</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>             <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[0])</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>               valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>           }</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>         }</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span> </div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>                 <span class="keywordflow">if</span>(!valid)</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>                   writeBuffer.push_back(nodataValue);</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>                 <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>                   <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>                   <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>                     lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>                     lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>                     upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>                     upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>                     <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>                       lowerCol=0;</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>                     <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>                       upperCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>                     <span class="comment">// writeBuffer.push_back((readCol-0.5-lowerCol)*(readBuffer[upperCol-startCol]*theScale+theOffset)+(1-readCol+0.5+lowerCol)*(readBuffer[lowerCol-startCol]*theScale+theOffset));</span></div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>                     writeBuffer.push_back((readCol-0.5-lowerCol)*readBuffer[upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[lowerCol-startCol]);</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>                     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>                   <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>                     readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>                     readCol-=startCol;<span class="comment">//we only start reading from startCol</span></div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>                     <span class="comment">// writeBuffer.push_back(readBuffer[readCol]*theScale+theOffset);</span></div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>                     writeBuffer.push_back(readBuffer[readCol]);</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>                     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>           }</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>         }</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>           }</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>         }</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       }</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>         cout << errorstring << endl;</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>         exit(2);</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       }</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     }</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     <span class="keywordflow">if</span>(writeBuffer.size()!=imgWriter.nrOfCol())</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       cout << <span class="stringliteral">"writeBuffer.size()="</span> << writeBuffer.size() << <span class="stringliteral">", imgWriter.nrOfCol()="</span> << imgWriter.nrOfCol() << endl;</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     assert(writeBuffer.size()==imgWriter.nrOfCol());</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       imgWriter.writeData(writeBuffer,GDT_Float64,irow,writeBand);</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>     }</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       cout << errorstring << endl;</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       exit(3);</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>     }</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       progress=(1.0+irow);</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>       progress/=imgWriter.nrOfRow();</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     }</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       progress=(1.0+irow);</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       progress+=(imgWriter.nrOfRow()*writeBand);</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       progress/=imgWriter.nrOfBand()*imgWriter.nrOfRow();</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       assert(progress>=0);</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       assert(progress<=1);</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     }</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>       }</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       ++writeBand;</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>     }</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     imgReader.close();</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>   }</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt.size()){</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     extentReader.close();</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>   }</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>   <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     maskReader.close();</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>   imgWriter.close();</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(align_opt[0]){</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>         <span class="keywordflow">if</span>(cropulx>imgReader.getUlx())</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>           cropulx-=fmod(cropulx-imgReader.getUlx(),dx);</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(cropulx<imgReader.getUlx())</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>           cropulx+=fmod(imgReader.getUlx()-cropulx,dx)-dx;</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         <span class="keywordflow">if</span>(croplrx<imgReader.getLrx())</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>           croplrx+=fmod(imgReader.getLrx()-croplrx,dx);</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(croplrx>imgReader.getLrx())</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>           croplrx-=fmod(croplrx-imgReader.getLrx(),dx)+dx;</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>         <span class="keywordflow">if</span>(croplry>imgReader.getLry())</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>           croplry-=fmod(croplry-imgReader.getLry(),dy);</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(croplry<imgReader.getLry())</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>           croplry+=fmod(imgReader.getLry()-croplry,dy)-dy;</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>         <span class="keywordflow">if</span>(cropuly<imgReader.getUly())</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>           cropuly+=fmod(imgReader.getUly()-cropuly,dy);</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(cropuly>imgReader.getUly())</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>           cropuly-=fmod(cropuly-imgReader.getUly(),dy)+dy;</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       }</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span> </div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       ncropcol=abs(static_cast<int>(ceil((croplrx-cropulx)/dx)));</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       ncroprow=abs(static_cast<int>(ceil((cropuly-croplry)/dy)));</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       uli=floor(uli);</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       ulj=floor(ulj);</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       lri=floor(lri);</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       lrj=floor(lrj);</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     }</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span> </div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     <span class="keywordtype">double</span> dcropcol=0;</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     <span class="keywordtype">double</span> dcroprow=0;</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     <span class="keywordtype">double</span> deltaX=imgReader.getDeltaX();</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     <span class="keywordtype">double</span> deltaY=imgReader.getDeltaY();</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     dcropcol=(lri-uli+1)/(dx/deltaX);</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     dcroprow=(lrj-ulj+1)/(dy/deltaY);</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     <span class="keywordflow">if</span>(!imgWriter.nrOfBand()){<span class="comment">//not opened yet</span></div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     cout << <span class="stringliteral">"cropulx: "</span> << cropulx << endl;</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     cout << <span class="stringliteral">"cropuly: "</span> << cropuly << endl;</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     cout << <span class="stringliteral">"croplrx: "</span> << croplrx << endl;</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     cout << <span class="stringliteral">"croplry: "</span> << croplry << endl;</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     cout << <span class="stringliteral">"ncropcol: "</span> << ncropcol << endl;</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     cout << <span class="stringliteral">"ncroprow: "</span> << ncroprow << endl;</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     cout << <span class="stringliteral">"cropulx+ncropcol*dx: "</span> << cropulx+ncropcol*dx << endl;</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     cout << <span class="stringliteral">"cropuly-ncroprow*dy: "</span> << cropuly-ncroprow*dy << endl;</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     cout << <span class="stringliteral">"upper left column of input image: "</span> << uli << endl;</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     cout << <span class="stringliteral">"upper left row of input image: "</span> << ulj << endl;</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     cout << <span class="stringliteral">"lower right column of input image: "</span> << lri << endl;</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     cout << <span class="stringliteral">"lower right row of input image: "</span> << lrj << endl;</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     cout << <span class="stringliteral">"new number of cols: "</span> << ncropcol << endl;</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     cout << <span class="stringliteral">"new number of rows: "</span> << ncroprow << endl;</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     cout << <span class="stringliteral">"new number of bands: "</span> << ncropband << endl;</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       }</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       <span class="comment">// string theCompression;</span></div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       <span class="comment">// if(compress_opt[0]!="")//default</span></div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       <span class="comment">//   theCompression=compress_opt[0];</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       <span class="comment">// else</span></div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       <span class="comment">//   theCompression=imgReader.getCompression();</span></div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       <span class="comment">// string theInterleave;</span></div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="comment">// if(interleave_opt[0]!="")//default</span></div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <span class="comment">//   theInterleave=interleave_opt[0];</span></div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="comment">// else</span></div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       <span class="comment">//   theInterleave=imgReader.getInterleave();</span></div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       <span class="keywordtype">string</span> imageType;<span class="comment">//=imgReader.getImageType();</span></div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>         imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>         imgWriter.open(output_opt[0],ncropcol,ncroprow,ncropband,theType,imageType,option_opt);</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="keywordflow">if</span>(nodata_opt.size()){</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<ncropband;++iband)</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         imgWriter.GDALSetNoDataValue(nodata_opt[0],iband);</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     }</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       }</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>         cout << errorstring << endl;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>         exit(4);</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       }</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="keywordflow">if</span>(description_opt.size())</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     imgWriter.setImageDescription(description_opt[0]);</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       gt[0]=cropulx;</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       gt[1]=dx;</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       gt[2]=0;</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       gt[3]=cropuly;</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       gt[4]=0;</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       gt[5]=(imgReader.isGeoRef())? -dy : dy;</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       imgWriter.setGeoTransform(gt);</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <span class="keywordflow">if</span>(projection_opt.size()){</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       cout << <span class="stringliteral">"projection: "</span> << projection_opt[0] << endl;</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     imgWriter.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       }</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     imgWriter.setProjection(imgReader.getProjection());</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       <span class="keywordflow">if</span>(imgWriter.getDataType()==GDT_Byte){</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>     <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>         imgWriter.setColorTable(colorTable_opt[0]);</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     }</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (imgReader.getColorTable()!=NULL)<span class="comment">//copy colorTable from input image</span></div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       imgWriter.setColorTable(imgReader.getColorTable());</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       }</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     }</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span> </div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordtype">double</span> startCol=uli;</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     <span class="keywordtype">double</span> endCol=lri;</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     <span class="keywordflow">if</span>(uli<0)</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       startCol=0;</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       startCol=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     <span class="keywordflow">if</span>(lri<0)</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       endCol=0;</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       endCol=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     <span class="keywordtype">double</span> startRow=ulj;</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="keywordtype">double</span> endRow=lrj;</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     <span class="keywordflow">if</span>(ulj<0)</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       startRow=0;</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       startRow=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     <span class="keywordflow">if</span>(lrj<0)</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       endRow=0;</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       endRow=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span> </div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span> </div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span> </div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     <span class="keywordtype">int</span> readncol=endCol-startCol+1;</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>     vector<double> readBuffer(readncol+1);</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <span class="keywordtype">int</span> nband=(band_opt.size())?band_opt.size() : imgReader.nrOfBand();</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       <span class="keywordtype">int</span> readBand=(band_opt.size()>iband)?band_opt[iband]:iband;</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     cout << <span class="stringliteral">"extracting band "</span> << readBand << endl;</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       }</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       <span class="keywordtype">double</span> theMin=0;</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>       <span class="keywordtype">double</span> theMax=0;</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       <span class="keywordflow">if</span>(autoscale_opt.size()){</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       imgReader.getMinMax(static_cast<int>(startCol),static_cast<int>(endCol),static_cast<int>(startRow),static_cast<int>(endRow),readBand,theMin,theMax);</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     }</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>       cout << errorString << endl;</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     }</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       cout << <span class="stringliteral">"minmax: "</span> << theMin << <span class="stringliteral">", "</span> << theMax << endl;</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     <span class="keywordtype">double</span> theScale=(autoscale_opt[1]-autoscale_opt[0])/(theMax-theMin);</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     <span class="keywordtype">double</span> theOffset=autoscale_opt[0]-theScale*theMin;</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     imgReader.setScale(theScale,readBand);</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     imgReader.setOffset(theOffset,readBand);</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       } </div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     <span class="keywordflow">if</span>(scale_opt.size()){</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       <span class="keywordflow">if</span>(scale_opt.size()>iband)</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>         imgReader.setScale(scale_opt[iband],readBand);</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>         imgReader.setScale(scale_opt[0],readBand);</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     }</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     <span class="keywordflow">if</span>(offset_opt.size()){</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       <span class="keywordflow">if</span>(offset_opt.size()>iband)</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>         imgReader.setOffset(offset_opt[iband],readBand);</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>         imgReader.setOffset(offset_opt[0],readBand);</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     }</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       }</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span> </div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       <span class="keywordtype">double</span> readRow=0;</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       <span class="keywordtype">double</span> readCol=0;</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       <span class="keywordtype">double</span> lowerCol=0;</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>       <span class="keywordtype">double</span> upperCol=0;</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriter.nrOfRow();++irow){</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     vector<float> lineMask;</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="keywordtype">double</span> x=0;</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>     <span class="keywordtype">double</span> y=0;</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     <span class="comment">//convert irow to geo</span></div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     imgWriter.image2geo(0,irow,x,y);</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     <span class="comment">//lookup corresponding row for irow in this file</span></div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     imgReader.geo2image(x,y,readCol,readRow);</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     vector<double> writeBuffer;</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     <span class="keywordflow">if</span>(readRow<0||readRow>=imgReader.nrOfRow()){</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>       <span class="comment">//if(readRow<0)</span></div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       <span class="comment">//readRow=0;</span></div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>       <span class="comment">//else if(readRow>=imgReader.nrOfRow())</span></div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>       <span class="comment">//readRow=imgReader.nrOfRow()-1;</span></div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol)</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>         writeBuffer.push_back(nodataValue);</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     }</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>         cout << <span class="stringliteral">"reading row: "</span> << readRow << endl;</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>             <span class="keywordflow">if</span>(endCol<imgReader.nrOfCol()-1)</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>               imgReader.readData(readBuffer,GDT_Float64,startCol,endCol+1,readRow,readBand,theResample);</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>               imgReader.readData(readBuffer,GDT_Float64,startCol,endCol,readRow,readBand,theResample);</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>         <span class="comment">// for(int icol=0;icol<ncropcol;++icol){</span></div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>         <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>           imgWriter.image2geo(icol,irow,x,y);</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>           <span class="comment">//lookup corresponding row for irow in this file</span></div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>           imgReader.geo2image(x,y,readCol,readRow);</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>           <span class="keywordflow">if</span>(readCol<0||readCol>=imgReader.nrOfCol()){</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>           <span class="comment">// if(readCol<0||readCol>=imgReader.nrOfCol()){</span></div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>         <span class="comment">//               if(readCol<0)</span></div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>         <span class="comment">//                 readCol=0;</span></div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>         <span class="comment">//               else if(readCol>=imgReader.nrOfCol())</span></div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>         <span class="comment">//                 readCol=imgReader.nrOfCol()-1;</span></div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         writeBuffer.push_back(nodataValue);</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>           }</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>                 <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>         <span class="keywordtype">double</span> geox=0;</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>         <span class="keywordtype">double</span> geoy=0;</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>                 <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>           <span class="comment">//read mask</span></div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>           <span class="keywordtype">double</span> colMask=0;</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>           <span class="keywordtype">double</span> rowMask=0;</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span> </div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>           imgWriter.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>           maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>           colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>           rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>           <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>             <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span> </div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>               assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>               <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>             maskReader.readData(lineMask,GDT_Float32,static_cast<int>(rowMask),mskband_opt[0]);</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>               }</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>               <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>             cerr << errorstring << endl;</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>             exit(1);</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>               }</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>               <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>             cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>             exit(3);</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>               }</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>               oldRowMask=rowMask;</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>             }</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>             <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[0])</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>               valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>           }</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>         }</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span> </div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>                 <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>                   writeBuffer.push_back(nodataValue);</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>                 <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>                   <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>                   <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>                     lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>                     lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>                     upperCol=readCol+0.5;</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>                     upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>                     <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>                       lowerCol=0;</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>                     <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>                       upperCol=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>                     <span class="comment">// writeBuffer.push_back((readCol-0.5-lowerCol)*(readBuffer[upperCol-startCol]*theScale+theOffset)+(1-readCol+0.5+lowerCol)*(readBuffer[lowerCol-startCol]*theScale+theOffset));</span></div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>                     writeBuffer.push_back((readCol-0.5-lowerCol)*readBuffer[upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[lowerCol-startCol]);</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>                     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>                   <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>                     readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>                     readCol-=startCol;<span class="comment">//we only start reading from startCol</span></div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>                     <span class="comment">// writeBuffer.push_back(readBuffer[readCol]*theScale+theOffset);</span></div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>                     writeBuffer.push_back(readBuffer[readCol]);</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>                     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>           }</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         }</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>           }</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>         }</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>       }</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>         cout << errorstring << endl;</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>         exit(2);</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       }</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>     }</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>     <span class="keywordflow">if</span>(writeBuffer.size()!=imgWriter.nrOfCol())</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       cout << <span class="stringliteral">"writeBuffer.size()="</span> << writeBuffer.size() << <span class="stringliteral">", imgWriter.nrOfCol()="</span> << imgWriter.nrOfCol() << endl;</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>     assert(writeBuffer.size()==imgWriter.nrOfCol());</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       imgWriter.writeData(writeBuffer,GDT_Float64,irow,writeBand);</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>     }</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       cout << errorstring << endl;</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       exit(3);</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>     }</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       progress=(1.0+irow);</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       progress/=imgWriter.nrOfRow();</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     }</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       progress=(1.0+irow);</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>       progress+=(imgWriter.nrOfRow()*writeBand);</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       progress/=imgWriter.nrOfBand()*imgWriter.nrOfRow();</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       assert(progress>=0);</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       assert(progress<=1);</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>     }</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       }</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       ++writeBand;</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>     }</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>     imgReader.close();</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>   }</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt.size()){</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     extentReader.close();</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>   }</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>   <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     maskReader.close();</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>   imgWriter.close();</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span> }</div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 <div class="ttc" id="classEgcs_html"><div class="ttname"><a href="classEgcs.html">Egcs</a></div><div class="ttdef"><b>Definition:</b> <a href="Egcs_8h_source.html#l00026">Egcs.h:26</a></div></div>
@@ -820,7 +838,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop_8py_source.html b/doc/html/pkcrop_8py_source.html
index 25eda4e..76b3546 100644
--- a/doc/html/pkcrop_8py_source.html
+++ b/doc/html/pkcrop_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -200,7 +200,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop__gui_2main_8cc_source.html b/doc/html/pkcrop__gui_2main_8cc_source.html
index edb9643..823fa50 100644
--- a/doc/html/pkcrop__gui_2main_8cc_source.html
+++ b/doc/html/pkcrop__gui_2main_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -88,7 +88,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop__gui_2mainwindow_8cc_source.html b/doc/html/pkcrop__gui_2mainwindow_8cc_source.html
index 31adcdc..9356d16 100644
--- a/doc/html/pkcrop__gui_2mainwindow_8cc_source.html
+++ b/doc/html/pkcrop__gui_2mainwindow_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -363,7 +363,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop__gui_2mainwindow_8h_source.html b/doc/html/pkcrop__gui_2mainwindow_8h_source.html
index 0ea106b..94e7c29 100644
--- a/doc/html/pkcrop__gui_2mainwindow_8h_source.html
+++ b/doc/html/pkcrop__gui_2mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -137,7 +137,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff.html b/doc/html/pkdiff.html
index 3da5d4d..3702170 100644
--- a/doc/html/pkdiff.html
+++ b/doc/html/pkdiff.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -92,6 +92,8 @@ Options</h1>
 <tr>
 <td>f </td><td>f </td><td>std::string </td><td>SQLite </td><td>OGR format for output vector (for vector reference datasets only) </td></tr>
 <tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). </td></tr>
+<tr>
 <td>lc </td><td>lclass </td><td>std::string </td><td>class </td><td>Attribute name of the classified label (for vector reference datasets only) </td></tr>
 <tr>
 <td>cmf </td><td>cmf </td><td>std::string </td><td>ascii </td><td>Format for confusion matrix (ascii or latex) </td></tr>
@@ -120,7 +122,7 @@ Usage: pkdiff -i input -ref reference</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff_8cc_source.html b/doc/html/pkdiff_8cc_source.html
index d101847..b25658c 100644
--- a/doc/html/pkdiff_8cc_source.html
+++ b/doc/html/pkdiff_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -80,871 +80,873 @@
 <div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="preprocessor">#include "algorithms/ConfusionMatrix.h"</span></div>
 <div class="line"><a name="l00027"></a><span class="lineno">   27</span> </div>
 <div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span> </div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span> {</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input raster dataset."</span>);</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> reference_opt(<span class="stringliteral">"ref"</span>, <span class="stringliteral">"reference"</span>, <span class="stringliteral">"Reference (raster or vector) dataset"</span>);</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> layer_opt(<span class="stringliteral">"ln"</span>, <span class="stringliteral">"ln"</span>, <span class="stringliteral">"Layer name(s) in sample. Leave empty to select all (for vector reference datasets only)"</span>);</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata."</span>);</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value(s) where image is invalid. Use negative value for valid data (example: use -t -1: if only -1 is valid value)"</span>, 0);</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"No data value(s) in input or reference dataset are ignored"</span>);</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"Input (reference) raster band. Optionally, you can define different bands for input and reference bands respectively: -b 1 -b 0."</span>, 0);</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> rmse_opt(<span class="stringliteral">"rmse"</span>, <span class="stringliteral">"rmse"</span>, <span class="stringliteral">"Report root mean squared error"</span>, <span class="keyword">false</span>);</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> regression_opt(<span class="stringliteral">"reg"</span>, <span class="stringliteral">"reg"</span>, <span class="stringliteral">"Report linear regression (Input = c0+c1*Reference)"</span>, <span class="keyword">false</span>);</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> confusion_opt(<span class="stringliteral">"cm"</span>, <span class="stringliteral">"confusion"</span>, <span class="stringliteral">"Create confusion matrix (to std out)"</span>, <span class="keyword">false</span>);</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> cmformat_opt(<span class="stringliteral">"cmf"</span>,<span class="stringliteral">"cmf"</span>,<span class="stringliteral">"Format for confusion matrix (ascii or latex)"</span>,<span class="stringliteral">"ascii"</span>);</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> cmoutput_opt(<span class="stringliteral">"cmo"</span>,<span class="stringliteral">"cmo"</span>,<span class="stringliteral">"Output file for confusion matrix"</span>);</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> se95_opt(<span class="stringliteral">"se95"</span>,<span class="stringliteral">"se95"</span>,<span class="stringliteral">"Report standard error for 95 confidence interval"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> labelref_opt(<span class="stringliteral">"lr"</span>, <span class="stringliteral">"lref"</span>, <span class="stringliteral">"Attribute name of the reference label (for vector reference datasets only)"</span>, <span class="stringliteral">"label"</span>);</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> classname_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"List of class names."</span>); </div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> classvalue_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"reclass"</span>, <span class="stringliteral">"List of class values (use same order as in classname option)."</span>); </div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output dataset (optional)"</span>);</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> ogrformat_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"f"</span>, <span class="stringliteral">"OGR format for output vector (for vector reference datasets only)"</span>,<span class="stringliteral">"SQLite"</span>);</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> labelclass_opt(<span class="stringliteral">"lc"</span>, <span class="stringliteral">"lclass"</span>, <span class="stringliteral">"Attribute name of the classified label (for vector reference datasets only)"</span>, <span class="stringliteral">"class"</span>);</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> boundary_opt(<span class="stringliteral">"bnd"</span>, <span class="stringliteral">"boundary"</span>, <span class="stringliteral">"Boundary for selecting the sample (for vector reference datasets only)"</span>, 1,1);</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> homogeneous_opt(<span class="stringliteral">"hom"</span>, <span class="stringliteral">"homogeneous"</span>, <span class="stringliteral">"Only take regions with homogeneous boundary into account (for reference datasets only)"</span>, <span class="keyword">false</span>,1);</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> disc_opt(<span class="stringliteral">"circ"</span>, <span class="stringliteral">"circular"</span>, <span class="stringliteral">"Use circular boundary (for vector reference datasets only)"</span>, <span class="keyword">false</span>,1);</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"Color table in ASCII format having 5 columns: id R G B ALFA (0: transparent, 255: solid)."</span>);</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> valueE_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"correct"</span>, <span class="stringliteral">"Value for correct pixels"</span>, 0,2);</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> valueO_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"omission"</span>, <span class="stringliteral">"Value for omission errors: input label > reference label"</span>, 1,2);</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> valueC_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"commission"</span>, <span class="stringliteral">"Value for commission errors: input label < reference label"</span>, 2,1);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"Verbose level"</span>, 0,2);</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span> </div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   output_opt.setHide(1);</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   ogrformat_opt.setHide(1);</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   labelclass_opt.setHide(1);</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   boundary_opt.setHide(1);</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   homogeneous_opt.setHide(1);</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   disc_opt.setHide(1);</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   colorTable_opt.setHide(1);</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   option_opt.setHide(1);</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span> </div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     reference_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     layer_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     rmse_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     regression_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     confusion_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     labelref_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     classname_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     classvalue_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     mask_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     msknodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     labelclass_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     cmformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     cmoutput_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     se95_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     boundary_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     homogeneous_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     disc_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     <span class="comment">// class_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     valueE_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     valueO_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     valueC_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   }</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     exit(0);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   }</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     cout << endl;</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     cout << <span class="stringliteral">"Usage: pkdiff -i input -ref reference"</span> << endl;</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     cout << endl;</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   }</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span> </div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> inputReader;</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span> </div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span> {</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input raster dataset."</span>);</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> reference_opt(<span class="stringliteral">"ref"</span>, <span class="stringliteral">"reference"</span>, <span class="stringliteral">"Reference (raster or vector) dataset"</span>);</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> layer_opt(<span class="stringliteral">"ln"</span>, <span class="stringliteral">"ln"</span>, <span class="stringliteral">"Layer name(s) in sample. Leave empty to select all (for vector reference datasets only)"</span>);</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata."</span>);</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value(s) where image is invalid. Use negative value for valid data (example: use -t -1: if only -1 is valid value)"</span>, 0);</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"No data value(s) in input or reference dataset are ignored"</span>);</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"Input (reference) raster band. Optionally, you can define different bands for input and reference bands respectively: -b 1 -b 0."</span>, 0);</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> rmse_opt(<span class="stringliteral">"rmse"</span>, <span class="stringliteral">"rmse"</span>, <span class="stringliteral">"Report root mean squared error"</span>, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> regression_opt(<span class="stringliteral">"reg"</span>, <span class="stringliteral">"reg"</span>, <span class="stringliteral">"Report linear regression (Input = c0+c1*Reference)"</span>, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> confusion_opt(<span class="stringliteral">"cm"</span>, <span class="stringliteral">"confusion"</span>, <span class="stringliteral">"Create confusion matrix (to std out)"</span>, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> cmformat_opt(<span class="stringliteral">"cmf"</span>,<span class="stringliteral">"cmf"</span>,<span class="stringliteral">"Format for confusion matrix (ascii or latex)"</span>,<span class="stringliteral">"ascii"</span>);</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> cmoutput_opt(<span class="stringliteral">"cmo"</span>,<span class="stringliteral">"cmo"</span>,<span class="stringliteral">"Output file for confusion matrix"</span>);</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> se95_opt(<span class="stringliteral">"se95"</span>,<span class="stringliteral">"se95"</span>,<span class="stringliteral">"Report standard error for 95 confidence interval"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> labelref_opt(<span class="stringliteral">"lr"</span>, <span class="stringliteral">"lref"</span>, <span class="stringliteral">"Attribute name of the reference label (for vector reference datasets only)"</span>, <span class="stringliteral">"label"</span>);</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> classname_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"List of class names."</span>); </div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> classvalue_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"reclass"</span>, <span class="stringliteral">"List of class values (use same order as in classname option)."</span>); </div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output dataset (optional)"</span>);</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> ogrformat_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"f"</span>, <span class="stringliteral">"OGR format for output vector (for vector reference datasets only)"</span>,<span class="stringliteral">"SQLite"</span>);</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>,<span class="stringliteral">"GTiff"</span>);</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> labelclass_opt(<span class="stringliteral">"lc"</span>, <span class="stringliteral">"lclass"</span>, <span class="stringliteral">"Attribute name of the classified label (for vector reference datasets only)"</span>, <span class="stringliteral">"class"</span>);</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> boundary_opt(<span class="stringliteral">"bnd"</span>, <span class="stringliteral">"boundary"</span>, <span class="stringliteral">"Boundary for selecting the sample (for vector reference datasets only)"</span>, 1,1);</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> homogeneous_opt(<span class="stringliteral">"hom"</span>, <span class="stringliteral">"homogeneous"</span>, <span class="stringliteral">"Only take regions with homogeneous boundary into account (for reference datasets only)"</span>, <span class="keyword">false</span>,1);</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> disc_opt(<span class="stringliteral">"circ"</span>, <span class="stringliteral">"circular"</span>, <span class="stringliteral">"Use circular boundary (for vector reference datasets only)"</span>, <span class="keyword">false</span>,1);</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"Color table in ASCII format having 5 columns: id R G B ALFA (0: transparent, 255: solid)."</span>);</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> valueE_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"correct"</span>, <span class="stringliteral">"Value for correct pixels"</span>, 0,2);</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> valueO_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"omission"</span>, <span class="stringliteral">"Value for omission errors: input label > reference label"</span>, 1,2);</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> valueC_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"commission"</span>, <span class="stringliteral">"Value for commission errors: input label < reference label"</span>, 2,1);</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"Verbose level"</span>, 0,2);</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span> </div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   output_opt.setHide(1);</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   ogrformat_opt.setHide(1);</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   oformat_opt.setHide(1);</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   labelclass_opt.setHide(1);</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   boundary_opt.setHide(1);</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   homogeneous_opt.setHide(1);</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   disc_opt.setHide(1);</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   colorTable_opt.setHide(1);</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span> </div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     reference_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     layer_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     rmse_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     regression_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     confusion_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     labelref_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     classname_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     classvalue_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     mask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     msknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     labelclass_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     cmformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     cmoutput_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     se95_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     boundary_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     homogeneous_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     disc_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     <span class="comment">// class_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     valueE_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     valueO_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     valueC_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   }</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     exit(0);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   }</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     cout << endl;</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     cout << <span class="stringliteral">"Usage: pkdiff -i input -ref reference"</span> << endl;</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     cout << endl;</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   }</div>
 <div class="line"><a name="l00180"></a><span class="lineno">  180</span> </div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     cout << <span class="stringliteral">"flag(s) set to"</span>;</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag)</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>       cout << <span class="stringliteral">" "</span> << nodata_opt[iflag];</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     cout << endl;</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   }</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span> </div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     exit(0);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   }</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="keywordflow">if</span>(reference_opt.empty()){</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     std::cerr << <span class="stringliteral">"No reference file provided (use option -ref). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     exit(0);</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   }</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span> </div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <span class="comment">//band_opt[0] is for input</span></div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <span class="comment">//band_opt[1] is for reference</span></div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <span class="keywordflow">if</span>(band_opt.size()<2)</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     band_opt.push_back(band_opt[0]);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span> </div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     <span class="keywordflow">while</span>(mask_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>       mask_opt.push_back(mask_opt[0]);</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   vector<short> inputRange;</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   vector<short> referenceRange;</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   <a class="code" href="classconfusionmatrix_1_1ConfusionMatrix.html">confusionmatrix::ConfusionMatrix</a> cm;</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   <span class="keywordtype">int</span> nclass=0;</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   map<string,short> classValueMap;</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   vector<std::string> nameVector(255);<span class="comment">//the inverse of the classValueMap</span></div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   vector<string> classNames;</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span> </div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ntotalValidation=0;</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nflagged=0;</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   <a class="code" href="classVector2d.html">Vector2d<int></a> resultClass;</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   vector<float> user;</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   vector<float> producer;</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   vector<unsigned int> nvalidation;</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span> </div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="keywordflow">if</span>(confusion_opt[0]){</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     <span class="comment">// if(class_opt.size()>1)</span></div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     <span class="comment">//   inputRange=class_opt;</span></div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     <span class="comment">// if(classvalue_opt.size()>1)</span></div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <span class="comment">//   inputRange=classvalue_opt;</span></div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     <span class="comment">// else{</span></div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>           cout << <span class="stringliteral">"opening input image file "</span> << input_opt[0] << endl;</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>         inputReader.open(input_opt[0]);<span class="comment">//,imagicX_opt[0],imagicY_opt[0]);</span></div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>       }</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>         cerr << error << endl;</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>         exit(1);</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>       }</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>       inputReader.getRange(inputRange,band_opt[0]);</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>       inputReader.close();</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     <span class="comment">// }</span></div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   </div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag){</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>       vector<short>::iterator fit;</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>       fit=find(inputRange.begin(),inputRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(nodata_opt[iflag]));</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>       <span class="keywordflow">if</span>(fit!=inputRange.end())</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>         inputRange.erase(fit);</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     }</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     nclass=inputRange.size();</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>       cout << <span class="stringliteral">"nclass (inputRange.size()): "</span> << nclass << endl;</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>       cout << <span class="stringliteral">"input range: "</span> << endl;</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     }</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     <span class="keywordflow">if</span>(classname_opt.size()){</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       assert(classname_opt.size()==classvalue_opt.size());</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass){</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>         classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>         assert(classvalue_opt[iclass]<nameVector.size());</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>         nameVector[classvalue_opt[iclass]]=classname_opt[iclass];</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>       }</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     }</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     <span class="comment">// nclass=classValueMap.size();</span></div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> rc=0;rc<inputRange.size();++rc){</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>       classNames.push_back(type2string(inputRange[rc]));</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>         cout << inputRange[rc] << endl;</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     }</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     cm.setClassNames(classNames);</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>       cout << <span class="stringliteral">"class names: "</span> << endl;</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<cm.nClasses();++iclass)</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>         cout << iclass << <span class="stringliteral">" "</span> << cm.getClass(iclass) << endl;</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     }</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     resultClass.resize(nclass,nclass);</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     user.resize(nclass);</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     producer.resize(nclass);</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     nvalidation.resize(nclass);</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>     <span class="comment">//initialize</span></div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> rc=0;rc<nclass;++rc){</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ic=0;ic<nclass;++ic)</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>         resultClass[rc][ic]=0;</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>       nvalidation[rc]=0;</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     }</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   }</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   </div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   <span class="keywordtype">bool</span> isDifferent=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   <span class="keywordtype">bool</span> refIsRaster=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span> </div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> referenceReaderOgr;</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     referenceReaderOgr.open(reference_opt[0]);</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     referenceReaderOgr.close();</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   }</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     refIsRaster=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> inputReader;</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span> </div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     cout << <span class="stringliteral">"flag(s) set to"</span>;</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag)</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>       cout << <span class="stringliteral">" "</span> << nodata_opt[iflag];</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     cout << endl;</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   }</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span> </div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     exit(0);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   }</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keywordflow">if</span>(reference_opt.empty()){</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     std::cerr << <span class="stringliteral">"No reference file provided (use option -ref). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     exit(0);</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   }</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span> </div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <span class="comment">//band_opt[0] is for input</span></div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="comment">//band_opt[1] is for reference</span></div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <span class="keywordflow">if</span>(band_opt.size()<2)</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     band_opt.push_back(band_opt[0]);</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span> </div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     <span class="keywordflow">while</span>(mask_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>       mask_opt.push_back(mask_opt[0]);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   vector<short> inputRange;</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   vector<short> referenceRange;</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <a class="code" href="classconfusionmatrix_1_1ConfusionMatrix.html">confusionmatrix::ConfusionMatrix</a> cm;</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   <span class="keywordtype">int</span> nclass=0;</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   map<string,short> classValueMap;</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   vector<std::string> nameVector(255);<span class="comment">//the inverse of the classValueMap</span></div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   vector<string> classNames;</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span> </div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ntotalValidation=0;</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nflagged=0;</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <a class="code" href="classVector2d.html">Vector2d<int></a> resultClass;</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   vector<float> user;</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   vector<float> producer;</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   vector<unsigned int> nvalidation;</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span> </div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   <span class="keywordflow">if</span>(confusion_opt[0]){</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <span class="comment">// if(class_opt.size()>1)</span></div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     <span class="comment">//   inputRange=class_opt;</span></div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     <span class="comment">// if(classvalue_opt.size()>1)</span></div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="comment">//   inputRange=classvalue_opt;</span></div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     <span class="comment">// else{</span></div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>           cout << <span class="stringliteral">"opening input image file "</span> << input_opt[0] << endl;</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>         inputReader.open(input_opt[0]);<span class="comment">//,imagicX_opt[0],imagicY_opt[0]);</span></div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>       }</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>         cerr << error << endl;</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>         exit(1);</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>       }</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>       inputReader.getRange(inputRange,band_opt[0]);</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>       inputReader.close();</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   </div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag){</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>       vector<short>::iterator fit;</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>       fit=find(inputRange.begin(),inputRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(nodata_opt[iflag]));</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>       <span class="keywordflow">if</span>(fit!=inputRange.end())</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>         inputRange.erase(fit);</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     }</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     nclass=inputRange.size();</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>       cout << <span class="stringliteral">"nclass (inputRange.size()): "</span> << nclass << endl;</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       cout << <span class="stringliteral">"input range: "</span> << endl;</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     }</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     <span class="keywordflow">if</span>(classname_opt.size()){</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>       assert(classname_opt.size()==classvalue_opt.size());</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass){</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>         classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>         assert(classvalue_opt[iclass]<nameVector.size());</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>         nameVector[classvalue_opt[iclass]]=classname_opt[iclass];</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       }</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     }</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     <span class="comment">// nclass=classValueMap.size();</span></div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> rc=0;rc<inputRange.size();++rc){</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>       classNames.push_back(type2string(inputRange[rc]));</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>         cout << inputRange[rc] << endl;</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     }</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     cm.setClassNames(classNames);</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>       cout << <span class="stringliteral">"class names: "</span> << endl;</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<cm.nClasses();++iclass)</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>         cout << iclass << <span class="stringliteral">" "</span> << cm.getClass(iclass) << endl;</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     }</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     resultClass.resize(nclass,nclass);</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>     user.resize(nclass);</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     producer.resize(nclass);</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     nvalidation.resize(nclass);</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     <span class="comment">//initialize</span></div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> rc=0;rc<nclass;++rc){</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ic=0;ic<nclass;++ic)</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>         resultClass[rc][ic]=0;</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>       nvalidation[rc]=0;</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     }</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   }</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   </div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <span class="keywordtype">bool</span> isDifferent=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <span class="keywordtype">bool</span> refIsRaster=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span> </div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> referenceReaderOgr;</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     referenceReaderOgr.open(reference_opt[0]);</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     referenceReaderOgr.close();</div>
 <div class="line"><a name="l00292"></a><span class="lineno">  292</span>   }</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="keywordtype">float</span> progress=0;</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="comment">// if(reference_opt[0].find(".shp")!=string::npos){</span></div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordflow">if</span>(!refIsRaster){</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iinput=0;iinput<input_opt.size();++iinput){</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     cout << <span class="stringliteral">"Processing input "</span> << input_opt[iinput] << endl;</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>         assert(reference_opt.size()==output_opt.size());</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iref=0;iref<reference_opt.size();++iref){</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     cout << <span class="stringliteral">"reference "</span> << reference_opt[iref] << endl;</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>         <span class="comment">// assert(reference_opt[iref].find(".shp")!=string::npos);</span></div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>           inputReader.open(input_opt[iinput]);<span class="comment">//,imagicX_opt[0],imagicY_opt[0]);</span></div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>           <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>             maskReader.open(mask_opt[iinput]);</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>             assert(inputReader.nrOfCol()==maskReader.nrOfCol());</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>             assert(inputReader.nrOfRow()==maskReader.nrOfRow());</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>           }</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>           referenceReaderOgr.open(reference_opt[iref]);</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>         }</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>           cerr << error << endl;</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>           exit(1);</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>         }</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>         <span class="keywordflow">if</span>(confusion_opt[0])</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>           referenceRange=inputRange;</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span> </div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>         <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrWriter;</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>         ogrWriter.open(output_opt[iref],ogrformat_opt[0]);</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       }</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>         cerr << error << endl;</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>         exit(1);</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       }</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     }</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="keywordtype">int</span> nlayer=referenceReaderOgr.getDataSource()->GetLayerCount();</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nlayer;++ilayer){</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       progress=0;</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>       OGRLayer *readLayer=referenceReaderOgr.getLayer(ilayer);</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>       <span class="comment">//      readLayer = referenceReaderOgr.getDataSource()->GetLayer(ilayer);</span></div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>       <span class="keywordtype">string</span> currentLayername=readLayer->GetName();</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       <span class="keywordflow">if</span>(layer_opt.size())</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>         <span class="keywordflow">if</span>(find(layer_opt.begin(),layer_opt.end(),currentLayername)==layer_opt.end())</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>         cout << <span class="stringliteral">"processing layer "</span> << readLayer->GetName() << endl;</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span> </div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       readLayer->ResetReading();</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       OGRLayer *writeLayer;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>           cout << <span class="stringliteral">"creating output vector file "</span> << output_opt[0] << endl;</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>         <span class="comment">// assert(output_opt[0].find(".shp")!=string::npos);</span></div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>         <span class="keywordtype">char</span>     **papszOptions=NULL;</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>           cout << <span class="stringliteral">"creating layer: "</span> << readLayer->GetName() << endl;</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>         <span class="comment">// if(ogrWriter.createLayer(layername, referenceReaderOgr.getProjection(ilayer), referenceReaderOgr.getGeometryType(ilayer), papszOptions)==NULL)</span></div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>         writeLayer=ogrWriter.createLayer(readLayer->GetName(), referenceReaderOgr.getProjection(ilayer), wkbPoint, papszOptions);</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>         assert(writeLayer);</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>         <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>           cout << <span class="stringliteral">"created layer"</span> << endl;</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>           cout << <span class="stringliteral">"copy fields from "</span> << reference_opt[iref] << endl;</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>         }</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>         ogrWriter.copyFields(referenceReaderOgr,ilayer,ilayer);</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>         <span class="comment">//create extra field for classified label</span></div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>         <span class="keywordtype">short</span> theDim=boundary_opt[0];</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowJ=-theDim/2;windowJ<(theDim+1)/2;++windowJ){</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowI=-theDim/2;windowI<(theDim+1)/2;++windowI){</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>         <span class="keywordflow">if</span>(disc_opt[0]&&(windowI*windowI+windowJ*windowJ>(theDim/2)*(theDim/2)))</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>         ostringstream fs;</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>         <span class="keywordflow">if</span>(theDim>1)</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           fs << labelclass_opt[0] << <span class="stringliteral">"_"</span> << windowJ << <span class="stringliteral">"_"</span> << windowI;</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>           fs << labelclass_opt[0];</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>           cout << <span class="stringliteral">"creating field "</span> << fs.str() << endl;</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>         ogrWriter.createField(fs.str(),OFTInteger,ilayer);</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>           }</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>         }</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       }</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       OGRFeature *readFeature;</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       OGRFeature *writeFeature;</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       <span class="keywordtype">int</span> isample=0;</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nfeatureInLayer=readLayer->GetFeatureCount();</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       <span class="keywordflow">while</span>( (readFeature = readLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>           cout << <span class="stringliteral">"sample "</span> << ++isample << endl;</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>         <span class="comment">//get x and y from readFeature</span></div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>         <span class="keywordtype">double</span> x,y;</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>         OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>         OGRPoint centroidPoint;</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>         OGRPoint *poPoint;</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>         poGeometry = readFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>         <span class="comment">// assert( poGeometry != NULL && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint );</span></div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>         <span class="keywordflow">if</span>(poGeometry==NULL)</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPolygon){</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>           OGRMultiPolygon readPolygon = *((OGRMultiPolygon *) poGeometry);</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>           readPolygon = *((OGRMultiPolygon *) poGeometry);</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>           readPolygon.Centroid(&centroidPoint);</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>           poPoint=&centroidPoint;</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>         }</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>           OGRPolygon readPolygon=*((OGRPolygon *) poGeometry);</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>           readPolygon.Centroid(&centroidPoint);</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>           poPoint=&centroidPoint;</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>         }</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint )</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>           poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>           std::cerr << <span class="stringliteral">"Warning: skipping feature (not of type point or polygon)"</span> << std::endl;</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>         }</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>         x=poPoint->getX();</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>         y=poPoint->getY();</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>         <span class="keywordtype">double</span> inputValue;</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>         vector<double> inputValues;</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>         <span class="keywordtype">bool</span> isHomogeneous=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>         <span class="keywordtype">short</span> maskValue;</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         <span class="keywordtype">short</span> outputValue;</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>         <span class="comment">//read referenceValue from feature</span></div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>         <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> referenceValue;</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>         <span class="keywordtype">string</span> referenceClassName;</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>         <span class="keywordflow">if</span>(classValueMap.size()){</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>           referenceClassName=readFeature->GetFieldAsString(readFeature->GetFieldIndex(labelref_opt[0].c_str()));</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>           referenceValue=classValueMap[referenceClassName];</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>         }</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>           referenceValue=readFeature->GetFieldAsInteger(readFeature->GetFieldIndex(labelref_opt[0].c_str()));</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>           cout << <span class="stringliteral">"reference value: "</span> << referenceValue << endl;</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>         </div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>         <span class="keywordtype">bool</span> pixelFlagged=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>         <span class="keywordtype">bool</span> maskFlagged=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag){</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>           <span class="keywordflow">if</span>(referenceValue==nodata_opt[iflag])</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>         pixelFlagged=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>         }</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>         <span class="keywordflow">if</span>(pixelFlagged)</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         <span class="keywordtype">double</span> i_centre,j_centre;</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         <span class="comment">//input reader is georeferenced!</span></div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>         inputReader.geo2image(x,y,i_centre,j_centre);</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>         <span class="comment">//       else{</span></div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>         <span class="comment">//         i_centre=x;</span></div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         <span class="comment">//         j_centre=y;</span></div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>         <span class="comment">//       }</span></div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         <span class="comment">//nearest neighbour</span></div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>         j_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j_centre);</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         i_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i_centre);</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         <span class="comment">//check if j_centre is out of bounds</span></div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>         <span class="keywordflow">if</span>(static_cast<int>(j_centre)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j_centre)>=inputReader.nrOfRow())</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>         <span class="comment">//check if i_centre is out of bounds</span></div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         <span class="keywordflow">if</span>(static_cast<int>(i_centre)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i_centre)>=inputReader.nrOfCol())</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     refIsRaster=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   }</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keywordtype">float</span> progress=0;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="comment">// if(reference_opt[0].find(".shp")!=string::npos){</span></div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keywordflow">if</span>(!refIsRaster){</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iinput=0;iinput<input_opt.size();++iinput){</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     cout << <span class="stringliteral">"Processing input "</span> << input_opt[iinput] << endl;</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>         assert(reference_opt.size()==output_opt.size());</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iref=0;iref<reference_opt.size();++iref){</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     cout << <span class="stringliteral">"reference "</span> << reference_opt[iref] << endl;</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         <span class="comment">// assert(reference_opt[iref].find(".shp")!=string::npos);</span></div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>           inputReader.open(input_opt[iinput]);<span class="comment">//,imagicX_opt[0],imagicY_opt[0]);</span></div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>           <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>             maskReader.open(mask_opt[iinput]);</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>             assert(inputReader.nrOfCol()==maskReader.nrOfCol());</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>             assert(inputReader.nrOfRow()==maskReader.nrOfRow());</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>           }</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>           referenceReaderOgr.open(reference_opt[iref]);</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>         }</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>           cerr << error << endl;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>           exit(1);</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>         }</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>         <span class="keywordflow">if</span>(confusion_opt[0])</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>           referenceRange=inputRange;</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span> </div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>         <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrWriter;</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>         ogrWriter.open(output_opt[iref],ogrformat_opt[0]);</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       }</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>         cerr << error << endl;</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>         exit(1);</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       }</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     }</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     <span class="keywordtype">int</span> nlayer=referenceReaderOgr.getDataSource()->GetLayerCount();</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nlayer;++ilayer){</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>       progress=0;</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       OGRLayer *readLayer=referenceReaderOgr.getLayer(ilayer);</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       <span class="comment">//      readLayer = referenceReaderOgr.getDataSource()->GetLayer(ilayer);</span></div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       <span class="keywordtype">string</span> currentLayername=readLayer->GetName();</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       <span class="keywordflow">if</span>(layer_opt.size())</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>         <span class="keywordflow">if</span>(find(layer_opt.begin(),layer_opt.end(),currentLayername)==layer_opt.end())</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>         cout << <span class="stringliteral">"processing layer "</span> << readLayer->GetName() << endl;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span> </div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       readLayer->ResetReading();</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       OGRLayer *writeLayer;</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>           cout << <span class="stringliteral">"creating output vector file "</span> << output_opt[0] << endl;</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>         <span class="comment">// assert(output_opt[0].find(".shp")!=string::npos);</span></div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>         <span class="keywordtype">char</span>     **papszOptions=NULL;</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>           cout << <span class="stringliteral">"creating layer: "</span> << readLayer->GetName() << endl;</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>         <span class="comment">// if(ogrWriter.createLayer(layername, referenceReaderOgr.getProjection(ilayer), referenceReaderOgr.getGeometryType(ilayer), papszOptions)==NULL)</span></div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>         writeLayer=ogrWriter.createLayer(readLayer->GetName(), referenceReaderOgr.getProjection(ilayer), wkbPoint, papszOptions);</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>         assert(writeLayer);</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>         <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>           cout << <span class="stringliteral">"created layer"</span> << endl;</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>           cout << <span class="stringliteral">"copy fields from "</span> << reference_opt[iref] << endl;</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>         }</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>         ogrWriter.copyFields(referenceReaderOgr,ilayer,ilayer);</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>         <span class="comment">//create extra field for classified label</span></div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>         <span class="keywordtype">short</span> theDim=boundary_opt[0];</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowJ=-theDim/2;windowJ<(theDim+1)/2;++windowJ){</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowI=-theDim/2;windowI<(theDim+1)/2;++windowI){</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>         <span class="keywordflow">if</span>(disc_opt[0]&&(windowI*windowI+windowJ*windowJ>(theDim/2)*(theDim/2)))</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         ostringstream fs;</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>         <span class="keywordflow">if</span>(theDim>1)</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>           fs << labelclass_opt[0] << <span class="stringliteral">"_"</span> << windowJ << <span class="stringliteral">"_"</span> << windowI;</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>           fs << labelclass_opt[0];</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>           cout << <span class="stringliteral">"creating field "</span> << fs.str() << endl;</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>         ogrWriter.createField(fs.str(),OFTInteger,ilayer);</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>           }</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>         }</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       }</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       OGRFeature *readFeature;</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       OGRFeature *writeFeature;</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       <span class="keywordtype">int</span> isample=0;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nfeatureInLayer=readLayer->GetFeatureCount();</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="keywordflow">while</span>( (readFeature = readLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>           cout << <span class="stringliteral">"sample "</span> << ++isample << endl;</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>         <span class="comment">//get x and y from readFeature</span></div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>         <span class="keywordtype">double</span> x,y;</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>         OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>         OGRPoint centroidPoint;</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>         OGRPoint *poPoint;</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>         poGeometry = readFeature->GetGeometryRef();</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>         <span class="comment">// assert( poGeometry != NULL && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint );</span></div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>         <span class="keywordflow">if</span>(poGeometry==NULL)</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPolygon){</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>           OGRMultiPolygon readPolygon = *((OGRMultiPolygon *) poGeometry);</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>           readPolygon = *((OGRMultiPolygon *) poGeometry);</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>           readPolygon.Centroid(&centroidPoint);</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>           poPoint=&centroidPoint;</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>         }</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>           OGRPolygon readPolygon=*((OGRPolygon *) poGeometry);</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>           readPolygon.Centroid(&centroidPoint);</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>           poPoint=&centroidPoint;</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>         }</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint )</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>           poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>           std::cerr << <span class="stringliteral">"Warning: skipping feature (not of type point or polygon)"</span> << std::endl;</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>         }</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>         x=poPoint->getX();</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>         y=poPoint->getY();</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>         <span class="keywordtype">double</span> inputValue;</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         vector<double> inputValues;</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>         <span class="keywordtype">bool</span> isHomogeneous=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>         <span class="keywordtype">short</span> maskValue;</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>         <span class="keywordtype">short</span> outputValue;</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>         <span class="comment">//read referenceValue from feature</span></div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>         <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> referenceValue;</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         <span class="keywordtype">string</span> referenceClassName;</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>         <span class="keywordflow">if</span>(classValueMap.size()){</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>           referenceClassName=readFeature->GetFieldAsString(readFeature->GetFieldIndex(labelref_opt[0].c_str()));</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>           referenceValue=classValueMap[referenceClassName];</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>         }</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>           referenceValue=readFeature->GetFieldAsInteger(readFeature->GetFieldIndex(labelref_opt[0].c_str()));</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>           cout << <span class="stringliteral">"reference value: "</span> << referenceValue << endl;</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>         </div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>         <span class="keywordtype">bool</span> pixelFlagged=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>         <span class="keywordtype">bool</span> maskFlagged=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag){</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>           <span class="keywordflow">if</span>(referenceValue==nodata_opt[iflag])</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>         pixelFlagged=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         }</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         <span class="keywordflow">if</span>(pixelFlagged)</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>         <span class="keywordtype">double</span> i_centre,j_centre;</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>         <span class="comment">//input reader is georeferenced!</span></div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         inputReader.geo2image(x,y,i_centre,j_centre);</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>         <span class="comment">//       else{</span></div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         <span class="comment">//         i_centre=x;</span></div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>         <span class="comment">//         j_centre=y;</span></div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         <span class="comment">//       }</span></div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         <span class="comment">//nearest neighbour</span></div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>         j_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j_centre);</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>         i_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i_centre);</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>         <span class="comment">//check if j_centre is out of bounds</span></div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         <span class="keywordflow">if</span>(static_cast<int>(j_centre)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j_centre)>=inputReader.nrOfRow())</div>
 <div class="line"><a name="l00457"></a><span class="lineno">  457</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span> </div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           writeFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>           assert(readFeature);</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>           <span class="keywordtype">int</span> nfield=readFeature->GetFieldCount();</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>           writeFeature->SetGeometry(poPoint);</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>             cout << <span class="stringliteral">"copying fields from "</span> << reference_opt[0] << endl;</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>           assert(readFeature);</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>           assert(writeFeature);</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>           vector<int> panMap(nfield);</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           vector<int>::iterator panit=panMap.begin();</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifield=0;ifield<nfield;++ifield)</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>             panMap[ifield]=ifield;</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>           writeFeature->SetFieldsFrom(readFeature,&(panMap[0]));</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>           <span class="comment">// if(writeFeature->SetFrom(readFeature)!= OGRERR_NONE)</span></div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>           <span class="comment">//    cerr << "writing feature failed" << endl;</span></div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>           <span class="comment">// if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>           <span class="comment">//    cout << "feature written" << endl;</span></div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         }</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>         <span class="keywordtype">bool</span> windowAllFlagged=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>         <span class="keywordtype">bool</span> windowHasFlag=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>         <span class="keywordtype">short</span> theDim=boundary_opt[0];</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowJ=-theDim/2;windowJ<(theDim+1)/2;++windowJ){</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowI=-theDim/2;windowI<(theDim+1)/2;++windowI){</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         <span class="keywordflow">if</span>(disc_opt[0]&&(windowI*windowI+windowJ*windowJ>(theDim/2)*(theDim/2)))</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>         <span class="keywordtype">int</span> j=j_centre+windowJ;</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         <span class="comment">//check if j is out of bounds</span></div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         <span class="keywordflow">if</span>(static_cast<int>(j)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j)>=inputReader.nrOfRow())</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>         <span class="keywordtype">int</span> i=i_centre+windowI;</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>         <span class="comment">//check if i is out of bounds</span></div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>         <span class="keywordflow">if</span>(static_cast<int>(i)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i)>=inputReader.nrOfCol())</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>           cout << setprecision(12) << <span class="stringliteral">"reading image value at x,y "</span> << x << <span class="stringliteral">","</span> << y << <span class="stringliteral">" ("</span> << i << <span class="stringliteral">","</span> << j << <span class="stringliteral">"), "</span>;</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>         inputReader.readData(inputValue,GDT_Float64,i,j,band_opt[0]);</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>         inputValues.push_back(inputValue);</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         <span class="keywordflow">if</span>(inputValues.back()!=*(inputValues.begin()))</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>           isHomogeneous=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>           cout << <span class="stringliteral">"input value: "</span> << inputValue << endl;</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>         pixelFlagged=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag){</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           <span class="keywordflow">if</span>(inputValue==nodata_opt[iflag]){</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>             pixelFlagged=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           }</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>         }</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>         maskFlagged=<span class="keyword">false</span>;<span class="comment">//(msknodata_opt[ivalue]>=0)?false:true;</span></div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>           maskReader.readData(maskValue,GDT_Float64,i,j,0);</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>             <span class="keywordflow">if</span>(msknodata_opt[ivalue]>=0){<span class="comment">//values set in msknodata_opt are invalid</span></div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>               <span class="keywordflow">if</span>(maskValue==msknodata_opt[ivalue]){</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>             maskFlagged=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>               }</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>             }</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>             <span class="keywordflow">else</span>{<span class="comment">//only values set in msknodata_opt are valid</span></div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>               <span class="keywordflow">if</span>(maskValue!=-msknodata_opt[ivalue])</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>             maskFlagged=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>               <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>             maskFlagged=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>               }</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>             }</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>           }</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>         }</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>         pixelFlagged=pixelFlagged||maskFlagged;</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>         <span class="keywordflow">if</span>(pixelFlagged)</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>           windowHasFlag=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>           windowAllFlagged=<span class="keyword">false</span>;<span class="comment">//at least one good pixel in neighborhood</span></div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>           }</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>         }</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>         <span class="comment">//at this point we know the values for the entire window</span></div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span> </div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         <span class="keywordflow">if</span>(homogeneous_opt[0]){<span class="comment">//only centre pixel</span></div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>           <span class="keywordtype">int</span> j=j_centre;</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>           <span class="keywordtype">int</span> i=i_centre;</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>           <span class="comment">//flag if not all pixels are homogeneous or if at least one pixel flagged</span></div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>           </div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>           <span class="keywordflow">if</span>(!windowHasFlag&&isHomogeneous){</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>         <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>           writeFeature->SetField(labelclass_opt[0].c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(inputValue));</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>         <span class="keywordflow">if</span>(confusion_opt[0]){</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>           ++ntotalValidation;</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>           <span class="keywordflow">if</span>(classValueMap.size()){</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>             assert(inputValue<nameVector.size());</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>             <span class="keywordtype">string</span> className=nameVector[<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(inputValue)];</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>             cm.incrementResult(type2string<short>(classValueMap[referenceClassName]),type2string<short>(classValueMap[className]),1);</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>           }</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>             <span class="keywordtype">int</span> rc=distance(referenceRange.begin(),find(referenceRange.begin(),referenceRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(referenceValue)));</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>             <span class="keywordtype">int</span> ic=distance(inputRange.begin(),find(inputRange.begin(),inputRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(inputValue)));</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>             assert(rc<nclass);</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>             assert(ic<nclass);</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>             ++nvalidation[rc];</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>             ++resultClass[rc][ic];</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>               cout << <span class="stringliteral">"increment: "</span> << rc << <span class="stringliteral">" "</span> << referenceRange[rc] << <span class="stringliteral">" "</span> << ic << <span class="stringliteral">" "</span> << inputRange[ic] << endl;</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>             cm.incrementResult(cm.getClass(rc),cm.getClass(ic),1);</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>           }</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         }</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         <span class="keywordflow">if</span>(inputValue==referenceValue){<span class="comment">//correct</span></div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>           outputValue=valueE_opt[0];</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>           <span class="keywordflow">if</span>(nodata_opt.size()){</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>             <span class="keywordflow">if</span>(valueE_opt[0]==nodata_opt[0])</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>               outputValue=inputValue;</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>           }</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>         }</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputValue>referenceValue)<span class="comment">//1=forest,2=non-forest</span></div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>           outputValue=valueO_opt[0];<span class="comment">//omission error</span></div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>           outputValue=valueC_opt[0];<span class="comment">//commission error</span></div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>           }</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>         }</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowJ=-theDim/2;windowJ<(theDim+1)/2;++windowJ){</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowI=-theDim/2;windowI<(theDim+1)/2;++windowI){</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>           <span class="keywordflow">if</span>(disc_opt[0]&&(windowI*windowI+windowJ*windowJ>(theDim/2)*(theDim/2)))</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>           <span class="keywordtype">int</span> j=j_centre+windowJ;</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>           <span class="comment">//check if j is out of bounds</span></div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>           <span class="keywordflow">if</span>(static_cast<int>(j)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j)>=inputReader.nrOfRow())</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>           <span class="keywordtype">int</span> i=i_centre+windowI;</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>           <span class="comment">//check if i is out of bounds</span></div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>           <span class="keywordflow">if</span>(static_cast<int>(i)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i)>=inputReader.nrOfCol())</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>           <span class="keywordflow">if</span>(!windowAllFlagged){</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>             ostringstream fs;</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>             <span class="keywordflow">if</span>(theDim>1)</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>               fs << labelclass_opt[0] << <span class="stringliteral">"_"</span> << windowJ << <span class="stringliteral">"_"</span> << windowI;</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>               fs << labelclass_opt[0];</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>             <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>               writeFeature->SetField(fs.str().c_str(),inputValue);</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>             <span class="keywordflow">if</span>(!windowJ&&!windowI){<span class="comment">//centre pixel</span></div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>               <span class="keywordflow">if</span>(confusion_opt[0]){</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>             ++ntotalValidation;</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>             <span class="keywordflow">if</span>(classValueMap.size()){</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>               assert(inputValue<nameVector.size());</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>               <span class="keywordtype">string</span> className=nameVector[<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(inputValue)];</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>               cm.incrementResult(type2string<short>(classValueMap[referenceClassName]),type2string<short>(classValueMap[className]),1);</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>             }</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>               <span class="keywordtype">int</span> rc=distance(referenceRange.begin(),find(referenceRange.begin(),referenceRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(referenceValue)));</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>               <span class="keywordtype">int</span> ic=distance(inputRange.begin(),find(inputRange.begin(),inputRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(inputValue)));</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>               <span class="keywordflow">if</span>(rc>=nclass)</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>                 <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>               <span class="keywordflow">if</span>(ic>=nclass)</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>                 <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>               <span class="comment">// assert(rc<nclass);</span></div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>               <span class="comment">// assert(ic<nclass);</span></div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>               ++nvalidation[rc];</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>               ++resultClass[rc][ic];</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>                 cout << <span class="stringliteral">"increment: "</span> << rc << <span class="stringliteral">" "</span> << referenceRange[rc] << <span class="stringliteral">" "</span> << ic << <span class="stringliteral">" "</span> << inputRange[ic] << endl;</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>               cm.incrementResult(cm.getClass(rc),cm.getClass(ic),1);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>             }</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>               }</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>               <span class="keywordflow">if</span>(inputValue==referenceValue){<span class="comment">//correct</span></div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>             outputValue=valueE_opt[0];</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>             <span class="keywordflow">if</span>(nodata_opt.size()){</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>               <span class="keywordflow">if</span>(valueE_opt[0]==nodata_opt[0])</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>                 outputValue=inputValue;</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>             }</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>               }</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputValue>referenceValue)<span class="comment">//1=forest,2=non-forest</span></div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>             outputValue=valueO_opt[0];<span class="comment">//omission error</span></div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>             outputValue=valueC_opt[0];<span class="comment">//commission error</span></div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>             }</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>           }</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         }</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>           }</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         }</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>         <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>           <span class="keywordflow">if</span>(!windowAllFlagged){</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>           cout << <span class="stringliteral">"creating feature"</span> << endl;</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>         <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>           <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Failed to create feature in OGR vector file"</span>;</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>           <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>         }</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>           }</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>           OGRFeature::DestroyFeature( writeFeature );</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>         <span class="comment">//check if i_centre is out of bounds</span></div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         <span class="keywordflow">if</span>(static_cast<int>(i_centre)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i_centre)>=inputReader.nrOfCol())</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span> </div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>         <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>           writeFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>           assert(readFeature);</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>           <span class="keywordtype">int</span> nfield=readFeature->GetFieldCount();</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>           writeFeature->SetGeometry(poPoint);</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>             cout << <span class="stringliteral">"copying fields from "</span> << reference_opt[0] << endl;</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           assert(readFeature);</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           assert(writeFeature);</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>           vector<int> panMap(nfield);</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>           vector<int>::iterator panit=panMap.begin();</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifield=0;ifield<nfield;++ifield)</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>             panMap[ifield]=ifield;</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>           writeFeature->SetFieldsFrom(readFeature,&(panMap[0]));</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>           <span class="comment">// if(writeFeature->SetFrom(readFeature)!= OGRERR_NONE)</span></div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>           <span class="comment">//    cerr << "writing feature failed" << endl;</span></div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>           <span class="comment">// if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>           <span class="comment">//    cout << "feature written" << endl;</span></div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>         }</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         <span class="keywordtype">bool</span> windowAllFlagged=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         <span class="keywordtype">bool</span> windowHasFlag=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         <span class="keywordtype">short</span> theDim=boundary_opt[0];</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowJ=-theDim/2;windowJ<(theDim+1)/2;++windowJ){</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowI=-theDim/2;windowI<(theDim+1)/2;++windowI){</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         <span class="keywordflow">if</span>(disc_opt[0]&&(windowI*windowI+windowJ*windowJ>(theDim/2)*(theDim/2)))</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         <span class="keywordtype">int</span> j=j_centre+windowJ;</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>         <span class="comment">//check if j is out of bounds</span></div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>         <span class="keywordflow">if</span>(static_cast<int>(j)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j)>=inputReader.nrOfRow())</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>         <span class="keywordtype">int</span> i=i_centre+windowI;</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         <span class="comment">//check if i is out of bounds</span></div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>         <span class="keywordflow">if</span>(static_cast<int>(i)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i)>=inputReader.nrOfCol())</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>           cout << setprecision(12) << <span class="stringliteral">"reading image value at x,y "</span> << x << <span class="stringliteral">","</span> << y << <span class="stringliteral">" ("</span> << i << <span class="stringliteral">","</span> << j << <span class="stringliteral">"), "</span>;</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         inputReader.readData(inputValue,GDT_Float64,i,j,band_opt[0]);</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>         inputValues.push_back(inputValue);</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>         <span class="keywordflow">if</span>(inputValues.back()!=*(inputValues.begin()))</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>           isHomogeneous=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           cout << <span class="stringliteral">"input value: "</span> << inputValue << endl;</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>         pixelFlagged=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag){</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           <span class="keywordflow">if</span>(inputValue==nodata_opt[iflag]){</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>             pixelFlagged=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>           }</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>         }</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>         maskFlagged=<span class="keyword">false</span>;<span class="comment">//(msknodata_opt[ivalue]>=0)?false:true;</span></div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>           maskReader.readData(maskValue,GDT_Float64,i,j,0);</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>             <span class="keywordflow">if</span>(msknodata_opt[ivalue]>=0){<span class="comment">//values set in msknodata_opt are invalid</span></div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>               <span class="keywordflow">if</span>(maskValue==msknodata_opt[ivalue]){</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>             maskFlagged=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>               }</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>             }</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>             <span class="keywordflow">else</span>{<span class="comment">//only values set in msknodata_opt are valid</span></div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>               <span class="keywordflow">if</span>(maskValue!=-msknodata_opt[ivalue])</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>             maskFlagged=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>               <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>             maskFlagged=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>               }</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>             }</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>           }</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         }</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>         pixelFlagged=pixelFlagged||maskFlagged;</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>         <span class="keywordflow">if</span>(pixelFlagged)</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>           windowHasFlag=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>           windowAllFlagged=<span class="keyword">false</span>;<span class="comment">//at least one good pixel in neighborhood</span></div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>           }</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         }</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>         <span class="comment">//at this point we know the values for the entire window</span></div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span> </div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>         <span class="keywordflow">if</span>(homogeneous_opt[0]){<span class="comment">//only centre pixel</span></div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>           <span class="keywordtype">int</span> j=j_centre;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>           <span class="keywordtype">int</span> i=i_centre;</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>           <span class="comment">//flag if not all pixels are homogeneous or if at least one pixel flagged</span></div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>           </div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>           <span class="keywordflow">if</span>(!windowHasFlag&&isHomogeneous){</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>         <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>           writeFeature->SetField(labelclass_opt[0].c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(inputValue));</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         <span class="keywordflow">if</span>(confusion_opt[0]){</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>           ++ntotalValidation;</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>           <span class="keywordflow">if</span>(classValueMap.size()){</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>             assert(inputValue<nameVector.size());</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>             <span class="keywordtype">string</span> className=nameVector[<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(inputValue)];</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>             cm.incrementResult(type2string<short>(classValueMap[referenceClassName]),type2string<short>(classValueMap[className]),1);</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>           }</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>             <span class="keywordtype">int</span> rc=distance(referenceRange.begin(),find(referenceRange.begin(),referenceRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(referenceValue)));</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>             <span class="keywordtype">int</span> ic=distance(inputRange.begin(),find(inputRange.begin(),inputRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(inputValue)));</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>             assert(rc<nclass);</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>             assert(ic<nclass);</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>             ++nvalidation[rc];</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>             ++resultClass[rc][ic];</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>               cout << <span class="stringliteral">"increment: "</span> << rc << <span class="stringliteral">" "</span> << referenceRange[rc] << <span class="stringliteral">" "</span> << ic << <span class="stringliteral">" "</span> << inputRange[ic] << endl;</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>             cm.incrementResult(cm.getClass(rc),cm.getClass(ic),1);</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>           }</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>         }</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>         <span class="keywordflow">if</span>(inputValue==referenceValue){<span class="comment">//correct</span></div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>           outputValue=valueE_opt[0];</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>           <span class="keywordflow">if</span>(nodata_opt.size()){</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>             <span class="keywordflow">if</span>(valueE_opt[0]==nodata_opt[0])</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>               outputValue=inputValue;</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>           }</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>         }</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputValue>referenceValue)<span class="comment">//1=forest,2=non-forest</span></div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>           outputValue=valueO_opt[0];<span class="comment">//omission error</span></div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>           outputValue=valueC_opt[0];<span class="comment">//commission error</span></div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>           }</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>         }</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowJ=-theDim/2;windowJ<(theDim+1)/2;++windowJ){</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> windowI=-theDim/2;windowI<(theDim+1)/2;++windowI){</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>           <span class="keywordflow">if</span>(disc_opt[0]&&(windowI*windowI+windowJ*windowJ>(theDim/2)*(theDim/2)))</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>           <span class="keywordtype">int</span> j=j_centre+windowJ;</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>           <span class="comment">//check if j is out of bounds</span></div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>           <span class="keywordflow">if</span>(static_cast<int>(j)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j)>=inputReader.nrOfRow())</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>           <span class="keywordtype">int</span> i=i_centre+windowI;</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>           <span class="comment">//check if i is out of bounds</span></div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>           <span class="keywordflow">if</span>(static_cast<int>(i)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i)>=inputReader.nrOfCol())</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>           <span class="keywordflow">if</span>(!windowAllFlagged){</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>             ostringstream fs;</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>             <span class="keywordflow">if</span>(theDim>1)</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>               fs << labelclass_opt[0] << <span class="stringliteral">"_"</span> << windowJ << <span class="stringliteral">"_"</span> << windowI;</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>               fs << labelclass_opt[0];</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>             <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>               writeFeature->SetField(fs.str().c_str(),inputValue);</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>             <span class="keywordflow">if</span>(!windowJ&&!windowI){<span class="comment">//centre pixel</span></div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>               <span class="keywordflow">if</span>(confusion_opt[0]){</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>             ++ntotalValidation;</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>             <span class="keywordflow">if</span>(classValueMap.size()){</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>               assert(inputValue<nameVector.size());</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>               <span class="keywordtype">string</span> className=nameVector[<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(inputValue)];</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>               cm.incrementResult(type2string<short>(classValueMap[referenceClassName]),type2string<short>(classValueMap[className]),1);</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>             }</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>               <span class="keywordtype">int</span> rc=distance(referenceRange.begin(),find(referenceRange.begin(),referenceRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(referenceValue)));</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>               <span class="keywordtype">int</span> ic=distance(inputRange.begin(),find(inputRange.begin(),inputRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(inputValue)));</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>               <span class="keywordflow">if</span>(rc>=nclass)</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>                 <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>               <span class="keywordflow">if</span>(ic>=nclass)</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>                 <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>               <span class="comment">// assert(rc<nclass);</span></div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>               <span class="comment">// assert(ic<nclass);</span></div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>               ++nvalidation[rc];</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>               ++resultClass[rc][ic];</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>                 cout << <span class="stringliteral">"increment: "</span> << rc << <span class="stringliteral">" "</span> << referenceRange[rc] << <span class="stringliteral">" "</span> << ic << <span class="stringliteral">" "</span> << inputRange[ic] << endl;</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>               cm.incrementResult(cm.getClass(rc),cm.getClass(ic),1);</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>             }</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>               }</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>               <span class="keywordflow">if</span>(inputValue==referenceValue){<span class="comment">//correct</span></div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>             outputValue=valueE_opt[0];</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>             <span class="keywordflow">if</span>(nodata_opt.size()){</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>               <span class="keywordflow">if</span>(valueE_opt[0]==nodata_opt[0])</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>                 outputValue=inputValue;</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>             }</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>               }</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputValue>referenceValue)<span class="comment">//1=forest,2=non-forest</span></div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>             outputValue=valueO_opt[0];<span class="comment">//omission error</span></div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>             outputValue=valueC_opt[0];<span class="comment">//commission error</span></div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>             }</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>           }</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>         }</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>           }</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>         }</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>         <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>           <span class="keywordflow">if</span>(!windowAllFlagged){</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>           cout << <span class="stringliteral">"creating feature"</span> << endl;</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>         <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>           <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Failed to create feature in OGR vector file"</span>;</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>           <span class="keywordflow">throw</span>(errorString);</div>
 <div class="line"><a name="l00648"></a><span class="lineno">  648</span>         }</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>         ++ifeature;</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1)/nfeatureInLayer;</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       }<span class="comment">//next feature</span></div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     }<span class="comment">//next layer</span></div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>         <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>           ogrWriter.close();</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>         referenceReaderOgr.close();</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>         inputReader.close();</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>         <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>           maskReader.close();</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       }<span class="comment">//next reference</span></div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     }<span class="comment">//next input</span></div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     pfnProgress(1.0,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>   }<span class="comment">//reference is OGR vector</span></div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   <span class="keywordflow">else</span>{<span class="comment">//reference is GDAL raster</span></div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> gdalWriter;</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       inputReader.open(input_opt[0]);</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>         maskReader.open(mask_opt[0]);</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>           cout << <span class="stringliteral">"opening output image "</span> << output_opt[0] << endl;</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>         <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>           <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>           theInterleave+=inputReader.getInterleave();</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>           option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         }</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>         gdalWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),1,inputReader.getDataType(),inputReader.getImageType(),option_opt);</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     <span class="keywordflow">if</span>(nodata_opt.size())</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       gdalWriter.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     gdalWriter.copyGeoTransform(inputReader);</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>         <span class="keywordflow">if</span>(colorTable_opt.size())</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>           gdalWriter.setColorTable(colorTable_opt[0]);</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputReader.getColorTable()!=NULL){</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>             cout << <span class="stringliteral">"set colortable from input image"</span> << endl;</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>           gdalWriter.setColorTable(inputReader.getColorTable());</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>         }</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       }</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>         cout << <span class="stringliteral">"no output image defined"</span> << endl;</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>         </div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     }</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       cout << error << endl;</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       exit(2);</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     }</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="comment">//todo: support different data types!</span></div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     vector<double> lineInput(inputReader.nrOfCol());</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     vector<double> lineMask(maskReader.nrOfCol());</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>     vector<double> lineOutput;</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     vector<double> bufferInput;<span class="comment">//for regression</span></div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     vector<double> bufferReference;<span class="comment">//for regression</span></div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>       lineOutput.resize(inputReader.nrOfCol());</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span> </div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     <span class="keywordtype">int</span> irow=0;</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     <span class="keywordtype">int</span> icol=0;</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     <span class="keywordtype">double</span> oldreferencerow=-1;</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="keywordtype">double</span> oldmaskrow=-1;</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> referenceReaderGdal;</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>       referenceReaderGdal.open(reference_opt[0]);<span class="comment">//,rmagicX_opt[0],rmagicY_opt[0]);</span></div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     }</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>       cerr << error << endl;</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       exit(1);</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     }</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     <span class="keywordflow">if</span>(inputReader.isGeoRef()){</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       assert(referenceReaderGdal.isGeoRef());</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       <span class="keywordflow">if</span>(inputReader.getProjection()!=referenceReaderGdal.getProjection())</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>         cerr << <span class="stringliteral">"Warning: projection of input image and reference image are different"</span> << endl;</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     }</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     vector<double> lineReference(referenceReaderGdal.nrOfCol());</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     <span class="keywordflow">if</span>(confusion_opt[0]){</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>       referenceReaderGdal.getRange(referenceRange,band_opt[1]);</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag){</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>         vector<short>::iterator fit;</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>         fit=find(referenceRange.begin(),referenceRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(nodata_opt[iflag]));</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>         <span class="keywordflow">if</span>(fit!=referenceRange.end())</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>           referenceRange.erase(fit);</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>       }</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>         cout << <span class="stringliteral">"reference range: "</span> << endl;</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> rc=0;rc<referenceRange.size();++rc)</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>           cout << referenceRange[rc] << endl;</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>       }</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       <span class="keywordflow">if</span>(referenceRange.size()!=inputRange.size()){</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>         <span class="keywordflow">if</span>(confusion_opt[0]||output_opt.size()){</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>           cout << <span class="stringliteral">"reference range is not equal to input range!"</span> << endl;</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>           cout << <span class="stringliteral">"Kappa: "</span> << 0 << endl;    </div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>           cout << <span class="stringliteral">"total weighted: "</span> << 0 << endl;</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>         }</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>           cout << <span class="stringliteral">"reference range is not equal to input range!"</span> << endl;</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>         cout << input_opt[0] << <span class="stringliteral">" and "</span> << reference_opt[0] << <span class="stringliteral">" are different"</span> << endl;</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>         exit(1);</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       }</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     }</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>     <span class="keywordtype">double</span> rmse=0;</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>     <span class="comment">// for(irow=0;irow<inputReader.nrOfRow()&&!isDifferent;++irow){</span></div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     <span class="keywordflow">for</span>(irow=0;irow<inputReader.nrOfRow();++irow){</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>       <span class="comment">//read line in lineInput, lineReference and lineMask</span></div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       inputReader.readData(lineInput,GDT_Float64,irow,band_opt[0]);</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       <span class="keywordtype">double</span> x,y;<span class="comment">//geo coordinates</span></div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       <span class="keywordtype">double</span> ireference,jreference;<span class="comment">//image coordinates in reference image</span></div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       <span class="keywordtype">double</span> imask,jmask;<span class="comment">//image coordinates in mask image</span></div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>       <span class="keywordflow">for</span>(icol=0;icol<inputReader.nrOfCol();++icol){</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>         <span class="comment">//find col in reference</span></div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>         inputReader.image2geo(icol,irow,x,y);</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>         referenceReaderGdal.geo2image(x,y,ireference,jreference);</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         <span class="keywordflow">if</span>(ireference<0||ireference>=referenceReaderGdal.nrOfCol()){</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       <span class="keywordflow">if</span>(rmse_opt[0]||regression_opt[0])</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>         cerr << ireference << <span class="stringliteral">" out of reference range!"</span> << endl;</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>         cerr << x << <span class="stringliteral">" "</span> << y << <span class="stringliteral">" "</span> << icol << <span class="stringliteral">" "</span> << irow << endl;</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>         cerr << x << <span class="stringliteral">" "</span> << y << <span class="stringliteral">" "</span> << ireference << <span class="stringliteral">" "</span> << jreference << endl;</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>         exit(1);</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       }</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>         }</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         <span class="keywordflow">if</span>(jreference!=oldreferencerow){</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>           <span class="keywordflow">if</span>(jreference<0||jreference>=referenceReaderGdal.nrOfRow()){</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>         <span class="keywordflow">if</span>(rmse_opt[0]||regression_opt[0])</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>           cerr << jreference << <span class="stringliteral">" out of reference range!"</span> << endl;</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>           cerr << x << <span class="stringliteral">" "</span> << y << <span class="stringliteral">" "</span> << icol << <span class="stringliteral">" "</span> << irow << endl;</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>           cerr << x << <span class="stringliteral">" "</span> << y << <span class="stringliteral">" "</span> << ireference << <span class="stringliteral">" "</span> << jreference << endl;</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>           exit(1);</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>         }</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>           }</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>             referenceReaderGdal.readData(lineReference,GDT_Float64,static_cast<int>(jreference),band_opt[1]);</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>             oldreferencerow=jreference;</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>           }</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>         }</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>         <span class="keywordtype">bool</span> flagged=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag){</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>           <span class="keywordflow">if</span>((lineInput[icol]==nodata_opt[iflag])||(lineReference[ireference]==nodata_opt[iflag])){</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>             <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>               lineOutput[icol]=nodata_opt[iflag];</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>             flagged=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>           }</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>         }</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       maskReader.geo2image(x,y,imask,jmask);</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       <span class="keywordflow">if</span>(jmask>=0&&jmask<maskReader.nrOfRow()){</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         <span class="keywordflow">if</span>(jmask!=oldmaskrow)</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>           maskReader.readData(lineMask,GDT_Float64,jmask);</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>           <span class="keywordflow">if</span>(lineMask[icol]==msknodata_opt[ivalue]){</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>         flagged=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>           }</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>         }</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>           }</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>         }</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>         <span class="keywordflow">if</span>(!flagged){</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       <span class="keywordflow">if</span>(rmse_opt[0]){<span class="comment">//divide by image size to prevent overflow. At the end we need to take care about flagged pixels by normalizing...</span></div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>         rmse+=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(lineInput[icol]-lineReference[ireference])*(lineInput[icol]-lineReference[ireference])/inputReader.nrOfCol()/inputReader.nrOfRow();</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       }</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(regression_opt[0]){</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>         bufferInput.push_back(lineInput[icol]);</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>         bufferReference.push_back(lineReference[ireference]);</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       }</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span> </div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>           <span class="keywordflow">if</span>(confusion_opt[0]){</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>             ++ntotalValidation;</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>             <span class="keywordtype">int</span> rc=distance(referenceRange.begin(),find(referenceRange.begin(),referenceRange.end(),lineReference[ireference]));</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>             <span class="keywordtype">int</span> ic=distance(inputRange.begin(),find(inputRange.begin(),inputRange.end(),lineInput[icol]));</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>             assert(rc<nclass);</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>             assert(ic<nclass);</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>             ++nvalidation[rc];</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>             ++resultClass[rc][ic];</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>               cout << <span class="stringliteral">"increment: "</span> << rc << <span class="stringliteral">" "</span> << referenceRange[rc] << <span class="stringliteral">" "</span> << ic << <span class="stringliteral">" "</span> << inputRange[ic] << endl;</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>             cm.incrementResult(cm.getClass(rc),cm.getClass(ic),1);</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>           }</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>           <span class="keywordflow">if</span>(lineInput[icol]==lineReference[ireference]){<span class="comment">//correct</span></div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>             <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>           lineOutput[icol]=valueE_opt[0];</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>           <span class="keywordflow">if</span>(nodata_opt.size()){</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>         <span class="keywordflow">if</span>(valueE_opt[0]==nodata_opt[0])</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>           lineOutput[icol]=lineInput[icol];</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>           }</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>             }</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>           }</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>           <span class="keywordflow">else</span>{<span class="comment">//error</span></div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>             <span class="keywordflow">if</span>(output_opt.empty()&&!confusion_opt[0]&&!rmse_opt[0]&&!regression_opt[0]){</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>               isDifferent=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>             }</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>             <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>               <span class="keywordflow">if</span>(lineInput[icol]>lineReference[ireference])</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>         lineOutput[icol]=valueO_opt[0];<span class="comment">//omission error</span></div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>         lineOutput[icol]=valueC_opt[0];<span class="comment">//commission error</span></div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>             }</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>           }</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     }</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>           ++nflagged;</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>           <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>         <span class="keywordflow">if</span>(nodata_opt.size())</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>           lineOutput[icol]=nodata_opt[0];</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>         <span class="keywordflow">else</span> <span class="comment">//should never occur?</span></div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>           lineOutput[icol]=0;</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>       }       </div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>         }</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       }</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>           gdalWriter.writeData(lineOutput,GDT_Float64,irow);</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>         }</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>           cerr << <span class="stringliteral">"lineOutput.size(): "</span> << lineOutput.size() << endl;</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>           cerr << <span class="stringliteral">"gdalWriter.nrOfCol(): "</span> << gdalWriter.nrOfCol() << endl;</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>           cerr << errorstring << endl;</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>           exit(1);</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>         }</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       }</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(isDifferent&&!confusion_opt[0]&&!rmse_opt[0]&&!regression_opt[0]){<span class="comment">//we can break off here, files are different...</span></div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>         <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>           pfnProgress(1.0,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>       }</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/inputReader.nrOfRow();</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     }</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>     <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       gdalWriter.close();</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!confusion_opt[0]){</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       <span class="keywordflow">if</span>(rmse_opt[0]){</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>     <span class="keywordtype">double</span> normalization=1.0*inputReader.nrOfCol()*inputReader.nrOfRow()/(inputReader.nrOfCol()*inputReader.nrOfRow()-nflagged);</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       cout << <span class="stringliteral">"normalization: "</span> << normalization << endl;</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>       cout << <span class="stringliteral">"rmse before sqrt and normalization: "</span> << rmse << endl;</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>     }</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>     cout << <span class="stringliteral">"--rmse "</span> << sqrt(rmse/normalization) << endl;</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       }</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(regression_opt[0]){</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>     <span class="keywordtype">double</span> err=0;</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>     <span class="keywordtype">double</span> c0=0;</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>     <span class="keywordtype">double</span> c1=1;</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>     <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>     <span class="keywordflow">if</span>(bufferInput.size()&&bufferReference.size()){</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       err=stat.linear_regression_err(bufferInput,bufferReference,c0,c1);</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>     }</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       cout << <span class="stringliteral">"bufferInput.size(): "</span> << bufferInput.size() << endl;</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>       cout << <span class="stringliteral">"bufferReference.size(): "</span> << bufferReference.size() << endl;</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       <span class="keywordtype">double</span> theMin=0;</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>       <span class="keywordtype">double</span> theMax=0;</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       stat.minmax(bufferInput,bufferInput.begin(),bufferInput.end(),theMin,theMax);</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       cout << <span class="stringliteral">"min,  max input: "</span> << theMin << <span class="stringliteral">", "</span> << theMax << endl;</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       theMin=0;</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       theMax=0;</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       stat.minmax(bufferReference,bufferReference.begin(),bufferReference.end(),theMin,theMax);</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>       cout << <span class="stringliteral">"min,  max reference: "</span> << theMin << <span class="stringliteral">", "</span> << theMax << endl;</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>     }</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>     cout << <span class="stringliteral">"--c0 "</span> << c0 << <span class="stringliteral">"--c1 "</span> << c1 << <span class="stringliteral">" --rmse: "</span> << err << endl;</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>     </div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       }</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(isDifferent)</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>         cout << input_opt[0] << <span class="stringliteral">" and "</span> << reference_opt[0] << <span class="stringliteral">" are different"</span> << endl;</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>         cout << input_opt[0] << <span class="stringliteral">" and "</span> << reference_opt[0] << <span class="stringliteral">" are identical"</span> << endl;</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     }</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>     referenceReaderGdal.close();</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>     inputReader.close();</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       maskReader.close();</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>   }<span class="comment">//raster dataset</span></div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span> </div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>   <span class="keywordflow">if</span>(confusion_opt[0]){</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>     cm.setFormat(cmformat_opt[0]);</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>     cm.reportSE95(se95_opt[0]);</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>     ofstream outputFile;</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     <span class="keywordflow">if</span>(cmoutput_opt.size()){</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       outputFile.open(cmoutput_opt[0].c_str(),ios::out);</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>       outputFile << cm << endl;</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>     }</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       cout << cm << endl;</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>     <span class="comment">// cout << "class #samples userAcc prodAcc" << endl;</span></div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>     <span class="comment">// double se95_ua=0;</span></div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     <span class="comment">// double se95_pa=0;</span></div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     <span class="comment">// double se95_oa=0;</span></div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     <span class="comment">// double dua=0;</span></div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>     <span class="comment">// double dpa=0;</span></div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     <span class="comment">// double doa=0;</span></div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     <span class="comment">// for(int iclass=0;iclass<cm.nClasses();++iclass){</span></div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>     <span class="comment">//   dua=cm.ua_pct(classNames[iclass],&se95_ua);</span></div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>     <span class="comment">//   dpa=cm.pa_pct(classNames[iclass],&se95_pa);</span></div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>     <span class="comment">//   cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;</span></div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>     <span class="comment">// }</span></div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     <span class="comment">// doa=cm.oa(&se95_oa);</span></div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>     <span class="comment">// cout << "Kappa: " << cm.kappa() << endl;</span></div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>     <span class="comment">// cout << "Overall Accuracy: " << 100*doa << " (" << 100*se95_oa << ")"  << endl;</span></div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>   }</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>           }</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>           OGRFeature::DestroyFeature( writeFeature );</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>         }</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>         ++ifeature;</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1)/nfeatureInLayer;</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       }<span class="comment">//next feature</span></div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     }<span class="comment">//next layer</span></div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>         <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>           ogrWriter.close();</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>         referenceReaderOgr.close();</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>         inputReader.close();</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>         <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>           maskReader.close();</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       }<span class="comment">//next reference</span></div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     }<span class="comment">//next input</span></div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     pfnProgress(1.0,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   }<span class="comment">//reference is OGR vector</span></div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   <span class="keywordflow">else</span>{<span class="comment">//reference is GDAL raster</span></div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> gdalWriter;</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       inputReader.open(input_opt[0]);</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>       <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>         maskReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>           cout << <span class="stringliteral">"opening output image "</span> << output_opt[0] << endl;</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>         <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>           <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>           theInterleave+=inputReader.getInterleave();</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>           option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>         }</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>         gdalWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),1,inputReader.getDataType(),oformat_opt[0],option_opt);</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     <span class="keywordflow">if</span>(nodata_opt.size())</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       gdalWriter.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     gdalWriter.copyGeoTransform(inputReader);</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>         <span class="keywordflow">if</span>(colorTable_opt.size())</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>           gdalWriter.setColorTable(colorTable_opt[0]);</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputReader.getColorTable()!=NULL){</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>             cout << <span class="stringliteral">"set colortable from input image"</span> << endl;</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>           gdalWriter.setColorTable(inputReader.getColorTable());</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>         }</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       }</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>         cout << <span class="stringliteral">"no output image defined"</span> << endl;</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>         </div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     }</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       cout << error << endl;</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       exit(2);</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     }</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>     <span class="comment">//todo: support different data types!</span></div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     vector<double> lineInput(inputReader.nrOfCol());</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     vector<double> lineMask(maskReader.nrOfCol());</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     vector<double> lineOutput;</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     vector<double> bufferInput;<span class="comment">//for regression</span></div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>     vector<double> bufferReference;<span class="comment">//for regression</span></div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       lineOutput.resize(inputReader.nrOfCol());</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span> </div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="keywordtype">int</span> irow=0;</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     <span class="keywordtype">int</span> icol=0;</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     <span class="keywordtype">double</span> oldreferencerow=-1;</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     <span class="keywordtype">double</span> oldmaskrow=-1;</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> referenceReaderGdal;</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>       referenceReaderGdal.open(reference_opt[0]);<span class="comment">//,rmagicX_opt[0],rmagicY_opt[0]);</span></div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     }</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>       cerr << error << endl;</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       exit(1);</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     }</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>     <span class="keywordflow">if</span>(inputReader.isGeoRef()){</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       assert(referenceReaderGdal.isGeoRef());</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       <span class="keywordflow">if</span>(inputReader.getProjection()!=referenceReaderGdal.getProjection())</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>         cerr << <span class="stringliteral">"Warning: projection of input image and reference image are different"</span> << endl;</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     }</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>     vector<double> lineReference(referenceReaderGdal.nrOfCol());</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     <span class="keywordflow">if</span>(confusion_opt[0]){</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>       referenceReaderGdal.getRange(referenceRange,band_opt[1]);</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag){</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>         vector<short>::iterator fit;</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>         fit=find(referenceRange.begin(),referenceRange.end(),<span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">short</span><span class="keyword">></span>(nodata_opt[iflag]));</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>         <span class="keywordflow">if</span>(fit!=referenceRange.end())</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>           referenceRange.erase(fit);</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       }</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>         cout << <span class="stringliteral">"reference range: "</span> << endl;</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> rc=0;rc<referenceRange.size();++rc)</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>           cout << referenceRange[rc] << endl;</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>       }</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>       <span class="keywordflow">if</span>(referenceRange.size()!=inputRange.size()){</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>         <span class="keywordflow">if</span>(confusion_opt[0]||output_opt.size()){</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>           cout << <span class="stringliteral">"reference range is not equal to input range!"</span> << endl;</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>           cout << <span class="stringliteral">"Kappa: "</span> << 0 << endl;    </div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>           cout << <span class="stringliteral">"total weighted: "</span> << 0 << endl;</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>         }</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>           cout << <span class="stringliteral">"reference range is not equal to input range!"</span> << endl;</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>         cout << input_opt[0] << <span class="stringliteral">" and "</span> << reference_opt[0] << <span class="stringliteral">" are different"</span> << endl;</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>         exit(1);</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       }</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     }</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>     <span class="keywordtype">double</span> rmse=0;</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     <span class="comment">// for(irow=0;irow<inputReader.nrOfRow()&&!isDifferent;++irow){</span></div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     <span class="keywordflow">for</span>(irow=0;irow<inputReader.nrOfRow();++irow){</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       <span class="comment">//read line in lineInput, lineReference and lineMask</span></div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       inputReader.readData(lineInput,GDT_Float64,irow,band_opt[0]);</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>       <span class="keywordtype">double</span> x,y;<span class="comment">//geo coordinates</span></div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       <span class="keywordtype">double</span> ireference,jreference;<span class="comment">//image coordinates in reference image</span></div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       <span class="keywordtype">double</span> imask,jmask;<span class="comment">//image coordinates in mask image</span></div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>       <span class="keywordflow">for</span>(icol=0;icol<inputReader.nrOfCol();++icol){</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         <span class="comment">//find col in reference</span></div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>         inputReader.image2geo(icol,irow,x,y);</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>         referenceReaderGdal.geo2image(x,y,ireference,jreference);</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>         <span class="keywordflow">if</span>(ireference<0||ireference>=referenceReaderGdal.nrOfCol()){</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       <span class="keywordflow">if</span>(rmse_opt[0]||regression_opt[0])</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>         cerr << ireference << <span class="stringliteral">" out of reference range!"</span> << endl;</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>         cerr << x << <span class="stringliteral">" "</span> << y << <span class="stringliteral">" "</span> << icol << <span class="stringliteral">" "</span> << irow << endl;</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>         cerr << x << <span class="stringliteral">" "</span> << y << <span class="stringliteral">" "</span> << ireference << <span class="stringliteral">" "</span> << jreference << endl;</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         exit(1);</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       }</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>         }</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>         <span class="keywordflow">if</span>(jreference!=oldreferencerow){</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>           <span class="keywordflow">if</span>(jreference<0||jreference>=referenceReaderGdal.nrOfRow()){</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>         <span class="keywordflow">if</span>(rmse_opt[0]||regression_opt[0])</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>           cerr << jreference << <span class="stringliteral">" out of reference range!"</span> << endl;</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>           cerr << x << <span class="stringliteral">" "</span> << y << <span class="stringliteral">" "</span> << icol << <span class="stringliteral">" "</span> << irow << endl;</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>           cerr << x << <span class="stringliteral">" "</span> << y << <span class="stringliteral">" "</span> << ireference << <span class="stringliteral">" "</span> << jreference << endl;</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>           exit(1);</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>         }</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>           }</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>             referenceReaderGdal.readData(lineReference,GDT_Float64,static_cast<int>(jreference),band_opt[1]);</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>             oldreferencerow=jreference;</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>           }</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>         }</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>         <span class="keywordtype">bool</span> flagged=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iflag=0;iflag<nodata_opt.size();++iflag){</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>           <span class="keywordflow">if</span>((lineInput[icol]==nodata_opt[iflag])||(lineReference[ireference]==nodata_opt[iflag])){</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>             <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>               lineOutput[icol]=nodata_opt[iflag];</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>             flagged=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>           }</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>         }</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       maskReader.geo2image(x,y,imask,jmask);</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       <span class="keywordflow">if</span>(jmask>=0&&jmask<maskReader.nrOfRow()){</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>         <span class="keywordflow">if</span>(jmask!=oldmaskrow)</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>           maskReader.readData(lineMask,GDT_Float64,jmask);</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>           <span class="keywordflow">if</span>(lineMask[icol]==msknodata_opt[ivalue]){</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>         flagged=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>           }</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>         }</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>           }</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>         }</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>         <span class="keywordflow">if</span>(!flagged){</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>       <span class="keywordflow">if</span>(rmse_opt[0]){<span class="comment">//divide by image size to prevent overflow. At the end we need to take care about flagged pixels by normalizing...</span></div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>         rmse+=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(lineInput[icol]-lineReference[ireference])*(lineInput[icol]-lineReference[ireference])/inputReader.nrOfCol()/inputReader.nrOfRow();</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       }</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(regression_opt[0]){</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>         bufferInput.push_back(lineInput[icol]);</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         bufferReference.push_back(lineReference[ireference]);</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       }</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span> </div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>           <span class="keywordflow">if</span>(confusion_opt[0]){</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>             ++ntotalValidation;</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>             <span class="keywordtype">int</span> rc=distance(referenceRange.begin(),find(referenceRange.begin(),referenceRange.end(),lineReference[ireference]));</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>             <span class="keywordtype">int</span> ic=distance(inputRange.begin(),find(inputRange.begin(),inputRange.end(),lineInput[icol]));</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>             assert(rc<nclass);</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>             assert(ic<nclass);</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>             ++nvalidation[rc];</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>             ++resultClass[rc][ic];</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>               cout << <span class="stringliteral">"increment: "</span> << rc << <span class="stringliteral">" "</span> << referenceRange[rc] << <span class="stringliteral">" "</span> << ic << <span class="stringliteral">" "</span> << inputRange[ic] << endl;</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>             cm.incrementResult(cm.getClass(rc),cm.getClass(ic),1);</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>           }</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>           <span class="keywordflow">if</span>(lineInput[icol]==lineReference[ireference]){<span class="comment">//correct</span></div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>             <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>           lineOutput[icol]=valueE_opt[0];</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>           <span class="keywordflow">if</span>(nodata_opt.size()){</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>         <span class="keywordflow">if</span>(valueE_opt[0]==nodata_opt[0])</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>           lineOutput[icol]=lineInput[icol];</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>           }</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>             }</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>           }</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>           <span class="keywordflow">else</span>{<span class="comment">//error</span></div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>             <span class="keywordflow">if</span>(output_opt.empty()&&!confusion_opt[0]&&!rmse_opt[0]&&!regression_opt[0]){</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>               isDifferent=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>             }</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>             <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>               <span class="keywordflow">if</span>(lineInput[icol]>lineReference[ireference])</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>         lineOutput[icol]=valueO_opt[0];<span class="comment">//omission error</span></div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>         lineOutput[icol]=valueC_opt[0];<span class="comment">//commission error</span></div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>             }</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>           }</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     }</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>           ++nflagged;</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>           <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>         <span class="keywordflow">if</span>(nodata_opt.size())</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>           lineOutput[icol]=nodata_opt[0];</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>         <span class="keywordflow">else</span> <span class="comment">//should never occur?</span></div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>           lineOutput[icol]=0;</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       }       </div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>         }</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>       }</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>           gdalWriter.writeData(lineOutput,GDT_Float64,irow);</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>         }</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>           cerr << <span class="stringliteral">"lineOutput.size(): "</span> << lineOutput.size() << endl;</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>           cerr << <span class="stringliteral">"gdalWriter.nrOfCol(): "</span> << gdalWriter.nrOfCol() << endl;</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>           cerr << errorstring << endl;</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>           exit(1);</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>         }</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       }</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(isDifferent&&!confusion_opt[0]&&!rmse_opt[0]&&!regression_opt[0]){<span class="comment">//we can break off here, files are different...</span></div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>         <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>           pfnProgress(1.0,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       }</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/inputReader.nrOfRow();</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>     }</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       gdalWriter.close();</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!confusion_opt[0]){</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       <span class="keywordflow">if</span>(rmse_opt[0]){</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>     <span class="keywordtype">double</span> normalization=1.0*inputReader.nrOfCol()*inputReader.nrOfRow()/(inputReader.nrOfCol()*inputReader.nrOfRow()-nflagged);</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>       cout << <span class="stringliteral">"normalization: "</span> << normalization << endl;</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       cout << <span class="stringliteral">"rmse before sqrt and normalization: "</span> << rmse << endl;</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>     }</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>     cout << <span class="stringliteral">"--rmse "</span> << sqrt(rmse/normalization) << endl;</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>       }</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(regression_opt[0]){</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>     <span class="keywordtype">double</span> err=0;</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>     <span class="keywordtype">double</span> c0=0;</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>     <span class="keywordtype">double</span> c1=1;</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>     <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>     <span class="keywordflow">if</span>(bufferInput.size()&&bufferReference.size()){</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       err=stat.linear_regression_err(bufferInput,bufferReference,c0,c1);</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>     }</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>       cout << <span class="stringliteral">"bufferInput.size(): "</span> << bufferInput.size() << endl;</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       cout << <span class="stringliteral">"bufferReference.size(): "</span> << bufferReference.size() << endl;</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       <span class="keywordtype">double</span> theMin=0;</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       <span class="keywordtype">double</span> theMax=0;</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       stat.minmax(bufferInput,bufferInput.begin(),bufferInput.end(),theMin,theMax);</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       cout << <span class="stringliteral">"min,  max input: "</span> << theMin << <span class="stringliteral">", "</span> << theMax << endl;</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>       theMin=0;</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       theMax=0;</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       stat.minmax(bufferReference,bufferReference.begin(),bufferReference.end(),theMin,theMax);</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       cout << <span class="stringliteral">"min,  max reference: "</span> << theMin << <span class="stringliteral">", "</span> << theMax << endl;</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>     }</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>     cout << <span class="stringliteral">"--c0 "</span> << c0 << <span class="stringliteral">"--c1 "</span> << c1 << <span class="stringliteral">" --rmse: "</span> << err << endl;</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>     </div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       }</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(isDifferent)</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>         cout << input_opt[0] << <span class="stringliteral">" and "</span> << reference_opt[0] << <span class="stringliteral">" are different"</span> << endl;</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>         cout << input_opt[0] << <span class="stringliteral">" and "</span> << reference_opt[0] << <span class="stringliteral">" are identical"</span> << endl;</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>     }</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     referenceReaderGdal.close();</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>     inputReader.close();</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       maskReader.close();</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>   }<span class="comment">//raster dataset</span></div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span> </div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>   <span class="keywordflow">if</span>(confusion_opt[0]){</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     cm.setFormat(cmformat_opt[0]);</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>     cm.reportSE95(se95_opt[0]);</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     ofstream outputFile;</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>     <span class="keywordflow">if</span>(cmoutput_opt.size()){</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       outputFile.open(cmoutput_opt[0].c_str(),ios::out);</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       outputFile << cm << endl;</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>     }</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       cout << cm << endl;</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     <span class="comment">// cout << "class #samples userAcc prodAcc" << endl;</span></div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     <span class="comment">// double se95_ua=0;</span></div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>     <span class="comment">// double se95_pa=0;</span></div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     <span class="comment">// double se95_oa=0;</span></div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     <span class="comment">// double dua=0;</span></div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>     <span class="comment">// double dpa=0;</span></div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>     <span class="comment">// double doa=0;</span></div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>     <span class="comment">// for(int iclass=0;iclass<cm.nClasses();++iclass){</span></div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>     <span class="comment">//   dua=cm.ua_pct(classNames[iclass],&se95_ua);</span></div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     <span class="comment">//   dpa=cm.pa_pct(classNames[iclass],&se95_pa);</span></div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>     <span class="comment">//   cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;</span></div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     <span class="comment">// doa=cm.oa(&se95_oa);</span></div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     <span class="comment">// cout << "Kappa: " << cm.kappa() << endl;</span></div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>     <span class="comment">// cout << "Overall Accuracy: " << 100*doa << " (" << 100*se95_oa << ")"  << endl;</span></div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>   }</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span> }</div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
@@ -955,7 +957,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff__accuracy_8py_source.html b/doc/html/pkdiff__accuracy_8py_source.html
index e9a0ac1..d29f118 100644
--- a/doc/html/pkdiff__accuracy_8py_source.html
+++ b/doc/html/pkdiff__accuracy_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -261,7 +261,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff__gui_2main_8cpp_source.html b/doc/html/pkdiff__gui_2main_8cpp_source.html
index 8590144..9ce5c4f 100644
--- a/doc/html/pkdiff__gui_2main_8cpp_source.html
+++ b/doc/html/pkdiff__gui_2main_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff__gui_2mainwindow_8cpp_source.html b/doc/html/pkdiff__gui_2mainwindow_8cpp_source.html
index 67ec87f..3471ccc 100644
--- a/doc/html/pkdiff__gui_2mainwindow_8cpp_source.html
+++ b/doc/html/pkdiff__gui_2mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -265,7 +265,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff__gui_2mainwindow_8h_source.html b/doc/html/pkdiff__gui_2mainwindow_8h_source.html
index 5e5576c..f0eb428 100644
--- a/doc/html/pkdiff__gui_2mainwindow_8h_source.html
+++ b/doc/html/pkdiff__gui_2mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -125,7 +125,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdsm2shadow.html b/doc/html/pkdsm2shadow.html
index f5cafeb..e10fd31 100644
--- a/doc/html/pkdsm2shadow.html
+++ b/doc/html/pkdsm2shadow.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@ Options</h1>
 <tr>
 <td>ot </td><td>otype </td><td>std::string </td><td></td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td></td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). </td></tr>
 <tr>
 <td>ct </td><td>ct </td><td>std::string </td><td></td><td>color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) </td></tr>
 </table>
@@ -90,7 +90,7 @@ Usage: pkdsm2shadow -i input.txt -o output [-sza angle] [-saa angle]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdsm2shadow_8cc_source.html b/doc/html/pkdsm2shadow_8cc_source.html
index 604ec86..c4a49b9 100644
--- a/doc/html/pkdsm2shadow_8cc_source.html
+++ b/doc/html/pkdsm2shadow_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -97,7 +97,7 @@
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> saa_opt(<span class="stringliteral">"saa"</span>, <span class="stringliteral">"saa"</span>, <span class="stringliteral">"Sun azimuth angle (N=0 E=90 S=180 W=270)."</span>);</div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> flag_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"flag"</span>, <span class="stringliteral">"Flag to put in image if pixel shadow"</span>, 0);</div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="string [...]
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>,<span class="stringliteral">"GTiff"</span>);</div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
 <div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"s"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale used for input dsm: height=scale*input+offset"</span>);</div>
@@ -162,7 +162,7 @@
 <div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
 <div class="line"><a name="l00154"></a><span class="lineno">  154</span>     std::cout << std::endl << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
 <div class="line"><a name="l00155"></a><span class="lineno">  155</span> </div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="keywordtype">string</span> imageType=input.getImageType();</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="keywordtype">string</span> imageType;<span class="comment">//=input.getImageType();</span></div>
 <div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <span class="keywordflow">if</span>(oformat_opt.size())</div>
 <div class="line"><a name="l00158"></a><span class="lineno">  158</span>     imageType=oformat_opt[0];</div>
 <div class="line"><a name="l00159"></a><span class="lineno">  159</span> </div>
@@ -196,15 +196,15 @@
 <div class="line"><a name="l00187"></a><span class="lineno">  187</span>   output.close();</div>
 <div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keywordflow">return</span> 0;</div>
 <div class="line"><a name="l00189"></a><span class="lineno">  189</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classfilter2d_1_1Filter2d_html"><div class="ttname"><a href="classfilter2d_1_1Filter2d.html">filter2d::Filter2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Filter2d_8h_source.html#l00065">Filter2d.h:65</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdumpimg.html b/doc/html/pkdumpimg.html
index 96033ab..d62cdfc 100644
--- a/doc/html/pkdumpimg.html
+++ b/doc/html/pkdumpimg.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -97,7 +97,7 @@ Usage: pkdumpimg -i input.txt [-o output]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdumpimg_8cc_source.html b/doc/html/pkdumpimg_8cc_source.html
index 6628b66..8f73e4d 100644
--- a/doc/html/pkdumpimg_8cc_source.html
+++ b/doc/html/pkdumpimg_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -398,14 +398,14 @@
 <div class="line"><a name="l00393"></a><span class="lineno">  393</span>   <span class="keywordflow">if</span>(!output_opt[0].empty())</div>
 <div class="line"><a name="l00394"></a><span class="lineno">  394</span>     outputStream.close();</div>
 <div class="line"><a name="l00395"></a><span class="lineno">  395</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdumpogr.html b/doc/html/pkdumpogr.html
index 6ce01b5..6a7578b 100644
--- a/doc/html/pkdumpogr.html
+++ b/doc/html/pkdumpogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -83,7 +83,7 @@ Usage: pkdumpogr -i input. [-o output]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdumpogr_8cc_source.html b/doc/html/pkdumpogr_8cc_source.html
index 1a9896f..8c33995 100644
--- a/doc/html/pkdumpogr_8cc_source.html
+++ b/doc/html/pkdumpogr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -291,7 +291,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdumpogr_8h_source.html b/doc/html/pkdumpogr_8h_source.html
index dbf2aa7..bef67fc 100644
--- a/doc/html/pkdumpogr_8h_source.html
+++ b/doc/html/pkdumpogr_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -189,7 +189,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkeditogr_8cc_source.html b/doc/html/pkeditogr_8cc_source.html
index 947dd9d..6ce7c4b 100644
--- a/doc/html/pkeditogr_8cc_source.html
+++ b/doc/html/pkeditogr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -345,7 +345,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkegcs.html b/doc/html/pkegcs.html
index 0002cec..a216d67 100644
--- a/doc/html/pkegcs.html
+++ b/doc/html/pkegcs.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -81,7 +81,7 @@ Options</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkegcs_8cc_source.html b/doc/html/pkegcs_8cc_source.html
index 24ba149..6865e92 100644
--- a/doc/html/pkegcs_8cc_source.html
+++ b/doc/html/pkegcs_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -153,14 +153,14 @@
 <div class="line"><a name="l00125"></a><span class="lineno">  125</span>     }</div>
 <div class="line"><a name="l00126"></a><span class="lineno">  126</span>   }</div>
 <div class="line"><a name="l00127"></a><span class="lineno">  127</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 <div class="ttc" id="classEgcs_html"><div class="ttname"><a href="classEgcs.html">Egcs</a></div><div class="ttdef"><b>Definition:</b> <a href="Egcs_8h_source.html#l00026">Egcs.h:26</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkenhance_8cc_source.html b/doc/html/pkenhance_8cc_source.html
index 8d0582b..7b051f9 100644
--- a/doc/html/pkenhance_8cc_source.html
+++ b/doc/html/pkenhance_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -251,14 +251,14 @@
 <div class="line"><a name="l00197"></a><span class="lineno">  197</span>   outputImg.close();</div>
 <div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <span class="keywordflow">return</span> 0;</div>
 <div class="line"><a name="l00199"></a><span class="lineno">  199</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract.html b/doc/html/pkextract.html
index 43f3301..e3af281 100644
--- a/doc/html/pkextract.html
+++ b/doc/html/pkextract.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -154,7 +154,7 @@ Usage: pkextract -i input [-s sample | -rand number | -grid size] -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract_8cc_source.html b/doc/html/pkextract_8cc_source.html
index 5eabacb..b67d25b 100644
--- a/doc/html/pkextract_8cc_source.html
+++ b/doc/html/pkextract_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -868,1628 +868,1647 @@
 <div class="line"><a name="l00898"></a><span class="lineno">  898</span>     <span class="comment">//support multiple layers</span></div>
 <div class="line"><a name="l00899"></a><span class="lineno">  899</span>     <span class="keywordtype">int</span> nlayerRead=sampleReaderOgr.getDataSource()->GetLayerCount();</div>
 <div class="line"><a name="l00900"></a><span class="lineno">  900</span>     <span class="keywordtype">int</span> ilayerWrite=0;</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>       std::cout << <span class="stringliteral">"number of layers: "</span> << nlayerRead << endl;</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       </div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nlayerRead;++ilayer){</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       OGRLayer *readLayer=sampleReaderOgr.getLayer(ilayer);</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>       <span class="keywordtype">string</span> currentLayername=readLayer->GetName();</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       <span class="keywordflow">if</span>(layer_opt.size())</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>     <span class="keywordflow">if</span>(find(layer_opt.begin(),layer_opt.end(),currentLayername)==layer_opt.end())</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       cout << <span class="stringliteral">"processing layer "</span> << currentLayername << endl;</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       </div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>       readLayer->ResetReading();</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       OGRLayer *writeLayer;</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       OGRLayer *writeTestLayer;</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span> </div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       std::cout << <span class="stringliteral">"create polygons"</span> << std::endl;</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>     <span class="keywordtype">char</span> **papszOptions=NULL;</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     writeLayer=ogrWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPolygon, papszOptions);</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       writeTestLayer=ogrTestWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPolygon, papszOptions);</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       }</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ntotalvalid=0;</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span> </div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>       std::cout << <span class="stringliteral">"number of layers: "</span> << nlayerRead << endl;</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       </div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nlayerRead;++ilayer){</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       OGRLayer *readLayer=sampleReaderOgr.getLayer(ilayer);</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       <span class="keywordtype">string</span> currentLayername=readLayer->GetName();</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       <span class="keywordtype">int</span> layerIndex=ilayer;</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       <span class="keywordflow">if</span>(layer_opt.size()){</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>     vector<string>::const_iterator it=find(layer_opt.begin(),layer_opt.end(),currentLayername);</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>     <span class="keywordflow">if</span>(it==layer_opt.end())</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       layerIndex=it-layer_opt.begin();</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       }</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       <span class="keywordtype">float</span> theThreshold=(threshold_opt.size()==layer_opt.size())? threshold_opt[layerIndex]: threshold_opt[0];</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       cout << <span class="stringliteral">"processing layer "</span> << currentLayername << endl;</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       </div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       readLayer->ResetReading();</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       OGRLayer *writeLayer;</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       OGRLayer *writeTestLayer;</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span> </div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>       <span class="keywordflow">if</span>(polygon_opt[0]){</div>
 <div class="line"><a name="l00925"></a><span class="lineno">  925</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       std::cout << <span class="stringliteral">"create points in layer "</span> << readLayer->GetName() << std::endl;</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       std::cout << <span class="stringliteral">"create polygons"</span> << std::endl;</div>
 <div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordtype">char</span> **papszOptions=NULL;</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span> </div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>     writeLayer=ogrWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPoint, papszOptions);</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>     <span class="keywordflow">if</span>(test_opt.size()){</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       <span class="keywordtype">char</span> **papszOptions=NULL;</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       writeTestLayer=ogrTestWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPoint, papszOptions);</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>     }</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>       }</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     std::cout << <span class="stringliteral">"copy fields from layer "</span> << ilayer << std::flush << std::endl;</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       ogrWriter.copyFields(sampleReaderOgr,ilayer,ilayerWrite);</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span> </div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       <span class="keywordflow">if</span>(test_opt.size()){</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       std::cout << <span class="stringliteral">"copy fields test writer"</span> << std::flush << std::endl;</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     ogrTestWriter.copyFields(sampleReaderOgr,ilayer,ilayerWrite);</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       }</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>       <span class="comment">// vector<std::string> fieldnames;</span></div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       <span class="comment">// if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>       <span class="comment">//    std::cout << "get fields" << std::flush << std::endl;</span></div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <span class="comment">// sampleReaderOgr.getFields(fieldnames);</span></div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       <span class="comment">// assert(fieldnames.size()==ogrWriter.getFieldCount(ilayerWrite));</span></div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="comment">// map<std::string,double> pointAttributes;</span></div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span> </div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>     <span class="keywordflow">switch</span>(ruleMap[rule_opt[0]]){</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     <span class="keywordflow">case</span>(rule::proportion):<span class="comment">//proportion for each class</span></div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     <span class="keywordflow">case</span>(rule::count):{<span class="comment">//count for each class</span></div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>         ostringstream cs;</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>         cs << class_opt[iclass];</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>         ogrWriter.createField(cs.str(),fieldType,ilayerWrite);</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       }</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>     }</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     <span class="keywordflow">case</span>(rule::custom):</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>     <span class="keywordflow">case</span>(rule::mode):</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       ogrWriter.createField(label_opt[0],fieldType,ilayerWrite);</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       ogrTestWriter.createField(label_opt[0],fieldType,ilayerWrite);</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     }</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>       }</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       ostringstream fs;</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>       fs << fieldname_opt[iband];</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>         std::cout << <span class="stringliteral">"creating field "</span> << fs.str() << std::endl;</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span> </div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>       ogrWriter.createField(fs.str(),fieldType,ilayerWrite);</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>       <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>         ogrTestWriter.createField(fs.str(),fieldType,ilayerWrite);</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>     }</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>       }</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>       OGRFeature *readFeature;</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nfeature=sampleReaderOgr.getFeatureCount();</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>       progress=0;</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>       <span class="keywordflow">while</span>( (readFeature = readLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>     <span class="keywordtype">bool</span> validFeature=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>     <span class="keywordtype">bool</span> writeTest=<span class="keyword">false</span>;<span class="comment">//write this feature to test_opt[0] instead of output_opt</span></div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>       std::cout << <span class="stringliteral">"reading feature "</span> << readFeature->GetFID() << std::endl;</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     <span class="keywordflow">if</span>(threshold_opt[0]>0){<span class="comment">//percentual value</span></div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>       <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>       p*=100.0;</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>       <span class="keywordflow">if</span>(p>threshold_opt[0]){</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>         <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>           writeTest=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next feature</span></div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       }</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>     }</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     <span class="keywordflow">else</span>{<span class="comment">//absolute value</span></div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       <span class="keywordflow">if</span>(ntotalvalid>=-threshold_opt[0]){</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>         <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>           writeTest=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select any more pixels, go to next column feature</span></div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       }</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>     }</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>     <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>       std::cout << <span class="stringliteral">"processing feature "</span> << readFeature->GetFID() << std::endl;</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>     <span class="comment">//get x and y from readFeature</span></div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>     <span class="keywordtype">double</span> x,y;</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>     OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>     poGeometry = readFeature->GetGeometryRef();</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>     assert(poGeometry!=NULL);</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>       <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint ){</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span> </div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>         <span class="keywordflow">if</span>(!buffer_opt.size()){</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>           <span class="keywordflow">switch</span>(ruleMap[rule_opt[0]]){</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>           <span class="keywordflow">case</span>(rule::point):</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>           <span class="keywordflow">case</span>(rule::centroid):</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>         buffer_opt.push_back(1);<span class="comment">//default</span></div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         buffer_opt.push_back(3);<span class="comment">//default</span></div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>           }</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         }</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span> </div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>           std::cout << <span class="stringliteral">"boundary: "</span> << buffer_opt[0] << std::endl;</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> </div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>         OGRPolygon writePolygon;</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>         OGRLinearRing writeRing;</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>         OGRPoint writeCentroidPoint;</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>         OGRFeature *writePolygonFeature;</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>         OGRFeature *writeCentroidFeature;</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span> </div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>         OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>         writeCentroidPoint=*poPoint;</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span> </div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>         x=poPoint->getX();</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>         y=poPoint->getY();</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span> </div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>         <span class="keywordtype">double</span> i_centre,j_centre;</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>         <span class="keywordflow">if</span>(geo_opt[0])</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>           imgReader.geo2image(x,y,i_centre,j_centre);</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>           i_centre=x;</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>           j_centre=y;</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>         }</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>         <span class="comment">//nearest neighbour</span></div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>         j_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j_centre);</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>         i_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i_centre);</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span> </div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>         <span class="keywordtype">double</span> uli=i_centre-buffer_opt[0]/2;</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>         <span class="keywordtype">double</span> ulj=j_centre-buffer_opt[0]/2;</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>         <span class="keywordtype">double</span> lri=i_centre+buffer_opt[0]/2;</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>         <span class="keywordtype">double</span> lrj=j_centre+buffer_opt[0]/2;</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span> </div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>         <span class="comment">//nearest neighbour</span></div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span> </div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>         <span class="comment">// if((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</span></div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>         <span class="comment">//   uli=i_centre;</span></div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>         <span class="comment">//   ulj=j_centre;</span></div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>         <span class="comment">//   lri=i_centre;</span></div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>         <span class="comment">//   lrj=j_centre;</span></div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span> </div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>         <span class="comment">//check if j is out of bounds</span></div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>         <span class="keywordflow">if</span>(static_cast<int>(ulj)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj)>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>         <span class="comment">//check if j is out of bounds</span></div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>         <span class="keywordflow">if</span>(static_cast<int>(uli)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri)>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span> </div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>         OGRPoint ulPoint,urPoint,llPoint,lrPoint;</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>         <span class="keywordtype">double</span> ulx,uly;</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>         <span class="keywordtype">double</span> urx,ury;</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span> </div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>           <span class="keywordflow">if</span>(disc_opt[0]){</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>         <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>         <span class="keywordtype">double</span> radius=buffer_opt[0]/2.0*sqrt(imgReader.getDeltaX()*imgReader.getDeltaY());</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>         <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nstep = 25;</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nstep;++i){</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>           OGRPoint aPoint;</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>           aPoint.setX(x+imgReader.getDeltaX()/2.0+radius*cos(2*PI*i/nstep));</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>           aPoint.setY(y-imgReader.getDeltaY()/2.0+radius*sin(2*PI*i/nstep));</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>           writeRing.addPoint(&aPoint);</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>         }</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         writePolygon.addRing(&writeRing);</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>         writePolygon.closeRings();</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>           }</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>         <span class="keywordtype">double</span> llx,lly;</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>         <span class="keywordtype">double</span> lrx,lry;</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>         imgReader.image2geo(uli,ulj,ulx,uly);</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>         imgReader.image2geo(lri,lrj,lrx,lry);</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>         ulPoint.setX(ulx-imgReader.getDeltaX()/2.0);</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         ulPoint.setY(uly+imgReader.getDeltaY()/2.0);</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         lrPoint.setX(lrx+imgReader.getDeltaX()/2.0);</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         lrPoint.setY(lry-imgReader.getDeltaY()/2.0);</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         urPoint.setX(lrx+imgReader.getDeltaX()/2.0);</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         urPoint.setY(uly+imgReader.getDeltaY()/2.0);</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>         llPoint.setX(ulx-imgReader.getDeltaX()/2.0);</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         llPoint.setY(lry-imgReader.getDeltaY()/2.0);</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span> </div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>         writeRing.addPoint(&ulPoint);</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>         writeRing.addPoint(&urPoint);</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>         writeRing.addPoint(&lrPoint);</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         writeRing.addPoint(&llPoint);</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>     writeLayer=ogrWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPolygon, papszOptions);</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       writeTestLayer=ogrTestWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPolygon, papszOptions);</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       }</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>       std::cout << <span class="stringliteral">"create points in layer "</span> << readLayer->GetName() << std::endl;</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>     <span class="keywordtype">char</span> **papszOptions=NULL;</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span> </div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>     writeLayer=ogrWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPoint, papszOptions);</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>     <span class="keywordflow">if</span>(test_opt.size()){</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       <span class="keywordtype">char</span> **papszOptions=NULL;</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       writeTestLayer=ogrTestWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPoint, papszOptions);</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     }</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       }</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     std::cout << <span class="stringliteral">"copy fields from layer "</span> << ilayer << std::flush << std::endl;</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       ogrWriter.copyFields(sampleReaderOgr,ilayer,ilayerWrite);</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span> </div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <span class="keywordflow">if</span>(test_opt.size()){</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       std::cout << <span class="stringliteral">"copy fields test writer"</span> << std::flush << std::endl;</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     ogrTestWriter.copyFields(sampleReaderOgr,ilayer,ilayerWrite);</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       }</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       <span class="comment">// vector<std::string> fieldnames;</span></div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>       <span class="comment">// if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>       <span class="comment">//    std::cout << "get fields" << std::flush << std::endl;</span></div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       <span class="comment">// sampleReaderOgr.getFields(fieldnames);</span></div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       <span class="comment">// assert(fieldnames.size()==ogrWriter.getFieldCount(ilayerWrite));</span></div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       <span class="comment">// map<std::string,double> pointAttributes;</span></div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span> </div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>     <span class="keywordflow">switch</span>(ruleMap[rule_opt[0]]){</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>     <span class="keywordflow">case</span>(rule::proportion):<span class="comment">//proportion for each class</span></div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     <span class="keywordflow">case</span>(rule::count):{<span class="comment">//count for each class</span></div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>         ostringstream cs;</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>         cs << class_opt[iclass];</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>         ogrWriter.createField(cs.str(),fieldType,ilayerWrite);</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>       }</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>     }</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>     <span class="keywordflow">case</span>(rule::custom):</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>     <span class="keywordflow">case</span>(rule::mode):</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       ogrWriter.createField(label_opt[0],fieldType,ilayerWrite);</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>       ogrTestWriter.createField(label_opt[0],fieldType,ilayerWrite);</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>     }</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>       }</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>       <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>       ostringstream fs;</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>       fs << fieldname_opt[iband];</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>         std::cout << <span class="stringliteral">"creating field "</span> << fs.str() << std::endl;</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span> </div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>       ogrWriter.createField(fs.str(),fieldType,ilayerWrite);</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>       <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>         ogrTestWriter.createField(fs.str(),fieldType,ilayerWrite);</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>     }</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>       }</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>       OGRFeature *readFeature;</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nfeatureLayer=sampleReaderOgr.getFeatureCount(ilayer);</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ntotalvalidLayer=0;</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>       progress=0;</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>       <span class="keywordflow">while</span>( (readFeature = readLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>     <span class="keywordtype">bool</span> validFeature=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>     <span class="keywordtype">bool</span> writeTest=<span class="keyword">false</span>;<span class="comment">//write this feature to test_opt[0] instead of output_opt</span></div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>     <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       std::cout << <span class="stringliteral">"reading feature "</span> << readFeature->GetFID() << std::endl;</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>     <span class="keywordflow">if</span>(theThreshold>0){<span class="comment">//percentual value</span></div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>       <span class="comment">// if(!test_opt.size()&&ntotalvalid>threshold_opt[0]/100.0*nfeature)</span></div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       <span class="comment">//   break;</span></div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>       <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>       p*=100.0;</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       <span class="keywordflow">if</span>(p>theThreshold){</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>           writeTest=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next feature</span></div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>       }</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>     }</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>     <span class="keywordflow">else</span>{<span class="comment">//absolute value</span></div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       <span class="keywordflow">if</span>(threshold_opt.size()==layer_opt.size()){</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>         <span class="keywordflow">if</span>(ntotalvalidLayer>=-theThreshold){</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>           <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         writeTest=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         <span class="keywordflow">continue</span>;<span class="comment">//do not select any more pixels, go to next column feature</span></div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>         }</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>       }</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>         <span class="keywordflow">if</span>(ntotalvalid>=-theThreshold){</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>           <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>         writeTest=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         <span class="keywordflow">continue</span>;<span class="comment">//do not select any more pixels, go to next column feature</span></div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>         }</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>       }</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     }</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>     <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       std::cout << <span class="stringliteral">"processing feature "</span> << readFeature->GetFID() << std::endl;</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>     <span class="comment">//get x and y from readFeature</span></div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>     <span class="keywordtype">double</span> x,y;</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>     poGeometry = readFeature->GetGeometryRef();</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>     assert(poGeometry!=NULL);</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>       <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint ){</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span> </div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>         <span class="keywordflow">if</span>(!buffer_opt.size()){</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           <span class="keywordflow">switch</span>(ruleMap[rule_opt[0]]){</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>           <span class="keywordflow">case</span>(rule::point):</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>           <span class="keywordflow">case</span>(rule::centroid):</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>         buffer_opt.push_back(1);<span class="comment">//default</span></div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>         buffer_opt.push_back(3);<span class="comment">//default</span></div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>           }</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>         }</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span> </div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>           std::cout << <span class="stringliteral">"boundary: "</span> << buffer_opt[0] << std::endl;</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span> </div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>         OGRPolygon writePolygon;</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>         OGRLinearRing writeRing;</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>         OGRPoint writeCentroidPoint;</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>         OGRFeature *writePolygonFeature;</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>         OGRFeature *writeCentroidFeature;</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span> </div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>         OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>         writeCentroidPoint=*poPoint;</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span> </div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>         x=poPoint->getX();</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>         y=poPoint->getY();</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span> </div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>         <span class="keywordtype">double</span> i_centre,j_centre;</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>         <span class="keywordflow">if</span>(geo_opt[0])</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>           imgReader.geo2image(x,y,i_centre,j_centre);</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>           i_centre=x;</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>           j_centre=y;</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>         }</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>         <span class="comment">//nearest neighbour</span></div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>         j_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j_centre);</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>         i_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i_centre);</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span> </div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>         <span class="keywordtype">double</span> uli=i_centre-buffer_opt[0]/2;</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>         <span class="keywordtype">double</span> ulj=j_centre-buffer_opt[0]/2;</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>         <span class="keywordtype">double</span> lri=i_centre+buffer_opt[0]/2;</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>         <span class="keywordtype">double</span> lrj=j_centre+buffer_opt[0]/2;</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span> </div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>         <span class="comment">//nearest neighbour</span></div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span> </div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>         <span class="comment">// if((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</span></div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>         <span class="comment">//   uli=i_centre;</span></div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>         <span class="comment">//   ulj=j_centre;</span></div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>         <span class="comment">//   lri=i_centre;</span></div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>         <span class="comment">//   lrj=j_centre;</span></div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>         <span class="comment">// }</span></div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span> </div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>         <span class="comment">//check if j is out of bounds</span></div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         <span class="keywordflow">if</span>(static_cast<int>(ulj)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj)>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>         <span class="comment">//check if j is out of bounds</span></div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>         <span class="keywordflow">if</span>(static_cast<int>(uli)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri)>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span> </div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>         OGRPoint ulPoint,urPoint,llPoint,lrPoint;</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>         <span class="keywordtype">double</span> ulx,uly;</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>         <span class="keywordtype">double</span> urx,ury;</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span> </div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>           <span class="keywordflow">if</span>(disc_opt[0]){</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         <span class="keywordtype">double</span> radius=buffer_opt[0]/2.0*sqrt(imgReader.getDeltaX()*imgReader.getDeltaY());</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>         <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nstep = 25;</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nstep;++i){</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>           OGRPoint aPoint;</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>           aPoint.setX(x+imgReader.getDeltaX()/2.0+radius*cos(2*PI*i/nstep));</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>           aPoint.setY(y-imgReader.getDeltaY()/2.0+radius*sin(2*PI*i/nstep));</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>           writeRing.addPoint(&aPoint);</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         }</div>
 <div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>         writePolygon.addRing(&writeRing);</div>
 <div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>         writePolygon.closeRings();</div>
 <div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>           }</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>         }</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span> </div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>           uli=i_centre;</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>           ulj=j_centre;</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>           lri=i_centre;</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>           lrj=j_centre;</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>         }</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span> </div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>         <span class="keywordtype">int</span> nPointWindow=0;<span class="comment">//similar to nPointPolygon for polygons</span></div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         }</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>         <span class="keywordtype">double</span> llx,lly;</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>         <span class="keywordtype">double</span> lrx,lry;</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>         imgReader.image2geo(uli,ulj,ulx,uly);</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>         imgReader.image2geo(lri,lrj,lrx,lry);</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>         ulPoint.setX(ulx-imgReader.getDeltaX()/2.0);</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>         ulPoint.setY(uly+imgReader.getDeltaY()/2.0);</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>         lrPoint.setX(lrx+imgReader.getDeltaX()/2.0);</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>         lrPoint.setY(lry-imgReader.getDeltaY()/2.0);</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>         urPoint.setX(lrx+imgReader.getDeltaX()/2.0);</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         urPoint.setY(uly+imgReader.getDeltaY()/2.0);</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>         llPoint.setX(ulx-imgReader.getDeltaX()/2.0);</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>         llPoint.setY(lry-imgReader.getDeltaY()/2.0);</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span> </div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         writeRing.addPoint(&ulPoint);</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         writeRing.addPoint(&urPoint);</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>         writeRing.addPoint(&lrPoint);</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>         writeRing.addPoint(&llPoint);</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>         writePolygon.addRing(&writeRing);</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>         writePolygon.closeRings();</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>           }</div>
 <div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>         }</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> windowValues;</div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>         vector<double> windowClassValues;</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span> </div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>           windowClassValues.resize(class_opt.size());</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>           <span class="comment">//initialize</span></div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>         windowClassValues[iclass]=0;</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>         }</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>           windowValues.resize(nband);</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>         vector< Vector2d<double> > readValues(nband);</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>         }</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span> </div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>         OGRPoint thePoint;</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>         <span class="comment">//check if within raster image</span></div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>         <span class="comment">//no need to check if point is on surface</span></div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>         <span class="keywordtype">double</span> theX=0;</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>         <span class="keywordtype">double</span> theY=0;</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>         imgReader.image2geo(i,j,theX,theY);</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>         thePoint.setX(theX);</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>         thePoint.setY(theY);</div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span> </div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>         <span class="keywordflow">if</span>(disc_opt[0]&&buffer_opt[0]>1){</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>           <span class="keywordtype">double</span> radius=buffer_opt[0]/2.0*sqrt(imgReader.getDeltaX()*imgReader.getDeltaY());</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>           <span class="keywordflow">if</span>((theX-x)*(theX-x)+(theY-y)*(theY-y)>radius*radius)</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span> </div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>           uli=i_centre;</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>           ulj=j_centre;</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>           lri=i_centre;</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>           lrj=j_centre;</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>         }</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span> </div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>         <span class="keywordtype">int</span> nPointWindow=0;<span class="comment">//similar to nPointPolygon for polygons</span></div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>         }</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>         }</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> windowValues;</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>         vector<double> windowClassValues;</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span> </div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>           windowClassValues.resize(class_opt.size());</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>           <span class="comment">//initialize</span></div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>         windowClassValues[iclass]=0;</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>         }</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>           windowValues.resize(nband);</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>         vector< Vector2d<double> > readValues(nband);</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
 <div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>         }</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> </div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>               valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>             }</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>           }</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>         }</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> </div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>         <span class="keywordflow">if</span>(!valid)</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>           validFeature=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> </div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>         <span class="comment">// writeRing.addPoint(&thePoint);//already done</span></div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> </div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>         ++nPointWindow;</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>         OGRFeature *writePointFeature;</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>           <span class="comment">//create feature</span></div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median, sum or centroid (only create point at centroid)</span></div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>             <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>               writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>               writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>               std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>             <span class="comment">//Geometry of readFeature and writePointFeature are both wkbPoint</span></div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>             <span class="comment">//attributes AND geometry are copied with SetFrom</span></div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>             <span class="comment">//test</span></div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>             <span class="comment">// writePointFeature->SetGeometry(&thePoint);</span></div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>             <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>               cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span> </div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>             assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>             <span class="comment">// OGRGeometry *updateGeometry;</span></div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>             <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>             <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>               std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>           }</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>         }</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>           <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>             <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>               windowClassValues[iclass]+=1;</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>           }</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>         }</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>             assert(j-ulj>=0);</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>             assert(j-ulj<readValues[iband].size());</div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>             assert(i-uli>=0);</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>             assert(i-uli<((readValues[iband])[j-ulj]).size());</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>             <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>             <span class="comment">// imgReader.readData(value,GDT_Float64,i,j,theBand);</span></div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>               std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>             <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>               windowValues[iband].push_back(value);</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>             }</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>               <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>               std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>             <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>             <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>             <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>             <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>             <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>               std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>               <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>             }</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>               }</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>               <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>             std::cout << e << std::endl;</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>             exit(1);</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>               }</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>             }<span class="comment">//else</span></div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>           }<span class="comment">//iband</span></div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         }<span class="comment">//else (class_opt.size())</span></div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean or median value (only at centroid)</span></div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>             <span class="comment">//write feature</span></div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>               std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>             <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>               <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in test ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>               }</div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>             }</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>               <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>               }</div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>             }</div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>             <span class="comment">//destroy feature</span></div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>             OGRFeature::DestroyFeature( writePointFeature );</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>             ++ntotalvalid;</div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>               std::cout << <span class="stringliteral">"ntotalvalid(2): "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>           }</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>         }</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>           }</div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>         }</div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>           <span class="comment">//do not create if no points found within polygon</span></div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>           <span class="keywordflow">if</span>(!nPointWindow){</div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>           cout << <span class="stringliteral">"no points found in window, continuing"</span> << endl;</div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>           }</div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>           <span class="comment">//add ring to polygon</span></div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>         <span class="comment">// writePolygon.addRing(&writeRing);//already done</span></div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>         <span class="comment">// writePolygon.closeRings();//already done</span></div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>         <span class="comment">//write geometry of writePolygon</span></div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>         writePolygonFeature->SetGeometry(&writePolygon);</div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>         assert(wkbFlatten(writePolygonFeature->GetGeometryRef()->getGeometryType()) == wkbPolygon);</div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span> </div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>         <span class="comment">//write polygon feature</span></div>
-<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>           }</div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>           <span class="keywordflow">else</span>{<span class="comment">//write value of polygon to centroid point</span></div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>         <span class="comment">//create feature</span></div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>         <span class="comment">//Geometry of readFeature and writeCentroidFeature are both wkbPoint</span></div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>         <span class="comment">//attributes AND geometry are copied with SetFrom</span></div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>         <span class="comment">// writeCentroidFeature->SetGeometry(&writeCentroidPoint);</span></div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span> </div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>         OGRPoint thePoint;</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>         <span class="comment">//check if within raster image</span></div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>         <span class="comment">//no need to check if point is on surface</span></div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>         <span class="keywordtype">double</span> theX=0;</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>         <span class="keywordtype">double</span> theY=0;</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>         imgReader.image2geo(i,j,theX,theY);</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>         thePoint.setX(theX);</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>         thePoint.setY(theY);</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span> </div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>         <span class="keywordflow">if</span>(disc_opt[0]&&buffer_opt[0]>1){</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>           <span class="keywordtype">double</span> radius=buffer_opt[0]/2.0*sqrt(imgReader.getDeltaX()*imgReader.getDeltaY());</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>           <span class="keywordflow">if</span>((theX-x)*(theX-x)+(theY-y)*(theY-y)>radius*radius)</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>         }</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span> </div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>               valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>             }</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>           }</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>         }</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span> </div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>         <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>           validFeature=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span> </div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>         <span class="comment">// writeRing.addPoint(&thePoint);//already done</span></div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span> </div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>         ++nPointWindow;</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>         OGRFeature *writePointFeature;</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>           <span class="comment">//create feature</span></div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median, sum or centroid (only create point at centroid)</span></div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>             <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>               writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>               writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>               std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>             <span class="comment">//Geometry of readFeature and writePointFeature are both wkbPoint</span></div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>             <span class="comment">//attributes AND geometry are copied with SetFrom</span></div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>             <span class="comment">// writePointFeature->SetGeometry(&thePoint);</span></div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>             <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>               cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span> </div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>             assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>             <span class="comment">// OGRGeometry *updateGeometry;</span></div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>             <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>             <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>               std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>           }</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>         }</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>           <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>             <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>               windowClassValues[iclass]+=1;</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>           }</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>         }</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>             assert(j-ulj>=0);</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>             assert(j-ulj<readValues[iband].size());</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>             assert(i-uli>=0);</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>             assert(i-uli<((readValues[iband])[j-ulj]).size());</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>             <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>             <span class="comment">// imgReader.readData(value,GDT_Float64,i,j,theBand);</span></div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>               std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>             <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>               windowValues[iband].push_back(value);</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>             }</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>               <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>               std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>             <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>             <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>             <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>             <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>             <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>               std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>               <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>             }</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>               }</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>               <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>             std::cout << e << std::endl;</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>             exit(1);</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>               }</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>             }<span class="comment">//else</span></div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>           }<span class="comment">//iband</span></div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>         }<span class="comment">//else (class_opt.size())</span></div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean or median value (only at centroid)</span></div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>             <span class="comment">//write feature</span></div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>               std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>             <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>               <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in test ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>               }</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>             }</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>               <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>               }</div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>             }</div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>             <span class="comment">//destroy feature</span></div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>             OGRFeature::DestroyFeature( writePointFeature );</div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>             ++ntotalvalid;</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>             ++ntotalvalidLayer;</div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>           }</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>         }</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>           }</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>         }</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>           <span class="comment">//do not create if no points found within polygon</span></div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>           <span class="keywordflow">if</span>(!nPointWindow){</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>           cout << <span class="stringliteral">"no points found in window, continuing"</span> << endl;</div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>           }</div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>           <span class="comment">//add ring to polygon</span></div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>         <span class="comment">// writePolygon.addRing(&writeRing);//already done</span></div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>         <span class="comment">// writePolygon.closeRings();//already done</span></div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>         <span class="comment">//write geometry of writePolygon</span></div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
 <div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>         <span class="comment">// OGRGeometry *updateGeometry;</span></div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>         <span class="comment">// updateGeometry = writeCentroidFeature->GetGeometryRef();</span></div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>         <span class="comment">// assert(wkbFlatten(updateGeometry->getGeometryType()) == wkbPoint );</span></div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>           }</div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>             std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowValues.size();++index){</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>             <span class="comment">//test</span></div>
-<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>             <span class="keywordflow">if</span>(windowValues[index].size()!=1){</div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>               cerr << <span class="stringliteral">"Error: windowValues[index].size()="</span> << windowValues[index].size() << endl;</div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>               assert(windowValues[index].size()==1);</div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>             }</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>             <span class="keywordtype">double</span> theValue=windowValues[index].back();</div>
-<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span> </div>
-<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>               std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
-<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span> </div>
-<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>               }</div>
-<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>             }</div>
-<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>               exit(1);</div>
-<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>             }</div>
-<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>           }</div>
-<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>         }</div>
-<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
-<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>           <span class="keywordtype">double</span> theValue=0;</div>
-<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowValues.size();++index){</div>
-<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
-<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>             theValue=stat.mean(windowValues[index]);</div>
-<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
-<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>             theValue=sqrt(stat.var(windowValues[index]));</div>
-<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
-<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>             theValue=stat.median(windowValues[index]);</div>
-<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
-<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>             theValue=stat.percentile(windowValues[index],windowValues[index].begin(),windowValues[index].end(),percentile_opt[0]);</div>
-<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
-<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>             theValue=stat.sum(windowValues[index]);</div>
-<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
-<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>             theValue=stat.mymax(windowValues[index]);</div>
-<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
-<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>             theValue=stat.mymin(windowValues[index]);</div>
-<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
-<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>             assert(nPointWindow<=1);</div>
-<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>             assert(nPointWindow==windowValues[index].size());</div>
-<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>             theValue=windowValues[index].back();</div>
-<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>               }</div>
-<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>               <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
-<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>               }</div>
-<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>         writePolygonFeature->SetGeometry(&writePolygon);</div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>         assert(wkbFlatten(writePolygonFeature->GetGeometryRef()->getGeometryType()) == wkbPolygon);</div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span> </div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>         <span class="comment">//write polygon feature</span></div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>           }</div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>           <span class="keywordflow">else</span>{<span class="comment">//write value of polygon to centroid point</span></div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>         <span class="comment">//create feature</span></div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>         <span class="comment">//Geometry of readFeature and writeCentroidFeature are both wkbPoint</span></div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>         <span class="comment">//attributes AND geometry are copied with SetFrom</span></div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>         <span class="comment">// writeCentroidFeature->SetGeometry(&writeCentroidPoint);</span></div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>         <span class="comment">// OGRGeometry *updateGeometry;</span></div>
+<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>         <span class="comment">// updateGeometry = writeCentroidFeature->GetGeometryRef();</span></div>
+<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>         <span class="comment">// assert(wkbFlatten(updateGeometry->getGeometryType()) == wkbPoint );</span></div>
+<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>           }</div>
+<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
+<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
+<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>             std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowValues.size();++index){</div>
+<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>             <span class="keywordflow">if</span>(windowValues[index].size()!=1){</div>
+<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>               cerr << <span class="stringliteral">"Error: windowValues[index].size()="</span> << windowValues[index].size() << endl;</div>
+<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>               assert(windowValues[index].size()==1);</div>
+<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>             }</div>
+<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>             <span class="keywordtype">double</span> theValue=windowValues[index].back();</div>
+<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span> </div>
+<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>               std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
+<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span> </div>
+<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>               }</div>
+<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>             }</div>
+<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>               exit(1);</div>
+<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>             }</div>
+<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>           }</div>
+<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>         }</div>
+<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
+<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>           <span class="keywordtype">double</span> theValue=0;</div>
+<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowValues.size();++index){</div>
+<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
+<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>             theValue=stat.mean(windowValues[index]);</div>
+<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
+<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>             theValue=sqrt(stat.var(windowValues[index]));</div>
+<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
+<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>             theValue=stat.median(windowValues[index]);</div>
+<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
+<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>             theValue=stat.percentile(windowValues[index],windowValues[index].begin(),windowValues[index].end(),percentile_opt[0]);</div>
+<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
+<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>             theValue=stat.sum(windowValues[index]);</div>
+<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
+<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>             theValue=stat.mymax(windowValues[index]);</div>
+<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
+<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>             theValue=stat.mymin(windowValues[index]);</div>
+<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
+<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>             assert(nPointWindow<=1);</div>
+<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>             assert(nPointWindow==windowValues[index].size());</div>
+<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>             theValue=windowValues[index].back();</div>
+<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>               }</div>
+<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>               <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
 <div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>               }</div>
-<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>             }</div>
-<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>               exit(1);</div>
-<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>             }</div>
-<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>           }</div>
-<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>         }</div>
-<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>           }</div>
-<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
-<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){</div>
-<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion)</div>
-<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>             stat.normalize_pct(windowClassValues);</div>
-<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowClassValues.size();++index){</div>
-<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>             <span class="keywordtype">double</span> theValue=windowClassValues[index];</div>
-<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>             ostringstream fs;</div>
-<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>             fs << class_opt[index];</div>
-<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
-<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
-<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>           }</div>
-<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>         }</div>
-<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
-<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
-<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>           stat.normalize_pct(windowClassValues);</div>
-<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>           assert(windowClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
-<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>           <span class="keywordflow">if</span>(windowClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
-<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
-<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(windowClassValues[1]>=75)<span class="comment">//coniferous</span></div>
-<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
-<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(windowClassValues[0]>25&&windowClassValues[1]>25)<span class="comment">//mixed</span></div>
-<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
-<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>               std::cout << <span class="stringliteral">"No valid value in windowClassValues..."</span> << std::endl;</div>
-<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowClassValues.size();++index){</div>
-<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>             <span class="keywordtype">double</span> theValue=windowClassValues[index];</div>
-<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>               }</div>
-<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>               std::cout << std::endl;</div>
-<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>             }</div>
-<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
-<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>           }</div>
-<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>         }</div>
-<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
-<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>           <span class="comment">//maximum votes in polygon</span></div>
-<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>             std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>           <span class="comment">//search for class with maximum votes</span></div>
-<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
-<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>           vector<double>::iterator maxit;</div>
-<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>           maxit=stat.mymax(windowClassValues,windowClassValues.begin(),windowClassValues.end());</div>
-<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>           <span class="keywordtype">int</span> maxIndex=distance(windowClassValues.begin(),maxit);</div>
-<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>           maxClass=class_opt[maxIndex];</div>
-<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
-<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
-<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
-<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>         }</div>
-<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>           }</div>
-<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
-<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>           }</div>
-<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>         }</div>
-<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>           }</div>
-<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>         }</div>
-<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
-<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>           std::cout << <span class="stringliteral">"ntotalvalid(1): "</span> << ntotalvalid << std::endl;</div>
+<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>               }</div>
+<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>               }</div>
+<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>             }</div>
+<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>               exit(1);</div>
+<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>             }</div>
+<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>           }</div>
+<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>         }</div>
+<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>           }</div>
+<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
+<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){</div>
+<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion)</div>
+<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>             stat.normalize_pct(windowClassValues);</div>
+<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowClassValues.size();++index){</div>
+<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>             <span class="keywordtype">double</span> theValue=windowClassValues[index];</div>
+<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>             ostringstream fs;</div>
+<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>             fs << class_opt[index];</div>
+<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>           }</div>
+<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>         }</div>
+<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
+<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
+<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>           stat.normalize_pct(windowClassValues);</div>
+<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>           assert(windowClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
+<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>           <span class="keywordflow">if</span>(windowClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
+<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
+<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(windowClassValues[1]>=75)<span class="comment">//coniferous</span></div>
+<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
+<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(windowClassValues[0]>25&&windowClassValues[1]>25)<span class="comment">//mixed</span></div>
+<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
+<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>               std::cout << <span class="stringliteral">"No valid value in windowClassValues..."</span> << std::endl;</div>
+<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowClassValues.size();++index){</div>
+<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>             <span class="keywordtype">double</span> theValue=windowClassValues[index];</div>
+<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>               }</div>
+<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>               std::cout << std::endl;</div>
+<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>             }</div>
+<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
+<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>           }</div>
+<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>         }</div>
+<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
+<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>           <span class="comment">//maximum votes in polygon</span></div>
+<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>             std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>           <span class="comment">//search for class with maximum votes</span></div>
+<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
+<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>           vector<double>::iterator maxit;</div>
+<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>           maxit=stat.mymax(windowClassValues,windowClassValues.begin(),windowClassValues.end());</div>
+<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>           <span class="keywordtype">int</span> maxIndex=distance(windowClassValues.begin(),maxit);</div>
+<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>           maxClass=class_opt[maxIndex];</div>
+<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
+<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>         }</div>
 <div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>           }</div>
-<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
 <div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
+<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
 <div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
 <div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>             <span class="keywordflow">throw</span>(errorString);</div>
 <div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>           }</div>
 <div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>         }</div>
 <div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>           <span class="comment">//test</span></div>
-<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>           assert(validFeature);</div>
-<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>           }</div>
-<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>         }</div>
-<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
-<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>           }</div>
-<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>         }</div>
-<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>       }<span class="comment">//if wkbPoint</span></div>
-<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
-<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>             </div>
-<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>         OGRPolygon readPolygon = *((OGRPolygon *) poGeometry);</div>
-<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>         OGRPolygon writePolygon;</div>
-<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>         OGRLinearRing writeRing;</div>
-<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>         OGRPoint writeCentroidPoint;</div>
-<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>         OGRFeature *writePolygonFeature;</div>
-<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>         OGRFeature *writeCentroidFeature;</div>
-<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span> </div>
-<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>         readPolygon.closeRings();</div>
-<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span> </div>
-<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>           std::cout << <span class="stringliteral">"get point on polygon"</span> << std::endl;</div>
-<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid)</div>
-<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>           readPolygon.Centroid(&writeCentroidPoint);</div>
-<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(readPolygon.PointOnSurface(&writeCentroidPoint)!=OGRERR_NONE){</div>
-<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>           <span class="comment">// cerr << "function PointOnSurface failed, trying centroid instead" << endl;</span></div>
-<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>           readPolygon.Centroid(&writeCentroidPoint);</div>
-<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>         }</div>
-<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>         <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
-<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>         <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
-<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
-<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>           ulx=writeCentroidPoint.getX();</div>
-<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>           uly=writeCentroidPoint.getY();</div>
-<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>           lrx=ulx;</div>
-<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>           lry=uly;</div>
-<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>         }</div>
-<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>           <span class="comment">//get envelope</span></div>
-<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>         std::cout << <span class="stringliteral">"reading envelope for polygon "</span> << ifeature << std::endl;</div>
-<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>           OGREnvelope* psEnvelope=<span class="keyword">new</span> OGREnvelope();</div>
-<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>           readPolygon.getEnvelope(psEnvelope);</div>
-<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>           ulx=psEnvelope->MinX;</div>
-<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>           uly=psEnvelope->MaxY;</div>
-<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>           lrx=psEnvelope->MaxX;</div>
-<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>           lry=psEnvelope->MinY;</div>
-<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>           <span class="keyword">delete</span> psEnvelope;</div>
-<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>         }</div>
-<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>         <span class="keywordflow">if</span>(geo_opt[0]){</div>
-<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>           imgReader.geo2image(ulx,uly,uli,ulj);</div>
-<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>           imgReader.geo2image(lrx,lry,lri,lrj);</div>
-<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>         }</div>
-<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>           uli=ulx;</div>
-<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>           ulj=uly;</div>
-<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>           lri=lrx;</div>
-<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>           lrj=lry;</div>
-<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>         }</div>
-<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>         <span class="comment">//nearest neighbour</span></div>
-<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
-<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
-<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
-<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
-<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>         <span class="comment">//iterate through all pixels</span></div>
-<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>           std::cout << <span class="stringliteral">"bounding box for polygon feature "</span> << ifeature << <span class="stringliteral">": "</span> << uli << <span class="stringliteral">" "</span> << ulj << <span class="stringliteral">" "</span> << lri << <span class="stringliteral">" "</span> << lrj & [...]
-<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span> </div>
-<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>         <span class="keywordflow">if</span>(uli<0)</div>
-<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>           uli=0;</div>
-<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>         <span class="keywordflow">if</span>(lri<0)</div>
-<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>           lri=0;</div>
-<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>         <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>           uli=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>         <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>           lri=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>         <span class="keywordflow">if</span>(ulj<0)</div>
-<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>           ulj=0;</div>
-<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>         <span class="keywordflow">if</span>(lrj<0)</div>
-<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>           lrj=0;</div>
-<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>         <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>           ulj=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>         <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>           lrj=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>         <span class="comment">// if(uli<0||lri>=imgReader.nrOfCol()||ulj<0||lrj>=imgReader.nrOfRow())</span></div>
-<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>         <span class="comment">//   continue;</span></div>
-<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span> </div>
-<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>         <span class="keywordtype">int</span> nPointPolygon=0;</div>
-<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span> </div>
-<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>         }</div>
-<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>         }</div>
-<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>         <span class="comment">// vector<double> polyValues;</span></div>
-<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> polyValues;</div>
-<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>         vector<double> polyClassValues;</div>
-<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>         </div>
-<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>           }</div>
+<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>         }</div>
+<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
+<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>         ++ntotalvalidLayer;</div>
+<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>           }</div>
+<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
+<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>         <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>           }</div>
+<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>         }</div>
+<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>           assert(validFeature);</div>
+<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>           }</div>
+<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>         }</div>
+<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
+<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>         ++ntotalvalidLayer;</div>
+<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>           }</div>
+<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>         }</div>
+<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>       }<span class="comment">//if wkbPoint</span></div>
+<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
+<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>             </div>
+<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>         OGRPolygon readPolygon = *((OGRPolygon *) poGeometry);</div>
+<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>         OGRPolygon writePolygon;</div>
+<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>         OGRLinearRing writeRing;</div>
+<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>         OGRPoint writeCentroidPoint;</div>
+<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>         OGRFeature *writePolygonFeature;</div>
+<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>         OGRFeature *writeCentroidFeature;</div>
+<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span> </div>
+<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>         readPolygon.closeRings();</div>
+<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span> </div>
+<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>           std::cout << <span class="stringliteral">"get point on polygon"</span> << std::endl;</div>
+<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid)</div>
+<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>           readPolygon.Centroid(&writeCentroidPoint);</div>
+<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(readPolygon.PointOnSurface(&writeCentroidPoint)!=OGRERR_NONE){</div>
+<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>           <span class="comment">// cerr << "function PointOnSurface failed, trying centroid instead" << endl;</span></div>
+<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>           readPolygon.Centroid(&writeCentroidPoint);</div>
+<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>         }</div>
+<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>         <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
+<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>         <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
+<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
+<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>           ulx=writeCentroidPoint.getX();</div>
+<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>           uly=writeCentroidPoint.getY();</div>
+<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>           lrx=ulx;</div>
+<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>           lry=uly;</div>
+<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>         }</div>
+<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>           <span class="comment">//get envelope</span></div>
+<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>         std::cout << <span class="stringliteral">"reading envelope for polygon "</span> << ifeature << std::endl;</div>
+<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>           OGREnvelope* psEnvelope=<span class="keyword">new</span> OGREnvelope();</div>
+<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>           readPolygon.getEnvelope(psEnvelope);</div>
+<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>           ulx=psEnvelope->MinX;</div>
+<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>           uly=psEnvelope->MaxY;</div>
+<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>           lrx=psEnvelope->MaxX;</div>
+<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>           lry=psEnvelope->MinY;</div>
+<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>           <span class="keyword">delete</span> psEnvelope;</div>
+<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>         }</div>
+<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>         <span class="keywordflow">if</span>(geo_opt[0]){</div>
+<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>           imgReader.geo2image(ulx,uly,uli,ulj);</div>
+<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>           imgReader.geo2image(lrx,lry,lri,lrj);</div>
+<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>         }</div>
+<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>           uli=ulx;</div>
+<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>           ulj=uly;</div>
+<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>           lri=lrx;</div>
+<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>           lrj=lry;</div>
+<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>         }</div>
+<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>         <span class="comment">//nearest neighbour</span></div>
+<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
+<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
+<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
+<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
+<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>         <span class="comment">//iterate through all pixels</span></div>
+<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>           std::cout << <span class="stringliteral">"bounding box for polygon feature "</span> << ifeature << <span class="stringliteral">": "</span> << uli << <span class="stringliteral">" "</span> << ulj << <span class="stringliteral">" "</span> << lri << <span class="stringliteral">" "</span> << lrj & [...]
+<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span> </div>
+<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>         <span class="keywordflow">if</span>(uli<0)</div>
+<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>           uli=0;</div>
+<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>         <span class="keywordflow">if</span>(lri<0)</div>
+<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>           lri=0;</div>
+<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>         <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>           uli=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>         <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>           lri=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>         <span class="keywordflow">if</span>(ulj<0)</div>
+<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>           ulj=0;</div>
+<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>         <span class="keywordflow">if</span>(lrj<0)</div>
+<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>           lrj=0;</div>
+<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>         <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>           ulj=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>         <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>           lrj=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>         <span class="comment">// if(uli<0||lri>=imgReader.nrOfCol()||ulj<0||lrj>=imgReader.nrOfRow())</span></div>
+<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>         <span class="comment">//   continue;</span></div>
+<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span> </div>
+<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>         <span class="keywordtype">int</span> nPointPolygon=0;</div>
 <div class="line"><a name="l01643"></a><span class="lineno"> 1643</span> </div>
-<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>           polyClassValues.resize(class_opt.size());</div>
-<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>           <span class="comment">//initialize</span></div>
-<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
-<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>         polyClassValues[iclass]=0;</div>
-<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>         }</div>
-<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>           polyValues.resize(nband);</div>
-<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>         vector< Vector2d<double> > readValues(nband);</div>
-<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
+<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>         }</div>
+<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
 <div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>         }</div>
-<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span> </div>
-<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>         OGRPoint thePoint;</div>
-<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
-<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
-<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>         <span class="comment">//check if within raster image</span></div>
-<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>         <span class="comment">//check if point is on surface</span></div>
-<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>         <span class="keywordtype">double</span> theX=0;</div>
-<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>         <span class="keywordtype">double</span> theY=0;</div>
-<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>         imgReader.image2geo(i,j,theX,theY);</div>
-<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>         thePoint.setX(theX);</div>
-<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>         thePoint.setY(theY);</div>
-<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::centroid&&!readPolygon.Contains(&thePoint))</div>
-<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span> </div>
-<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span> </div>
-<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
-<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
-<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
-<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>               valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>             }</div>
-<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>           }</div>
-<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>         }</div>
-<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span> </div>
-<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>         <span class="keywordflow">if</span>(!valid)</div>
-<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>           validFeature=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span> </div>
-<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>         writeRing.addPoint(&thePoint);<span class="comment">//todo: check if I need to add all interior points to ring or do I need to check if point is on ring first?</span></div>
-<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>         <span class="comment">// if(writeRing.isPointOnRingBoundary(&thePoint))</span></div>
-<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>         <span class="comment">//    writeRing.addPoint(&thePoint);</span></div>
-<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>           std::cout << <span class="stringliteral">"point is on surface:"</span> << thePoint.getX() << <span class="stringliteral">","</span> << thePoint.getY() << std::endl;</div>
-<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>         ++nPointPolygon;</div>
-<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span> </div>
-<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>         <span class="keywordflow">if</span>(polythreshold_opt.size())</div>
-<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>           <span class="keywordflow">if</span>(nPointPolygon>polythreshold_opt[0])</div>
-<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>         <span class="comment">// throw(nPointPolygon);</span></div>
-<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>         OGRFeature *writePointFeature;</div>
-<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>           <span class="comment">//create feature</span></div>
-<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median, sum or centroid (only create point at centroid)</span></div>
-<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>             <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>               writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>               writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>               std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>             <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>               cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>               std::cout << <span class="stringliteral">"set geometry as point "</span> << std::endl;</div>
-<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>             <span class="comment">//test</span></div>
-<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>             writePointFeature->SetGeometry(&thePoint);</div>
-<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>             assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>             <span class="comment">// OGRGeometry *updateGeometry;</span></div>
-<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>             <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
-<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>             <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
-<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>               std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>           }</div>
-<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>         }</div>
-<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>           <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>             <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
-<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>               polyClassValues[iclass]+=1;</div>
-<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>           }</div>
-<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>         }</div>
-<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>             <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>               std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
-<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>             <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point)</div>
-<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>               polyValues[iband].push_back(value);</div>
-<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
-<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>             writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
-<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>             writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
-<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>             assert(0);</div>
-<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>               }</div>
-<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>             }<span class="comment">//else</span></div>
-<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>           }<span class="comment">//iband</span></div>
-<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>         }<span class="comment">//else (class_opt.size())</span></div>
-<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean or median value (only at centroid)</span></div>
-<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>             <span class="comment">//write feature</span></div>
-<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>               std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
-<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>             <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>               <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in test ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>               }</div>
-<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>             }</div>
-<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>               <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>               }</div>
-<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>             }</div>
-<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>             <span class="comment">//destroy feature</span></div>
-<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>             OGRFeature::DestroyFeature( writePointFeature );</div>
-<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>             ++ntotalvalid;</div>
-<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>               std::cout << <span class="stringliteral">"ntotalvalid(2): "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>           }</div>
-<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>         }</div>
-<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>           }</div>
-<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>         }</div>
-<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>           <span class="comment">//do not create if no points found within polygon</span></div>
-<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>           <span class="keywordflow">if</span>(!nPointPolygon){</div>
-<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>           cout << <span class="stringliteral">"no points found in polygon, continuing"</span> << endl;</div>
-<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>           }</div>
-<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>           <span class="comment">//add ring to polygon</span></div>
-<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>         writePolygon.addRing(&writeRing);</div>
-<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>         writePolygon.closeRings();</div>
-<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>         <span class="comment">//write geometry of writePolygon</span></div>
-<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>         <span class="comment">//writePolygonFeature and readFeature are both of type wkbPolygon</span></div>
-<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
-<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
-<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>         <span class="comment">//write polygon feature</span></div>
-<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>           }</div>
-<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>           <span class="keywordflow">else</span>{<span class="comment">//write value of polygon to centroid point</span></div>
-<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>         <span class="comment">//create feature</span></div>
-<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>         writeCentroidFeature->SetGeometry(&writeCentroidPoint);</div>
-<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint );</div>
-<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>           }</div>
-<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
-<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
-<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
-<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>             assert(polyValues[index].size()==1);</div>
-<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>             <span class="keywordtype">double</span> theValue=polyValues[index].back();</div>
-<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span> </div>
-<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
-<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>               }</div>
-<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>             }</div>
-<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>               exit(1);</div>
-<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>             }</div>
-<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>           }</div>
-<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>         }</div>
-<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
-<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>           <span class="keywordtype">double</span> theValue=0;</div>
-<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
-<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
-<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>             theValue=stat.mean(polyValues[index]);</div>
-<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
-<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>             theValue=sqrt(stat.var(polyValues[index]));</div>
-<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
-<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>             theValue=stat.median(polyValues[index]);</div>
-<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
-<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>             theValue=stat.percentile(polyValues[index],polyValues[index].begin(),polyValues[index].end(),percentile_opt[0]);</div>
-<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
-<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>             theValue=stat.sum(polyValues[index]);</div>
-<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
-<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>             theValue=stat.mymax(polyValues[index]);</div>
-<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
-<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>             theValue=stat.mymin(polyValues[index]);</div>
-<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
-<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>             assert(nPointPolygon<=1);</div>
-<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>             assert(nPointPolygon==polyValues[index].size());</div>
-<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>             theValue=polyValues[index].back();</div>
-<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>               }</div>
-<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>               <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
-<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>               }</div>
-<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>               }</div>
-<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>             }</div>
-<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>               exit(1);</div>
-<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>             }</div>
-<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>           }</div>
-<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>         }</div>
-<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>           }</div>
-<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
-<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){</div>
-<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion)</div>
-<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>             stat.normalize_pct(polyClassValues);</div>
-<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
-<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
-<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>             ostringstream fs;</div>
-<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>             fs << class_opt[index];</div>
-<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
-<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>         <span class="comment">// vector<double> polyValues;</span></div>
+<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> polyValues;</div>
+<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>         vector<double> polyClassValues;</div>
+<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>         </div>
+<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span> </div>
+<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>           polyClassValues.resize(class_opt.size());</div>
+<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>           <span class="comment">//initialize</span></div>
+<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>         polyClassValues[iclass]=0;</div>
+<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>         }</div>
+<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>           polyValues.resize(nband);</div>
+<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>         vector< Vector2d<double> > readValues(nband);</div>
+<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
+<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>         }</div>
+<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span> </div>
+<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>         OGRPoint thePoint;</div>
+<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
+<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
+<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>         <span class="comment">//check if within raster image</span></div>
+<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>         <span class="comment">//check if point is on surface</span></div>
+<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>         <span class="keywordtype">double</span> theX=0;</div>
+<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>         <span class="keywordtype">double</span> theY=0;</div>
+<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>         imgReader.image2geo(i,j,theX,theY);</div>
+<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>         thePoint.setX(theX);</div>
+<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>         thePoint.setY(theY);</div>
+<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::centroid&&!readPolygon.Contains(&thePoint))</div>
+<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span> </div>
+<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span> </div>
+<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
+<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
+<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
+<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>               valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>             }</div>
+<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>           }</div>
+<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>         }</div>
+<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span> </div>
+<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>         <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>           validFeature=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span> </div>
+<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>         writeRing.addPoint(&thePoint);<span class="comment">//todo: check if I need to add all interior points to ring or do I need to check if point is on ring first?</span></div>
+<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>         <span class="comment">// if(writeRing.isPointOnRingBoundary(&thePoint))</span></div>
+<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>         <span class="comment">//    writeRing.addPoint(&thePoint);</span></div>
+<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>           std::cout << <span class="stringliteral">"point is on surface:"</span> << thePoint.getX() << <span class="stringliteral">","</span> << thePoint.getY() << std::endl;</div>
+<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>         ++nPointPolygon;</div>
+<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span> </div>
+<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>         <span class="keywordflow">if</span>(polythreshold_opt.size())</div>
+<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>           <span class="keywordflow">if</span>(nPointPolygon>polythreshold_opt[0])</div>
+<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>         <span class="comment">// throw(nPointPolygon);</span></div>
+<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>         OGRFeature *writePointFeature;</div>
+<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
+<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>           <span class="comment">//create feature</span></div>
+<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median, sum or centroid (only create point at centroid)</span></div>
+<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>             <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>               writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>               writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>               std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>             <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>               cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>               std::cout << <span class="stringliteral">"set geometry as point "</span> << std::endl;</div>
+<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>             writePointFeature->SetGeometry(&thePoint);</div>
+<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>             assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>             <span class="comment">// OGRGeometry *updateGeometry;</span></div>
+<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>             <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
+<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>             <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
+<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>               std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>           }</div>
+<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>         }</div>
+<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>           <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>             <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
+<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>               polyClassValues[iclass]+=1;</div>
+<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>           }</div>
+<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>         }</div>
+<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>             <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>               std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
+<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>             <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point)</div>
+<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>               polyValues[iband].push_back(value);</div>
+<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
+<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>             writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
+<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>             writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
+<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>             assert(0);</div>
+<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>               }</div>
+<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>             }<span class="comment">//else</span></div>
+<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>           }<span class="comment">//iband</span></div>
+<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>         }<span class="comment">//else (class_opt.size())</span></div>
+<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
+<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean or median value (only at centroid)</span></div>
+<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>             <span class="comment">//write feature</span></div>
+<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>               std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
+<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>             <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>               <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in test ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>               }</div>
+<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>             }</div>
+<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>               <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>               }</div>
+<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>             }</div>
+<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>             <span class="comment">//destroy feature</span></div>
+<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>             OGRFeature::DestroyFeature( writePointFeature );</div>
+<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>             ++ntotalvalid;</div>
+<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>             ++ntotalvalidLayer;</div>
+<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>           }</div>
+<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>         }</div>
+<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>           }</div>
+<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>         }</div>
+<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>           <span class="comment">//do not create if no points found within polygon</span></div>
+<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>           <span class="keywordflow">if</span>(!nPointPolygon){</div>
+<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>           cout << <span class="stringliteral">"no points found in polygon, continuing"</span> << endl;</div>
+<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>           }</div>
+<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>           <span class="comment">//add ring to polygon</span></div>
+<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>         writePolygon.addRing(&writeRing);</div>
+<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>         writePolygon.closeRings();</div>
+<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>         <span class="comment">//write geometry of writePolygon</span></div>
+<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>         <span class="comment">//writePolygonFeature and readFeature are both of type wkbPolygon</span></div>
+<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
+<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
+<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>         <span class="comment">//write polygon feature</span></div>
+<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>           }</div>
+<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>           <span class="keywordflow">else</span>{<span class="comment">//write value of polygon to centroid point</span></div>
+<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>         <span class="comment">//create feature</span></div>
+<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>         writeCentroidFeature->SetGeometry(&writeCentroidPoint);</div>
+<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint );</div>
+<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>           }</div>
+<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
+<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
+<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
+<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>             assert(polyValues[index].size()==1);</div>
+<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>             <span class="keywordtype">double</span> theValue=polyValues[index].back();</div>
+<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span> </div>
+<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
+<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>               }</div>
+<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>             }</div>
+<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>               exit(1);</div>
+<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>             }</div>
+<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>           }</div>
+<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>         }</div>
+<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
+<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>           <span class="keywordtype">double</span> theValue=0;</div>
+<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
+<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
+<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>             theValue=stat.mean(polyValues[index]);</div>
+<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
+<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>             theValue=sqrt(stat.var(polyValues[index]));</div>
+<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
+<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>             theValue=stat.median(polyValues[index]);</div>
+<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
+<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>             theValue=stat.percentile(polyValues[index],polyValues[index].begin(),polyValues[index].end(),percentile_opt[0]);</div>
+<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
+<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>             theValue=stat.sum(polyValues[index]);</div>
+<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
+<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>             theValue=stat.mymax(polyValues[index]);</div>
+<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
+<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>             theValue=stat.mymin(polyValues[index]);</div>
+<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
+<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>             assert(nPointPolygon<=1);</div>
+<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>             assert(nPointPolygon==polyValues[index].size());</div>
+<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>             theValue=polyValues[index].back();</div>
+<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>               }</div>
+<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>               <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
+<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>               }</div>
+<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>               }</div>
+<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>             }</div>
+<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>               exit(1);</div>
+<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>             }</div>
 <div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>           }</div>
 <div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>         }</div>
-<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
-<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
-<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>           stat.normalize_pct(polyClassValues);</div>
-<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>           assert(polyClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
-<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>           <span class="keywordflow">if</span>(polyClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
-<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
-<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[1]>=75)<span class="comment">//coniferous</span></div>
-<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
-<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[0]>25&&polyClassValues[1]>25)<span class="comment">//mixed</span></div>
-<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
-<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>               std::cout << <span class="stringliteral">"No valid value in polyClassValues..."</span> << std::endl;</div>
-<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
-<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
-<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>               }</div>
-<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>               std::cout << std::endl;</div>
-<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>             }</div>
-<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
-<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>           }</div>
-<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>         }</div>
-<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
-<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>           <span class="comment">//maximum votes in polygon</span></div>
-<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>           <span class="comment">//search for class with maximum votes</span></div>
-<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
-<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>           vector<double>::iterator maxit;</div>
-<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>           maxit=stat.mymax(polyClassValues,polyClassValues.begin(),polyClassValues.end());</div>
-<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>           <span class="keywordtype">int</span> maxIndex=distance(polyClassValues.begin(),maxit);</div>
-<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>           maxClass=class_opt[maxIndex];</div>
-<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
-<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
-<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>           }</div>
+<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
+<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){</div>
+<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion)</div>
+<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>             stat.normalize_pct(polyClassValues);</div>
+<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
+<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
+<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>             ostringstream fs;</div>
+<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>             fs << class_opt[index];</div>
+<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>           }</div>
+<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>         }</div>
+<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
+<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
+<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>           stat.normalize_pct(polyClassValues);</div>
+<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>           assert(polyClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
+<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>           <span class="keywordflow">if</span>(polyClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
+<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
+<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[1]>=75)<span class="comment">//coniferous</span></div>
+<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
+<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[0]>25&&polyClassValues[1]>25)<span class="comment">//mixed</span></div>
+<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
+<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>               std::cout << <span class="stringliteral">"No valid value in polyClassValues..."</span> << std::endl;</div>
+<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
+<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
+<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>               }</div>
+<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>               std::cout << std::endl;</div>
+<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>             }</div>
+<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
+<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>           }</div>
 <div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>         }</div>
-<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>           }</div>
-<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
-<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>           }</div>
-<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>         }</div>
-<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>           }</div>
-<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>         }</div>
-<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
-<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>           std::cout << <span class="stringliteral">"ntotalvalid(1): "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>           }</div>
-<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
-<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>           }</div>
-<div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>         }</div>
-<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>           <span class="comment">//test</span></div>
-<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>           assert(validFeature);</div>
-<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
+<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>           <span class="comment">//maximum votes in polygon</span></div>
+<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>           <span class="comment">//search for class with maximum votes</span></div>
+<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
+<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>           vector<double>::iterator maxit;</div>
+<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>           maxit=stat.mymax(polyClassValues,polyClassValues.begin(),polyClassValues.end());</div>
+<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>           <span class="keywordtype">int</span> maxIndex=distance(polyClassValues.begin(),maxit);</div>
+<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>           maxClass=class_opt[maxIndex];</div>
+<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
+<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>         }</div>
+<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>           }</div>
+<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
+<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>         <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>           }</div>
+<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>         }</div>
+<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>           }</div>
+<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>         }</div>
+<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
+<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>         ++ntotalvalidLayer;</div>
 <div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>           }</div>
-<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>         }</div>
-<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
-<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>           }</div>
-<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>         }</div>
-<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>       }</div>
-<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPolygon){<span class="comment">//todo: try to use virtual OGRGeometry instead of OGRMultiPolygon and OGRPolygon</span></div>
-<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>         OGRMultiPolygon readPolygon = *((OGRMultiPolygon *) poGeometry);</div>
-<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>         OGRPolygon writePolygon;</div>
-<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>         OGRLinearRing writeRing;</div>
-<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>         OGRPoint writeCentroidPoint;</div>
-<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>         OGRFeature *writePolygonFeature;</div>
-<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>         OGRFeature *writeCentroidFeature;</div>
-<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span> </div>
-<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>         readPolygon.closeRings();</div>
-<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span> </div>
-<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>           std::cout << <span class="stringliteral">"get centroid point from polygon"</span> << std::endl;</div>
-<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>         readPolygon.Centroid(&writeCentroidPoint);</div>
-<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span> </div>
-<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>         <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
-<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>         <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
-<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
-<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>           ulx=writeCentroidPoint.getX();</div>
-<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>           uly=writeCentroidPoint.getY();</div>
-<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>           lrx=ulx;</div>
-<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>           lry=uly;</div>
-<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>         }</div>
-<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>           <span class="comment">//get envelope</span></div>
-<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>         std::cout << <span class="stringliteral">"reading envelope for polygon "</span> << ifeature << std::endl;</div>
-<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>           OGREnvelope* psEnvelope=<span class="keyword">new</span> OGREnvelope();</div>
-<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>           readPolygon.getEnvelope(psEnvelope);</div>
-<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>           ulx=psEnvelope->MinX;</div>
-<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>           uly=psEnvelope->MaxY;</div>
-<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>           lrx=psEnvelope->MaxX;</div>
-<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>           lry=psEnvelope->MinY;</div>
-<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>           <span class="keyword">delete</span> psEnvelope;</div>
-<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>         }</div>
-<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>         <span class="comment">// if(geo_opt[0]){</span></div>
-<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>           imgReader.geo2image(ulx,uly,uli,ulj);</div>
-<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>           imgReader.geo2image(lrx,lry,lri,lrj);</div>
-<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>         <span class="comment">// else{</span></div>
-<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>         <span class="comment">//   uli=ulx;</span></div>
-<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>         <span class="comment">//   ulj=uly;</span></div>
-<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>         <span class="comment">//   lri=lrx;</span></div>
-<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>         <span class="comment">//   lrj=lry;</span></div>
-<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>         <span class="comment">//nearest neighbour</span></div>
-<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
-<div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
-<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
-<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
-<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>         <span class="comment">//iterate through all pixels</span></div>
-<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>           std::cout << <span class="stringliteral">"bounding box for multipologon feature "</span> << ifeature << <span class="stringliteral">": "</span> << uli << <span class="stringliteral">" "</span> << ulj << <span class="stringliteral">" "</span> << lri << <span class="stringliteral">" "</span> <<  [...]
-<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span> </div>
-<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>         <span class="keywordflow">if</span>(uli<0)</div>
-<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>           uli=0;</div>
-<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>         <span class="keywordflow">if</span>(lri<0)</div>
-<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>           lri=0;</div>
-<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>         <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>           uli=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>         <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>           lri=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>         <span class="keywordflow">if</span>(ulj<0)</div>
-<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>           ulj=0;</div>
-<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>         <span class="keywordflow">if</span>(lrj<0)</div>
-<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>           lrj=0;</div>
-<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>         <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>           ulj=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>         <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>           lrj=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>         <span class="comment">// if(uli<0||lri>=imgReader.nrOfCol()||ulj<0||lrj>=imgReader.nrOfRow())</span></div>
-<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>         <span class="comment">//   continue;</span></div>
-<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span> </div>
-<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>         <span class="keywordtype">int</span> nPointPolygon=0;</div>
-<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>         }</div>
-<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>         }</div>
-<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>         <span class="comment">// vector<double> polyValues;</span></div>
-<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> polyValues;</div>
-<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>         vector<double> polyClassValues;</div>
-<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span> </div>
-<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>           polyClassValues.resize(class_opt.size());</div>
-<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>           <span class="comment">//initialize</span></div>
-<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
-<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>         polyClassValues[iclass]=0;</div>
-<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>         }</div>
-<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>           polyValues.resize(nband);</div>
-<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>         vector< Vector2d<double> > readValues(nband);</div>
-<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
-<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>         }</div>
-<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span> </div>
-<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>         OGRPoint thePoint;</div>
-<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
-<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
-<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>         <span class="comment">//check if within raster image</span></div>
-<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>         <span class="comment">//check if point is on surface</span></div>
-<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>         <span class="keywordtype">double</span> theX=0;</div>
-<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>         <span class="keywordtype">double</span> theY=0;</div>
-<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>         imgReader.image2geo(i,j,theX,theY);</div>
-<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>         thePoint.setX(theX);</div>
-<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>         thePoint.setY(theY);</div>
+<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
+<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>         <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>           }</div>
+<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>         }</div>
+<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>           assert(validFeature);</div>
+<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>           }</div>
+<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>         }</div>
+<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
+<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>         ++ntotalvalidLayer;</div>
+<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>           }</div>
+<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>         }</div>
+<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>       }</div>
+<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPolygon){<span class="comment">//todo: try to use virtual OGRGeometry instead of OGRMultiPolygon and OGRPolygon</span></div>
+<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>         OGRMultiPolygon readPolygon = *((OGRMultiPolygon *) poGeometry);</div>
+<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>         OGRPolygon writePolygon;</div>
+<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>         OGRLinearRing writeRing;</div>
+<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>         OGRPoint writeCentroidPoint;</div>
+<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>         OGRFeature *writePolygonFeature;</div>
+<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>         OGRFeature *writeCentroidFeature;</div>
+<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span> </div>
+<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>         readPolygon.closeRings();</div>
+<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span> </div>
+<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>           std::cout << <span class="stringliteral">"get centroid point from polygon"</span> << std::endl;</div>
+<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>         readPolygon.Centroid(&writeCentroidPoint);</div>
+<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span> </div>
+<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>         <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
+<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>         <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
+<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
+<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>           ulx=writeCentroidPoint.getX();</div>
+<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>           uly=writeCentroidPoint.getY();</div>
+<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>           lrx=ulx;</div>
+<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>           lry=uly;</div>
+<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>         }</div>
+<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>           <span class="comment">//get envelope</span></div>
+<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>         std::cout << <span class="stringliteral">"reading envelope for polygon "</span> << ifeature << std::endl;</div>
+<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>           OGREnvelope* psEnvelope=<span class="keyword">new</span> OGREnvelope();</div>
+<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>           readPolygon.getEnvelope(psEnvelope);</div>
+<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>           ulx=psEnvelope->MinX;</div>
+<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>           uly=psEnvelope->MaxY;</div>
+<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>           lrx=psEnvelope->MaxX;</div>
+<div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>           lry=psEnvelope->MinY;</div>
+<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>           <span class="keyword">delete</span> psEnvelope;</div>
+<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>         }</div>
+<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>         <span class="comment">// if(geo_opt[0]){</span></div>
+<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>           imgReader.geo2image(ulx,uly,uli,ulj);</div>
+<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>           imgReader.geo2image(lrx,lry,lri,lrj);</div>
+<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>         <span class="comment">// }</span></div>
+<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>         <span class="comment">// else{</span></div>
+<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>         <span class="comment">//   uli=ulx;</span></div>
+<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>         <span class="comment">//   ulj=uly;</span></div>
+<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>         <span class="comment">//   lri=lrx;</span></div>
+<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>         <span class="comment">//   lrj=lry;</span></div>
+<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>         <span class="comment">// }</span></div>
+<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>         <span class="comment">//nearest neighbour</span></div>
+<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
+<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
+<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
+<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
+<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>         <span class="comment">//iterate through all pixels</span></div>
+<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>           std::cout << <span class="stringliteral">"bounding box for multipologon feature "</span> << ifeature << <span class="stringliteral">": "</span> << uli << <span class="stringliteral">" "</span> << ulj << <span class="stringliteral">" "</span> << lri << <span class="stringliteral">" "</span> <<  [...]
+<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span> </div>
+<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>         <span class="keywordflow">if</span>(uli<0)</div>
+<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>           uli=0;</div>
+<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>         <span class="keywordflow">if</span>(lri<0)</div>
+<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>           lri=0;</div>
+<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>         <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>           uli=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>         <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>           lri=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>         <span class="keywordflow">if</span>(ulj<0)</div>
+<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>           ulj=0;</div>
+<div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>         <span class="keywordflow">if</span>(lrj<0)</div>
+<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>           lrj=0;</div>
+<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>         <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>           ulj=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>         <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>           lrj=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>         <span class="comment">// if(uli<0||lri>=imgReader.nrOfCol()||ulj<0||lrj>=imgReader.nrOfRow())</span></div>
+<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>         <span class="comment">//   continue;</span></div>
+<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span> </div>
+<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>         <span class="keywordtype">int</span> nPointPolygon=0;</div>
+<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>         }</div>
+<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>         }</div>
+<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>         <span class="comment">// vector<double> polyValues;</span></div>
+<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> polyValues;</div>
+<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>         vector<double> polyClassValues;</div>
+<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span> </div>
+<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>           polyClassValues.resize(class_opt.size());</div>
+<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>           <span class="comment">//initialize</span></div>
+<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>         polyClassValues[iclass]=0;</div>
+<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>         }</div>
+<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>           polyValues.resize(nband);</div>
+<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>         vector< Vector2d<double> > readValues(nband);</div>
+<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
+<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>         }</div>
 <div class="line"><a name="l02135"></a><span class="lineno"> 2135</span> </div>
-<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::centroid&&!readPolygon.Contains(&thePoint))</div>
-<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span> </div>
-<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span> </div>
-<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
-<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
-<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
-<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>               valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>             }</div>
-<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>           }</div>
-<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>         }</div>
+<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>         OGRPoint thePoint;</div>
+<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
+<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
+<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>         <span class="comment">//check if within raster image</span></div>
+<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>         <span class="comment">//check if point is on surface</span></div>
+<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>         <span class="keywordtype">double</span> theX=0;</div>
+<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>         <span class="keywordtype">double</span> theY=0;</div>
+<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>         imgReader.image2geo(i,j,theX,theY);</div>
+<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>         thePoint.setX(theX);</div>
+<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>         thePoint.setY(theY);</div>
 <div class="line"><a name="l02150"></a><span class="lineno"> 2150</span> </div>
-<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>         <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::centroid&&!readPolygon.Contains(&thePoint))</div>
 <div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>           validFeature=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>         </div>
-<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>         writeRing.addPoint(&thePoint);</div>
-<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>         <span class="comment">// if(writeRing.isPointOnRingBoundary(&thePoint))</span></div>
-<div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>         <span class="comment">//    writeRing.addPoint(&thePoint);</span></div>
-<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>             std::cout << <span class="stringliteral">"point is on surface:"</span> << thePoint.getX() << <span class="stringliteral">","</span> << thePoint.getY() << std::endl;</div>
-<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>           ++nPointPolygon;</div>
-<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span> </div>
-<div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>           <span class="keywordflow">if</span>(polythreshold_opt.size())</div>
-<div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>             <span class="keywordflow">if</span>(nPointPolygon>polythreshold_opt[0])</div>
-<div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>               <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>           <span class="comment">// throw(nPointPolygon);</span></div>
-<div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>           OGRFeature *writePointFeature;</div>
-<div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>           <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>             <span class="comment">//create feature</span></div>
-<div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>             <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median or sum (only create point at centroid)</span></div>
-<div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>               <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>             writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>             writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>             std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>               <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>             cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>             std::cout << <span class="stringliteral">"set geometry as point "</span> << std::endl;</div>
-<div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>               <span class="comment">//test</span></div>
-<div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>               writePointFeature->SetGeometry(&thePoint);</div>
-<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>               assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>               <span class="comment">// OGRGeometry *updateGeometry;</span></div>
-<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>               <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
-<div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>               <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
-<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>             std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>             }</div>
-<div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>           }</div>
-<div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>           <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>             <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>               <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
-<div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>             polyClassValues[iclass]+=1;</div>
-<div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>             }</div>
-<div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>           }</div>
-<div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>               <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>             std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
-<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>               <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point)</div>
-<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>             polyValues[iband].push_back(value);</div>
-<div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>               <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>               std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
-<div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>             <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>             <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>             <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
-<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>             <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
-<div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>             <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>               assert(0);</div>
-<div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>             }</div>
-<div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>               }<span class="comment">//else</span></div>
-<div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>             }<span class="comment">//iband</span></div>
-<div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>           }<span class="comment">//else (class_opt.size())</span></div>
-<div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>           <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>             <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev or median value (only at centroid)</span></div>
-<div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>               <span class="comment">//write feature</span></div>
-<div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>             std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
-<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>               <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>             <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>               std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>               <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>             }</div>
-<div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>               }</div>
-<div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>               <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>             <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>               std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>               <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>             }</div>
-<div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>               }</div>
-<div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>               <span class="comment">//destroy feature</span></div>
-<div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>               OGRFeature::DestroyFeature( writePointFeature );</div>
-<div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>             }</div>
-<div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>           }</div>
-<div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>           <span class="comment">// ++isample;</span></div>
-<div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>           ++ntotalvalid;</div>
-<div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>             std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>           }</div>
-<div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>         }</div>
-<div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>         <span class="keywordflow">if</span>(!validFeature)</div>
-<div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>           <span class="comment">//do not create if no points found within polygon</span></div>
-<div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>           <span class="keywordflow">if</span>(!nPointPolygon)</div>
-<div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>           <span class="comment">//add ring to polygon</span></div>
-<div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>         writePolygon.addRing(&writeRing);</div>
-<div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>         writePolygon.closeRings();</div>
-<div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>         <span class="comment">//write geometry of writePolygon</span></div>
-<div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>         <span class="comment">//writePolygon and readFeature are from geometry type wkbMultiPolygon</span></div>
-<div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
-<div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>         assert(writePolygonFeature->GetGeometryRef()->getGeometryType()==wkbMultiPolygon);</div>
-<div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
-<div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>         <span class="comment">//write polygon feature</span></div>
-<div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>           }</div>
-<div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>           <span class="keywordflow">else</span>{<span class="comment">//write band information of polygon to centroid point</span></div>
-<div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>         <span class="comment">//create feature</span></div>
-<div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>         writeCentroidFeature->SetGeometry(&writeCentroidPoint);</div>
-<div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span> </div>
+<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span> </div>
+<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
+<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
+<div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
+<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>               valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>             }</div>
+<div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>           }</div>
+<div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>         }</div>
+<div class="line"><a name="l02165"></a><span class="lineno"> 2165</span> </div>
+<div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>         <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>           validFeature=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>         </div>
+<div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>         writeRing.addPoint(&thePoint);</div>
+<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>         <span class="comment">// if(writeRing.isPointOnRingBoundary(&thePoint))</span></div>
+<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>         <span class="comment">//    writeRing.addPoint(&thePoint);</span></div>
+<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>             std::cout << <span class="stringliteral">"point is on surface:"</span> << thePoint.getX() << <span class="stringliteral">","</span> << thePoint.getY() << std::endl;</div>
+<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>           ++nPointPolygon;</div>
+<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span> </div>
+<div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>           <span class="keywordflow">if</span>(polythreshold_opt.size())</div>
+<div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>             <span class="keywordflow">if</span>(nPointPolygon>polythreshold_opt[0])</div>
+<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>               <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>           <span class="comment">// throw(nPointPolygon);</span></div>
+<div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>           OGRFeature *writePointFeature;</div>
+<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>           <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
+<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>             <span class="comment">//create feature</span></div>
+<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>             <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median or sum (only create point at centroid)</span></div>
+<div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>               <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>             writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>             writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>             std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>               <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>             cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>             std::cout << <span class="stringliteral">"set geometry as point "</span> << std::endl;</div>
+<div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>               <span class="comment">//test</span></div>
+<div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>               writePointFeature->SetGeometry(&thePoint);</div>
+<div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>               assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>               <span class="comment">// OGRGeometry *updateGeometry;</span></div>
+<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>               <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
+<div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>               <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
+<div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>             std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>             }</div>
+<div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>           }</div>
+<div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>           <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>             <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>               <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
+<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>             polyClassValues[iclass]+=1;</div>
+<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>             }</div>
+<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>           }</div>
+<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>               <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>             std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
+<div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>               <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point)</div>
+<div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>             polyValues[iband].push_back(value);</div>
+<div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>               <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>               std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
+<div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>             <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>             <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>             <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
+<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>             <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
+<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>             <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>               assert(0);</div>
+<div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>             }</div>
+<div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>               }<span class="comment">//else</span></div>
+<div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>             }<span class="comment">//iband</span></div>
+<div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>           }<span class="comment">//else (class_opt.size())</span></div>
+<div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>           <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
+<div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>             <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev or median value (only at centroid)</span></div>
+<div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>               <span class="comment">//write feature</span></div>
+<div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>             std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
+<div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>               <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>             <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>               std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>               <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>             }</div>
+<div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>               }</div>
+<div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>               <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>             <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>               std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>               <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>             }</div>
+<div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>               }</div>
+<div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>               <span class="comment">//destroy feature</span></div>
+<div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>               OGRFeature::DestroyFeature( writePointFeature );</div>
+<div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>             }</div>
+<div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>           }</div>
+<div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>           <span class="comment">// ++isample;</span></div>
+<div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>           ++ntotalvalid;</div>
+<div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>           ++ntotalvalidLayer;</div>
+<div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>           }</div>
+<div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>         }</div>
+<div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>         <span class="keywordflow">if</span>(!validFeature)</div>
+<div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>           <span class="comment">//do not create if no points found within polygon</span></div>
+<div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>           <span class="keywordflow">if</span>(!nPointPolygon)</div>
+<div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>           <span class="comment">//add ring to polygon</span></div>
+<div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>         writePolygon.addRing(&writeRing);</div>
+<div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>         writePolygon.closeRings();</div>
+<div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>         <span class="comment">//write geometry of writePolygon</span></div>
+<div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>         <span class="comment">//writePolygon and readFeature are from geometry type wkbMultiPolygon</span></div>
+<div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
+<div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>         assert(writePolygonFeature->GetGeometryRef()->getGeometryType()==wkbMultiPolygon);</div>
 <div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>           }</div>
-<div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
-<div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
-<div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
-<div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>             <span class="comment">//test</span></div>
-<div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>             assert(polyValues[index].size()==1);</div>
-<div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>             <span class="keywordtype">double</span> theValue=polyValues[index].back();</div>
-<div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
-<div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>               }</div>
-<div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>             }</div>
-<div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>               exit(1);</div>
-<div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>             }</div>
-<div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>           }</div>
-<div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>         }</div>
-<div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
-<div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>           <span class="keywordtype">double</span> theValue=0;</div>
-<div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
-<div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
-<div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>             theValue=stat.mean(polyValues[index]);</div>
-<div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
-<div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>             theValue=sqrt(stat.var(polyValues[index]));</div>
-<div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
-<div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>             theValue=stat.median(polyValues[index]);</div>
-<div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
-<div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>             theValue=stat.percentile(polyValues[index],polyValues[index].begin(),polyValues[index].end(),percentile_opt[0]);</div>
-<div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
-<div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>             theValue=stat.sum(polyValues[index]);</div>
-<div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
-<div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>             theValue=stat.mymax(polyValues[index]);</div>
-<div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
-<div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>             theValue=stat.mymin(polyValues[index]);</div>
-<div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
-<div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>             assert(nPointPolygon<=1);</div>
-<div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>             assert(nPointPolygon==polyValues[index].size());</div>
-<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>             theValue=polyValues[index].back();</div>
-<div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>               }</div>
-<div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>               <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
-<div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>               }</div>
-<div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>               }</div>
-<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>             }</div>
-<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>               exit(1);</div>
-<div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>             }</div>
-<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>           }</div>
-<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>         }</div>
-<div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>           }</div>
-<div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
-<div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){</div>
-<div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion)</div>
-<div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>             stat.normalize_pct(polyClassValues);</div>
-<div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
-<div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
-<div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>             ostringstream fs;</div>
-<div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>             fs << class_opt[index];</div>
-<div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
-<div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
-<div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>           }</div>
-<div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>         }</div>
-<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
-<div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
-<div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>           stat.normalize_pct(polyClassValues);</div>
-<div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>           assert(polyClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
-<div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>           <span class="keywordflow">if</span>(polyClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
-<div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
-<div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[1]>=75)<span class="comment">//coniferous</span></div>
-<div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
-<div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[0]>25&&polyClassValues[1]>25)<span class="comment">//mixed</span></div>
-<div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
-<div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>               std::cout << <span class="stringliteral">"No valid value in polyClassValues..."</span> << std::endl;</div>
-<div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
-<div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
-<div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>               }</div>
-<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>               std::cout << std::endl;</div>
-<div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>             }</div>
-<div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
-<div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>           }</div>
-<div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>         }</div>
-<div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
-<div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>           <span class="comment">//maximum votes in polygon</span></div>
-<div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>           <span class="comment">//search for class with maximum votes</span></div>
-<div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
-<div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>           vector<double>::iterator maxit;</div>
-<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>           maxit=stat.mymax(polyClassValues,polyClassValues.begin(),polyClassValues.end());</div>
-<div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>           <span class="keywordtype">int</span> maxIndex=distance(polyClassValues.begin(),maxit);</div>
-<div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>           maxClass=class_opt[maxIndex];</div>
-<div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
-<div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
-<div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
-<div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>         }</div>
-<div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>           }</div>
-<div class="line"><a name="l02440"></a><span class="lineno"> 2440</span> </div>
-<div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
-<div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>           }</div>
-<div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>         }</div>
-<div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>           }</div>
-<div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>         }</div>
-<div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
-<div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>           }</div>
-<div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
-<div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
+<div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>         <span class="comment">//write polygon feature</span></div>
+<div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>           }</div>
+<div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>           <span class="keywordflow">else</span>{<span class="comment">//write band information of polygon to centroid point</span></div>
+<div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>         <span class="comment">//create feature</span></div>
+<div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>         writeCentroidFeature->SetGeometry(&writeCentroidPoint);</div>
+<div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>           }</div>
+<div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
+<div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
+<div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
+<div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>             assert(polyValues[index].size()==1);</div>
+<div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>             <span class="keywordtype">double</span> theValue=polyValues[index].back();</div>
+<div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
+<div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>               }</div>
+<div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>             }</div>
+<div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>               exit(1);</div>
+<div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>             }</div>
+<div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>           }</div>
+<div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>         }</div>
+<div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
+<div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>           <span class="keywordtype">double</span> theValue=0;</div>
+<div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
+<div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
+<div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>             theValue=stat.mean(polyValues[index]);</div>
+<div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
+<div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>             theValue=sqrt(stat.var(polyValues[index]));</div>
+<div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
+<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>             theValue=stat.median(polyValues[index]);</div>
+<div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
+<div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>             theValue=stat.percentile(polyValues[index],polyValues[index].begin(),polyValues[index].end(),percentile_opt[0]);</div>
+<div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
+<div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>             theValue=stat.sum(polyValues[index]);</div>
+<div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
+<div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>             theValue=stat.mymax(polyValues[index]);</div>
+<div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
+<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>             theValue=stat.mymin(polyValues[index]);</div>
+<div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
+<div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>             assert(nPointPolygon<=1);</div>
+<div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>             assert(nPointPolygon==polyValues[index].size());</div>
+<div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>             theValue=polyValues[index].back();</div>
+<div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>               }</div>
+<div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>               <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
+<div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>               }</div>
+<div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>               }</div>
+<div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>             }</div>
+<div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>               exit(1);</div>
+<div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>             }</div>
+<div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>           }</div>
+<div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>         }</div>
+<div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>           }</div>
+<div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
+<div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){</div>
+<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion)</div>
+<div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>             stat.normalize_pct(polyClassValues);</div>
+<div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
+<div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
+<div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>             ostringstream fs;</div>
+<div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>             fs << class_opt[index];</div>
+<div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>           }</div>
+<div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>         }</div>
+<div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
+<div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
+<div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>           stat.normalize_pct(polyClassValues);</div>
+<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>           assert(polyClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
+<div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>           <span class="keywordflow">if</span>(polyClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
+<div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
+<div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[1]>=75)<span class="comment">//coniferous</span></div>
+<div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
+<div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[0]>25&&polyClassValues[1]>25)<span class="comment">//mixed</span></div>
+<div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
+<div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>               std::cout << <span class="stringliteral">"No valid value in polyClassValues..."</span> << std::endl;</div>
+<div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
+<div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
+<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>               }</div>
+<div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>               std::cout << std::endl;</div>
+<div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>             }</div>
+<div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
+<div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>           }</div>
+<div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>         }</div>
+<div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
+<div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>           <span class="comment">//maximum votes in polygon</span></div>
+<div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>           <span class="comment">//search for class with maximum votes</span></div>
+<div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
+<div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>           vector<double>::iterator maxit;</div>
+<div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>           maxit=stat.mymax(polyClassValues,polyClassValues.begin(),polyClassValues.end());</div>
+<div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>           <span class="keywordtype">int</span> maxIndex=distance(polyClassValues.begin(),maxit);</div>
+<div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>           maxClass=class_opt[maxIndex];</div>
+<div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
+<div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>         }</div>
+<div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>           }</div>
+<div class="line"><a name="l02454"></a><span class="lineno"> 2454</span> </div>
+<div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
+<div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>         <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>           }</div>
+<div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>         }</div>
+<div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
 <div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>             <span class="keywordflow">throw</span>(errorString);</div>
 <div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>           }</div>
 <div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>         }</div>
-<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>           <span class="comment">//test</span></div>
-<div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>           assert(validFeature);</div>
-<div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>           }</div>
-<div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>         }</div>
-<div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
-<div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>           }</div>
-<div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>         }</div>
-<div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>       }</div>
-<div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>         std::string test;</div>
-<div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>         test=poGeometry->getGeometryName();</div>
-<div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>         ostringstream oss;</div>
-<div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>         oss << <span class="stringliteral">"geometry "</span> << test << <span class="stringliteral">" not supported"</span>;</div>
-<div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>         <span class="keywordflow">throw</span>(oss.str());</div>
-<div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>       }</div>
-<div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>       ++ifeature;</div>
-<div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1)/nfeature;</div>
-<div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>     }</div>
-<div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>     <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>       std::cout << e << std::endl;</div>
-<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>     }</div>
-<div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">int</span> npoint){</div>
-<div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>         std::cout << <span class="stringliteral">"number of points read in polygon: "</span> << npoint << std::endl;</div>
-<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>     }</div>
-<div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>       }<span class="comment">//end of getNextFeature</span></div>
-<div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>       <span class="comment">// if(rbox_opt[0]>0||cbox_opt[0]>0)</span></div>
-<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>       <span class="comment">//   boxWriter.close();</span></div>
-<div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>       progress=1.0;</div>
-<div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>       ++ilayerWrite;</div>
-<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>     }<span class="comment">//for ilayer</span></div>
-<div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>     sampleReaderOgr.close();</div>
-<div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>     ogrWriter.close();</div>
-<div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>       ogrTestWriter.close();</div>
-<div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>   }<span class="comment">//else (vector)</span></div>
-<div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>   progress=1.0;</div>
-<div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>   imgReader.close();</div>
-<div class="line"><a name="l02520"></a><span class="lineno"> 2520</span> }</div>
-<div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>   </div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
+<div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>         ++ntotalvalidLayer;</div>
+<div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>           }</div>
+<div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
+<div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>         <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>           }</div>
+<div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>         }</div>
+<div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>           assert(validFeature);</div>
+<div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>           }</div>
+<div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>         }</div>
+<div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
+<div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>         ++ntotalvalidLayer;</div>
+<div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>           }</div>
+<div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>         }</div>
+<div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>       }</div>
+<div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>         std::string test;</div>
+<div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>         test=poGeometry->getGeometryName();</div>
+<div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>         ostringstream oss;</div>
+<div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>         oss << <span class="stringliteral">"geometry "</span> << test << <span class="stringliteral">" not supported"</span>;</div>
+<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>         <span class="keywordflow">throw</span>(oss.str());</div>
+<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>       }</div>
+<div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>       ++ifeature;</div>
+<div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>       <span class="keywordflow">if</span>(theThreshold>0){</div>
+<div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>         <span class="keywordflow">if</span>(threshold_opt.size()==layer_opt.size())</div>
+<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>           progress=(100.0/theThreshold)*<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ntotalvalidLayer)/nfeatureLayer;</div>
+<div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>           progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ntotalvalidLayer)/nfeatureLayer;</div>
+<div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>       }</div>
+<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1)/(-theThreshold);</div>
+<div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>     }</div>
+<div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>     <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>       std::cout << e << std::endl;</div>
+<div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>     }</div>
+<div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">int</span> npoint){</div>
+<div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>         std::cout << <span class="stringliteral">"number of points read in polygon: "</span> << npoint << std::endl;</div>
+<div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>     }</div>
+<div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>       }<span class="comment">//end of getNextFeature</span></div>
+<div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>       <span class="comment">// if(rbox_opt[0]>0||cbox_opt[0]>0)</span></div>
+<div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>       <span class="comment">//   boxWriter.close();</span></div>
+<div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>       progress=1.0;</div>
+<div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>       ++ilayerWrite;</div>
+<div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>     }<span class="comment">//for ilayer</span></div>
+<div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>     sampleReaderOgr.close();</div>
+<div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>     ogrWriter.close();</div>
+<div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>       ogrTestWriter.close();</div>
+<div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>   }<span class="comment">//else (vector)</span></div>
+<div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>   progress=1.0;</div>
+<div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>   imgReader.close();</div>
+<div class="line"><a name="l02539"></a><span class="lineno"> 2539</span> }</div>
+<div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>   </div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
@@ -2499,7 +2518,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract_8py_source.html b/doc/html/pkextract_8py_source.html
index 1d5fc49..370f837 100644
--- a/doc/html/pkextract_8py_source.html
+++ b/doc/html/pkextract_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -260,7 +260,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__grid_8py_source.html b/doc/html/pkextract__grid_8py_source.html
index 04fc7cd..6bd9794 100644
--- a/doc/html/pkextract__grid_8py_source.html
+++ b/doc/html/pkextract__grid_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -246,7 +246,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__gui_2main_8cpp_source.html b/doc/html/pkextract__gui_2main_8cpp_source.html
index c79138e..4aa9fe8 100644
--- a/doc/html/pkextract__gui_2main_8cpp_source.html
+++ b/doc/html/pkextract__gui_2main_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__gui_2mainwindow_8cpp_source.html b/doc/html/pkextract__gui_2mainwindow_8cpp_source.html
index 64d2557..8eff472 100644
--- a/doc/html/pkextract__gui_2mainwindow_8cpp_source.html
+++ b/doc/html/pkextract__gui_2mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -262,7 +262,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__gui_2mainwindow_8h_source.html b/doc/html/pkextract__gui_2mainwindow_8h_source.html
index 0cec9f7..19a6c02 100644
--- a/doc/html/pkextract__gui_2mainwindow_8h_source.html
+++ b/doc/html/pkextract__gui_2mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -103,7 +103,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__random_8py_source.html b/doc/html/pkextract__random_8py_source.html
index 3649d14..41c1eab 100644
--- a/doc/html/pkextract__random_8py_source.html
+++ b/doc/html/pkextract__random_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -249,7 +249,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfillnodata.html b/doc/html/pkfillnodata.html
index 78cdb54..0dfb4f3 100644
--- a/doc/html/pkfillnodata.html
+++ b/doc/html/pkfillnodata.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@ Usage: pkfillnodata -i input.txt -m mask -o output </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfillnodata_8cc_source.html b/doc/html/pkfillnodata_8cc_source.html
index aec31b2..5ec617c 100644
--- a/doc/html/pkfillnodata_8cc_source.html
+++ b/doc/html/pkfillnodata_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -208,7 +208,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilter.html b/doc/html/pkfilter.html
index b7b3201..154e053 100644
--- a/doc/html/pkfilter.html
+++ b/doc/html/pkfilter.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -82,6 +82,8 @@ Implemented as either moving window or statistical function in spectral/temporal
 <tr>
 <th>filter </th><th>description  </th></tr>
 <tr>
+<td>nvalid </td><td>report number of valid (not nodata) values in window </td></tr>
+<tr>
 <td>median </td><td>perform a median filter in spatial (dx, dy) or spectral/temporal (dz) domain </td></tr>
 <tr>
 <td>var </td><td>calculate variance in window </td></tr>
@@ -187,7 +189,7 @@ Options</h1>
 <tr>
 <td>o </td><td>output </td><td>std::string </td><td></td><td>Output image file </td></tr>
 <tr>
-<td>f </td><td>filter </td><td>std::string </td><td></td><td>filter function (median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel must be different than all other pixels within window), sobelx (horizontal edge detection), sobely (vertical edge detection), sobelxy (diagonal edge detection NE-SW),sobelyx (diagonal edge detection NW-SE), density, countid, mode (majority voting, only f [...]
+<td>f </td><td>filter </td><td>std::string </td><td></td><td>filter function (nvalid, median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel must be different than all other pixels within window), sobelx (horizontal edge detection), sobely (vertical edge detection), sobelxy (diagonal edge detection NE-SW),sobelyx (diagonal edge detection NW-SE), density, countid, mode (majority voting [...]
 <tr>
 <td>srf </td><td>srf </td><td>std::string </td><td></td><td>list of ASCII files containing spectral response functions (two columns: wavelength response) </td></tr>
 <tr>
@@ -239,7 +241,7 @@ Options</h1>
 <tr>
 <td>ot </td><td>otype </td><td>std::string </td><td></td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td></td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). </td></tr>
 <tr>
 <td>ct </td><td>ct </td><td>std::string </td><td></td><td>color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table </td></tr>
 <tr>
@@ -253,7 +255,7 @@ Usage: pkfilter -i input -o ouptut [-f filter | -perc value | -srf file [-srf fi
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilter_8cc_source.html b/doc/html/pkfilter_8cc_source.html
index f395259..7ad3d5a 100644
--- a/doc/html/pkfilter_8cc_source.html
+++ b/doc/html/pkfilter_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -89,939 +89,940 @@
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="preprocessor">#include "algorithms/StatFactory.h"</span></div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> </div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span> <span class="comment">/*------------------</span></div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span> <span class="comment">  Main procedure</span></div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span> <span class="comment">  ----------------*/</span></div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> input_opt(<span class="stringliteral">"i"</span>,<span class="stringliteral">"input"</span>,<span class="stringliteral">"input image file"</span>);</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   <span class="comment">// Optionpk<std::string> tmpdir_opt("tmp", "tmp", "Temporary directory","/tmp",2);</span></div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> disc_opt(<span class="stringliteral">"circ"</span>, <span class="stringliteral">"circular"</span>, <span class="stringliteral">"circular disc kernel for dilation and erosion"</span>, <span class="keyword">false</span>);</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   <span class="comment">// Optionpk<double> angle_opt("a", "angle", "angle used for directional filtering in dilation (North=0, East=90, South=180, West=270).");</span></div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> method_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"filter"</span>, <span class="stringliteral">"filter function (median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel must be dif [...]
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> resample_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"resampling-method"</span>, <span class="stringliteral">"Resampling method for shifting operation (near: nearest neighbour, bilinear: bi-linear interpolation)."</span>, <span class="stringliteral">"near"</span>);</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dimX_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"filter kernel size in x, use odd values only"</span>, 3);</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dimY_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"filter kernel size in y, use odd values only"</span>, 3);</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> dimZ_opt(<span class="stringliteral">"dz"</span>, <span class="stringliteral">"dz"</span>, <span class="stringliteral">"filter kernel size in z (spectral/temporal dimension), must be odd (example: 3).. Set dz>0 if 1-D filter must be used in band domain"</span>);</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> wavelet_type_opt(<span class="stringliteral">"wt"</span>, <span class="stringliteral">"wavelet"</span>, <span class="stringliteral">"wavelet type: daubechies,daubechies_centered, haar, haar_centered, bspline, bspline_centered"</span>, <span class="stringliteral">"daubechies"</span>);</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> family_opt(<span class="stringliteral">"wf"</span>, <span class="stringliteral">"family"</span>, <span class="stringliteral">"wavelet family (vanishing moment, see also http://www.gnu.org/software/gsl/manual/html_node/DWT-Initialization.html)"</span>, 4);</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_nl_opt(<span class="stringliteral">"nl"</span>, <span class="stringliteral">"nl"</span>, <span class="stringliteral">"Number of leftward (past) data points used in Savitzky-Golay filter)"</span>, 2);</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_nr_opt(<span class="stringliteral">"nr"</span>, <span class="stringliteral">"nr"</span>, <span class="stringliteral">"Number of rightward (future) data points used in Savitzky-Golay filter)"</span>, 2);</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_ld_opt(<span class="stringliteral">"ld"</span>, <span class="stringliteral">"ld"</span>, <span class="stringliteral">"order of the derivative desired in Savitzky-Golay filter (e.g., ld=0 for smoothed function)"</span>, 0);</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_m_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"m"</span>, <span class="stringliteral">"order of the smoothing polynomial in Savitzky-Golay filter, also equal to the highest conserved moment; usual values are m = 2 or m = 4)"</span>, 2);</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> class_opt(<span class="stringliteral">"class"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"class value(s) to use for density, erosion, dilation, openening and closing, thresholding"</span>);</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> threshold_opt(<span class="stringliteral">"t"</span>, <span class="stringliteral">"threshold"</span>, <span class="stringliteral">"threshold value(s) to use for threshold filter (one for each class), or threshold to cut for dwt_cut (use 0 to keep all) or dwt_cut_from, or sigma for shift"</span>, 0);</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value(s) (used for smoothnodata filter)"</span>);</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> tap_opt(<span class="stringliteral">"tap"</span>, <span class="stringliteral">"tap"</span>, <span class="stringliteral">"text file containing taps used for spatial filtering (from ul to lr). Use dimX and dimY to specify tap dimensions in x and y. Leave empty for not using taps"</span>);</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> tapz_opt(<span class="stringliteral">"tapz"</span>, <span class="stringliteral">"tapz"</span>, <span class="stringliteral">"taps used for spectral filtering"</span>);</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> padding_opt(<span class="stringliteral">"pad"</span>,<span class="stringliteral">"pad"</span>, <span class="stringliteral">"Padding method for filtering (how to handle edge effects). Choose between: symmetric, replicate, circular, zero (pad with 0)."</span>, <span class="stringliteral">"symmetric"</spa [...]
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> fwhm_opt(<span class="stringliteral">"fwhm"</span>, <span class="stringliteral">"fwhm"</span>, <span class="stringliteral">"list of full width half to apply spectral filtering (-fwhm band1 -fwhm band2 ...)"</span>);</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> srf_opt(<span class="stringliteral">"srf"</span>, <span class="stringliteral">"srf"</span>, <span class="stringliteral">"list of ASCII files containing spectral response functions (two columns: wavelength response)"</span>);</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> wavelengthIn_opt(<span class="stringliteral">"win"</span>, <span class="stringliteral">"wavelengthIn"</span>, <span class="stringliteral">"list of wavelengths in input spectrum (-win band1 -win band2 ...)"</span>);</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> wavelengthOut_opt(<span class="stringliteral">"wout"</span>, <span class="stringliteral">"wavelengthOut"</span>, <span class="stringliteral">"list of wavelengths in output spectrum (-wout band1 -wout band2 ...)"</span>);</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> interpolationType_opt(<span class="stringliteral">"interp"</span>, <span class="stringliteral">"interp"</span>, <span class="stringliteral">"type of interpolation for spectral filtering (see http://www.gnu.org/software/gsl/manual/html_node/Interpolation-Types.html)"</span>,<span class="stringliteral">" [...]
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>,<span class="stringl [...]
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table"</span>);</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> down_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"down sampling factor. Use value 1 for no downsampling). Use value n>1 for downsampling (aggregation)"</span>, 1);</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> beta_opt(<span class="stringliteral">"beta"</span>, <span class="stringliteral">"beta"</span>, <span class="stringliteral">"ASCII file with beta for each class transition in Markov Random Field"</span>);</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="comment">// Optionpk<double> eps_opt("eps","eps", "error marging for linear feature",0);</span></div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="comment">// Optionpk<bool> l1_opt("l1","l1", "obtain longest object length for linear feature",false);</span></div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="comment">// Optionpk<bool> l2_opt("l2","l2", "obtain shortest object length for linear feature",false,2);</span></div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="comment">// Optionpk<bool> a1_opt("a1","a1", "obtain angle found for longest object length for linear feature",false);</span></div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="comment">// Optionpk<bool> a2_opt("a2","a2", "obtain angle found for shortest object length for linear feature",false);</span></div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode if > 0"</span>, 0,2);</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span> </div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   resample_opt.setHide(1);</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   option_opt.setHide(1);</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   wavelet_type_opt.setHide(1);</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   family_opt.setHide(1);</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   savgolay_nl_opt.setHide(1);</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   savgolay_nr_opt.setHide(1);</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   savgolay_ld_opt.setHide(1);</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   savgolay_m_opt.setHide(1);</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   class_opt.setHide(1);</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   threshold_opt.setHide(1);</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   tap_opt.setHide(1);</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   tapz_opt.setHide(1);</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   padding_opt.setHide(1);</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   wavelengthIn_opt.setHide(1);</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   wavelengthOut_opt.setHide(1);</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   down_opt.setHide(1);</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   beta_opt.setHide(1);</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <span class="comment">// eps_opt.setHide(1);</span></div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <span class="comment">// l1_opt.setHide(1);</span></div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="comment">// l2_opt.setHide(1);</span></div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="comment">// a1_opt.setHide(1);</span></div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="comment">// a2_opt.setHide(1);</span></div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   interpolationType_opt.setHide(1);</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   otype_opt.setHide(1);</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   oformat_opt.setHide(1);</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   colorTable_opt.setHide(1);</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   disc_opt.setHide(1);</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span> </div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     <span class="comment">// tmpdir_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="comment">// angle_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     method_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     srf_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     fwhm_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     dimX_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     dimY_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     dimZ_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     resample_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     wavelet_type_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     family_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     savgolay_nl_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     savgolay_nr_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     savgolay_ld_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     savgolay_m_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     class_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     threshold_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     tap_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     tapz_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     padding_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     wavelengthIn_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     wavelengthOut_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     down_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     beta_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="comment">// eps_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="comment">// l1_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     <span class="comment">// l2_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     <span class="comment">// a1_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="comment">// a2_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     interpolationType_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     otype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     disc_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>   }</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     exit(0);</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   }</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     cout << endl;</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     cout << <span class="stringliteral">"Usage: pkfilter -i input -o ouptut [-f filter | -perc value | -srf file [-srf file]* -win wavelength [-win wavelength]* | -wout wavelength -fwhm value [-wout wavelength -fwhm value]* -win wavelength [-win wavelength]*]"</span> << endl;</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     cout << endl;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   }</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span> </div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   <span class="comment">//not implemented yet, must debug first...</span></div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   vector<double> angle_opt;</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span> </div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> input;</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> output;</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     cerr << <span class="stringliteral">"Error: no input file selected, use option -i"</span> << endl;</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     exit(1);</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   }</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     cerr << <span class="stringliteral">"Error: no output file selected, use option -o"</span> << endl;</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     exit(1);</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   }</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   input.open(input_opt[0]);</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   GDALDataType theType=GDT_Unknown;</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>                  otype_opt[0].c_str()))</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       theType=(GDALDataType) iType;</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>   }</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     theType=input.getDataType();</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span> </div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     std::cout << std::endl << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span> </div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   <span class="keywordtype">string</span> imageType=input.getImageType();</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>   <span class="keywordflow">if</span>(oformat_opt.size())</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span> </div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     theInterleave+=input.getInterleave();</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   }</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="keywordtype">int</span> nband=input.nrOfBand();</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span> </div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordflow">if</span>(fwhm_opt.size())</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       nband=fwhm_opt.size();</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(srf_opt.size())</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       nband=srf_opt.size();</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(tap_opt.size()||tapz_opt.size())</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       nband=input.nrOfBand();</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       <span class="keywordflow">if</span>(method_opt.empty()){</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     cerr << <span class="stringliteral">"Error: no filter selected, use option -f"</span> << endl;</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     exit(1);</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       }</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       <span class="keywordflow">switch</span>(filter2d::Filter2d::getFilterType(method_opt[0])){</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">case</span>(filter2d::dilate):</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       <span class="keywordflow">case</span>(filter2d::erode):</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       <span class="keywordflow">case</span>(filter2d::close):</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="keywordflow">case</span>(filter2d::open):</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">case</span>(filter2d::smooth):</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     <span class="comment">//implemented in spectral/temporal domain (dimZ>1) and spatial domain</span></div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     <span class="keywordflow">if</span>(dimZ_opt.size())</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       assert(dimZ_opt[0]>1);</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       nband=input.nrOfBand();</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="keywordflow">case</span>(filter2d::dwt):</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       <span class="keywordflow">case</span>(filter2d::dwti):</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       <span class="keywordflow">case</span>(filter2d::dwt_cut):</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       <span class="keywordflow">case</span>(filter2d::smoothnodata):</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     <span class="comment">//implemented in spectral/temporal/spatial domain and nband always input.nrOfBand()</span></div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     nband=input.nrOfBand();</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       <span class="keywordflow">case</span>(filter2d::savgolay):</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     nband=input.nrOfBand();</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <span class="keywordflow">if</span>(dimZ_opt.empty())</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       dimZ_opt.push_back(1);</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       <span class="keywordflow">case</span>(filter2d::dwt_cut_from):</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     <span class="comment">//only implemented in spectral/temporal domain</span></div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       nband=input.nrOfBand();</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       assert(threshold_opt.size());</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>     }</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       cerr << <span class="stringliteral">"filter not implemented in spatial domain"</span> << endl;</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       exit(1);</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     }</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       <span class="keywordflow">case</span>(filter2d::mrf):<span class="comment">//deliberate fall through</span></div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     assert(class_opt.size()>1);</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       std::cout << <span class="stringliteral">"opening output image "</span> << output_opt[0] << std::endl;</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     nband=class_opt.size();</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       <span class="keywordflow">case</span>(filter2d::ismin):</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       <span class="keywordflow">case</span>(filter2d::ismax):</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       <span class="keywordflow">case</span>(filter2d::shift):</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       <span class="keywordflow">case</span>(filter2d::scramble):</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       <span class="keywordflow">case</span>(filter2d::mode):</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="keywordflow">case</span>(filter2d::sobelx):</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="keywordflow">case</span>(filter2d::sobely):</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       <span class="keywordflow">case</span>(filter2d::sobelxy):</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">case</span>(filter2d::countid):</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       <span class="keywordflow">case</span>(filter2d::order):</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="keywordflow">case</span>(filter2d::density):</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       <span class="keywordflow">case</span>(filter2d::homog):</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">case</span>(filter2d::heterog):</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     <span class="comment">//only implemented in spatial domain</span></div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       cerr << <span class="stringliteral">"filter not implemented in spectral/temporal domain"</span> << endl;</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       exit(1);</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     }</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>       <span class="comment">// case(filter2d::percentile):</span></div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="comment">//    //implemented in spectral/temporal/spatial domain and nband 1 if dimZ>0</span></div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       <span class="comment">//    if(dimZ_opt.size()){</span></div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       <span class="comment">//      dimZ_opt[0]=1;</span></div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       <span class="comment">//      nband=1;</span></div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="comment">//    }</span></div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       <span class="comment">//    else</span></div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       <span class="comment">//      nband=input.nrOfBand();</span></div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       <span class="comment">//    break;</span></div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       <span class="keywordflow">case</span>(filter2d::sum):</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       <span class="keywordflow">case</span>(filter2d::mean):</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">case</span>(filter2d::min):</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       <span class="keywordflow">case</span>(filter2d::max):</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       <span class="keywordflow">case</span>(filter2d::var):</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       <span class="keywordflow">case</span>(filter2d::stdev):</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       <span class="keywordflow">case</span>(filter2d::median):</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       <span class="keywordflow">case</span>(filter2d::percentile):</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       <span class="keywordflow">case</span>(filter2d::proportion):</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     <span class="comment">//implemented in spectral/temporal/spatial domain and nband 1 if dimZ==1</span></div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     <span class="keywordflow">if</span>(dimZ_opt.size()==1)</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       <span class="keywordflow">if</span>(dimZ_opt[0]==1)</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         nband=1;</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       nband=input.nrOfBand();</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     cerr << <span class="stringliteral">"filter not implemented"</span> << endl;</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     exit(1);</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="comment">// if(dimZ_opt.size())</span></div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     <span class="comment">//   nband=dimZ_opt[0];</span></div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     <span class="comment">// else</span></div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     <span class="comment">//   nband=input.nrOfBand();</span></div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       }</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     }</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     std::cout << <span class="stringliteral">"opening output image "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << nband << <span class="stringliteral">" bands"</span> << std::endl;</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     output.open(output_opt[0],(input.nrOfCol()+down_opt[0]-1)/down_opt[0],(input.nrOfRow()+down_opt[0]-1)/down_opt[0],nband,theType,imageType,option_opt);</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>   }</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     cout << errorstring << endl;</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     exit(4);</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   }</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>   output.setProjection(input.getProjection());</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>   <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   input.getGeoTransform(gt);</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>   gt[1]*=down_opt[0];<span class="comment">//dx</span></div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   gt[5]*=down_opt[0];<span class="comment">//dy</span></div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>   output.setGeoTransform(gt);</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   </div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>){</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     cout << <span class="stringliteral">"set colortable "</span> << colorTable_opt[0] << endl;</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       assert(output.getDataType()==GDT_Byte);</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       output.setColorTable(colorTable_opt[0]);</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     }</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   }</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(input.getColorTable()!=NULL)</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>     output.setColorTable(input.getColorTable());</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   </div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <span class="keywordflow">if</span>(nodata_opt.size()){</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.nrOfBand();++iband)</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     output.GDALSetNoDataValue(nodata_opt[0],iband);</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   }</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span> </div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <a class="code" href="classfilter2d_1_1Filter2d.html">filter2d::Filter2d</a> filter2d;</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>   <a class="code" href="classfilter_1_1Filter.html">filter::Filter</a> filter1d;</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     cout << <span class="stringliteral">"Set padding to "</span> << padding_opt[0] << endl;</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   filter1d.setPadding(padding_opt[0]);</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>   <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       std::cout<< <span class="stringliteral">"class values: "</span>;</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       <span class="keywordflow">if</span>(!dimZ_opt.size())</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         filter2d.pushClass(class_opt[iclass]);</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>         filter1d.pushClass(class_opt[iclass]);</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>         std::cout<< class_opt[iclass] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     }</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       std::cout<< std::endl;</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>   }</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span> </div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   <span class="keywordflow">if</span>(nodata_opt.size()){</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       std::cout<< <span class="stringliteral">"mask values: "</span>;</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<nodata_opt.size();++imask){</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         std::cout<< nodata_opt[imask] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       filter1d.pushNoDataValue(nodata_opt[imask]);</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       filter2d.pushNoDataValue(nodata_opt[imask]);</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     }</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       std::cout<< std::endl;</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>   }</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   <span class="keywordflow">if</span>(tap_opt.size()){</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     ifstream tapfile(tap_opt[0].c_str());</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     assert(tapfile);</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> taps(dimY_opt[0],dimX_opt[0]);</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span> </div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY_opt[0];++j){</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX_opt[0];++i){</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>         tapfile >> taps[j][i];</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       }</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     }</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       std::cout << <span class="stringliteral">"taps: "</span>;</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY_opt[0];++j){</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX_opt[0];++i){</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>           std::cout<< taps[j][i] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>         }</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>         std::cout<< std::endl;</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       }</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     }</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     filter2d.setTaps(taps);</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       filter2d.filter(input,output);</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     }</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       cerr << errorstring << endl;</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     }</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     tapfile.close();</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   }</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(tapz_opt.size()){</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       std::cout << <span class="stringliteral">"taps: "</span>;</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<tapz_opt.size();++itap)</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     std::cout<< tapz_opt[itap] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       std::cout<< std::endl;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     }</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     filter1d.setTaps(tapz_opt);</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     filter1d.filter(input,output);</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   }</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(fwhm_opt.size()){</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       std::cout << <span class="stringliteral">"spectral filtering to "</span> << fwhm_opt.size() << <span class="stringliteral">" bands with provided fwhm "</span> << std::endl;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     assert(wavelengthOut_opt.size()==fwhm_opt.size());</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>     assert(wavelengthIn_opt.size());</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span> </div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(wavelengthOut_opt.size(),input.nrOfCol());</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordflow">if</span>((y+1+down_opt[0]/2)%down_opt[0])</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>         input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       filter1d.applyFwhm<<span class="keywordtype">double</span>>(wavelengthIn_opt,lineInput,wavelengthOut_opt,fwhm_opt, interpolationType_opt[0], lineOutput, down_opt[0], verbose_opt[0]);</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.nrOfBand();++iband){</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>           output.writeData(lineOutput[iband],GDT_Float64,y/down_opt[0],iband);</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>         }</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>           cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>         }</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       }</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     }</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   }</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(srf_opt.size()){</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       std::cout << <span class="stringliteral">"spectral filtering to "</span> << srf_opt.size() << <span class="stringliteral">" bands with provided SRF "</span> << std::endl;</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     assert(wavelengthIn_opt.size());</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     vector< Vector2d<double> > srf(srf_opt.size());<span class="comment">//[0] srf_nr, [1]: wavelength, [2]: response</span></div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     ifstream srfFile;</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isrf=0;isrf<srf_opt.size();++isrf){</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       srf[isrf].resize(2);</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       srfFile.open(srf_opt[isrf].c_str());</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       <span class="keywordtype">double</span> v;</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       <span class="comment">//add 0 to make sure srf is 0 at boundaries after interpolation step</span></div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       srf[isrf][0].push_back(0);</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       srf[isrf][1].push_back(0);</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       srf[isrf][0].push_back(1);</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span> <span class="comment">/*------------------</span></div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span> <span class="comment">  Main procedure</span></div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span> <span class="comment">  ----------------*/</span></div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> input_opt(<span class="stringliteral">"i"</span>,<span class="stringliteral">"input"</span>,<span class="stringliteral">"input image file"</span>);</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   <span class="comment">// Optionpk<std::string> tmpdir_opt("tmp", "tmp", "Temporary directory","/tmp",2);</span></div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> disc_opt(<span class="stringliteral">"circ"</span>, <span class="stringliteral">"circular"</span>, <span class="stringliteral">"circular disc kernel for dilation and erosion"</span>, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <span class="comment">// Optionpk<double> angle_opt("a", "angle", "angle used for directional filtering in dilation (North=0, East=90, South=180, West=270).");</span></div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> method_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"filter"</span>, <span class="stringliteral">"filter function (nvalid, median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel mus [...]
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> resample_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"resampling-method"</span>, <span class="stringliteral">"Resampling method for shifting operation (near: nearest neighbour, bilinear: bi-linear interpolation)."</span>, <span class="stringliteral">"near"</span>);</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dimX_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"filter kernel size in x, use odd values only"</span>, 3);</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dimY_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"filter kernel size in y, use odd values only"</span>, 3);</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> dimZ_opt(<span class="stringliteral">"dz"</span>, <span class="stringliteral">"dz"</span>, <span class="stringliteral">"filter kernel size in z (spectral/temporal dimension), must be odd (example: 3).. Set dz>0 if 1-D filter must be used in band domain"</span>);</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> wavelet_type_opt(<span class="stringliteral">"wt"</span>, <span class="stringliteral">"wavelet"</span>, <span class="stringliteral">"wavelet type: daubechies,daubechies_centered, haar, haar_centered, bspline, bspline_centered"</span>, <span class="stringliteral">"daubechies"</span>);</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> family_opt(<span class="stringliteral">"wf"</span>, <span class="stringliteral">"family"</span>, <span class="stringliteral">"wavelet family (vanishing moment, see also http://www.gnu.org/software/gsl/manual/html_node/DWT-Initialization.html)"</span>, 4);</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_nl_opt(<span class="stringliteral">"nl"</span>, <span class="stringliteral">"nl"</span>, <span class="stringliteral">"Number of leftward (past) data points used in Savitzky-Golay filter)"</span>, 2);</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_nr_opt(<span class="stringliteral">"nr"</span>, <span class="stringliteral">"nr"</span>, <span class="stringliteral">"Number of rightward (future) data points used in Savitzky-Golay filter)"</span>, 2);</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_ld_opt(<span class="stringliteral">"ld"</span>, <span class="stringliteral">"ld"</span>, <span class="stringliteral">"order of the derivative desired in Savitzky-Golay filter (e.g., ld=0 for smoothed function)"</span>, 0);</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_m_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"m"</span>, <span class="stringliteral">"order of the smoothing polynomial in Savitzky-Golay filter, also equal to the highest conserved moment; usual values are m = 2 or m = 4)"</span>, 2);</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> class_opt(<span class="stringliteral">"class"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"class value(s) to use for density, erosion, dilation, openening and closing, thresholding"</span>);</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> threshold_opt(<span class="stringliteral">"t"</span>, <span class="stringliteral">"threshold"</span>, <span class="stringliteral">"threshold value(s) to use for threshold filter (one for each class), or threshold to cut for dwt_cut (use 0 to keep all) or dwt_cut_from, or sigma for shift"</span>, 0);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value(s) (used for smoothnodata filter)"</span>);</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> tap_opt(<span class="stringliteral">"tap"</span>, <span class="stringliteral">"tap"</span>, <span class="stringliteral">"text file containing taps used for spatial filtering (from ul to lr). Use dimX and dimY to specify tap dimensions in x and y. Leave empty for not using taps"</span>);</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> tapz_opt(<span class="stringliteral">"tapz"</span>, <span class="stringliteral">"tapz"</span>, <span class="stringliteral">"taps used for spectral filtering"</span>);</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> padding_opt(<span class="stringliteral">"pad"</span>,<span class="stringliteral">"pad"</span>, <span class="stringliteral">"Padding method for filtering (how to handle edge effects). Choose between: symmetric, replicate, circular, zero (pad with 0)."</span>, <span class="stringliteral">"symmetric"</spa [...]
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> fwhm_opt(<span class="stringliteral">"fwhm"</span>, <span class="stringliteral">"fwhm"</span>, <span class="stringliteral">"list of full width half to apply spectral filtering (-fwhm band1 -fwhm band2 ...)"</span>);</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> srf_opt(<span class="stringliteral">"srf"</span>, <span class="stringliteral">"srf"</span>, <span class="stringliteral">"list of ASCII files containing spectral response functions (two columns: wavelength response)"</span>);</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> wavelengthIn_opt(<span class="stringliteral">"win"</span>, <span class="stringliteral">"wavelengthIn"</span>, <span class="stringliteral">"list of wavelengths in input spectrum (-win band1 -win band2 ...)"</span>);</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> wavelengthOut_opt(<span class="stringliteral">"wout"</span>, <span class="stringliteral">"wavelengthOut"</span>, <span class="stringliteral">"list of wavelengths in output spectrum (-wout band1 -wout band2 ...)"</span>);</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> interpolationType_opt(<span class="stringliteral">"interp"</span>, <span class="stringliteral">"interp"</span>, <span class="stringliteral">"type of interpolation for spectral filtering (see http://www.gnu.org/software/gsl/manual/html_node/Interpolation-Types.html)"</span>,<span class="stringliteral">" [...]
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>,<span class="stringl [...]
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>,<span class="stringliteral">"GTiff"</span>);</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table"</span>);</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> down_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"down sampling factor. Use value 1 for no downsampling). Use value n>1 for downsampling (aggregation)"</span>, 1);</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> beta_opt(<span class="stringliteral">"beta"</span>, <span class="stringliteral">"beta"</span>, <span class="stringliteral">"ASCII file with beta for each class transition in Markov Random Field"</span>);</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="comment">// Optionpk<double> eps_opt("eps","eps", "error marging for linear feature",0);</span></div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="comment">// Optionpk<bool> l1_opt("l1","l1", "obtain longest object length for linear feature",false);</span></div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="comment">// Optionpk<bool> l2_opt("l2","l2", "obtain shortest object length for linear feature",false,2);</span></div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="comment">// Optionpk<bool> a1_opt("a1","a1", "obtain angle found for longest object length for linear feature",false);</span></div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="comment">// Optionpk<bool> a2_opt("a2","a2", "obtain angle found for shortest object length for linear feature",false);</span></div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode if > 0"</span>, 0,2);</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span> </div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   resample_opt.setHide(1);</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   wavelet_type_opt.setHide(1);</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   family_opt.setHide(1);</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   savgolay_nl_opt.setHide(1);</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   savgolay_nr_opt.setHide(1);</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   savgolay_ld_opt.setHide(1);</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   savgolay_m_opt.setHide(1);</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   class_opt.setHide(1);</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   threshold_opt.setHide(1);</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   tap_opt.setHide(1);</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   tapz_opt.setHide(1);</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   padding_opt.setHide(1);</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   wavelengthIn_opt.setHide(1);</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   wavelengthOut_opt.setHide(1);</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   down_opt.setHide(1);</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   beta_opt.setHide(1);</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <span class="comment">// eps_opt.setHide(1);</span></div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="comment">// l1_opt.setHide(1);</span></div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="comment">// l2_opt.setHide(1);</span></div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="comment">// a1_opt.setHide(1);</span></div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   <span class="comment">// a2_opt.setHide(1);</span></div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   interpolationType_opt.setHide(1);</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   otype_opt.setHide(1);</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   oformat_opt.setHide(1);</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   colorTable_opt.setHide(1);</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   disc_opt.setHide(1);</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span> </div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="comment">// tmpdir_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     <span class="comment">// angle_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     method_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     srf_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     fwhm_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     dimX_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     dimY_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     dimZ_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     resample_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     wavelet_type_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     family_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     savgolay_nl_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     savgolay_nr_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     savgolay_ld_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     savgolay_m_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     class_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     threshold_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     tap_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     tapz_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     padding_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     wavelengthIn_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     wavelengthOut_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     down_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     beta_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="comment">// eps_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     <span class="comment">// l1_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     <span class="comment">// l2_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="comment">// a1_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     <span class="comment">// a2_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     interpolationType_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     disc_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   }</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     exit(0);</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   }</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     cout << endl;</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     cout << <span class="stringliteral">"Usage: pkfilter -i input -o ouptut [-f filter | -perc value | -srf file [-srf file]* -win wavelength [-win wavelength]* | -wout wavelength -fwhm value [-wout wavelength -fwhm value]* -win wavelength [-win wavelength]*]"</span> << endl;</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     cout << endl;</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   }</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span> </div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   <span class="comment">//not implemented yet, must debug first...</span></div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   vector<double> angle_opt;</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span> </div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> input;</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> output;</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     cerr << <span class="stringliteral">"Error: no input file selected, use option -i"</span> << endl;</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     exit(1);</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   }</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     cerr << <span class="stringliteral">"Error: no output file selected, use option -o"</span> << endl;</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     exit(1);</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   }</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   input.open(input_opt[0]);</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   GDALDataType theType=GDT_Unknown;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>                  otype_opt[0].c_str()))</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       theType=(GDALDataType) iType;</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   }</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     theType=input.getDataType();</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span> </div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     std::cout << std::endl << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span> </div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>   <span class="keywordtype">string</span> imageType;<span class="comment">//=input.getImageType();</span></div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   <span class="keywordflow">if</span>(oformat_opt.size())</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span> </div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     theInterleave+=input.getInterleave();</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   }</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     <span class="keywordtype">int</span> nband=input.nrOfBand();</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span> </div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     <span class="keywordflow">if</span>(fwhm_opt.size())</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       nband=fwhm_opt.size();</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(srf_opt.size())</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       nband=srf_opt.size();</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(tap_opt.size()||tapz_opt.size())</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       nband=input.nrOfBand();</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       <span class="keywordflow">if</span>(method_opt.empty()){</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     cerr << <span class="stringliteral">"Error: no filter selected, use option -f"</span> << endl;</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     exit(1);</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       }</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">switch</span>(filter2d::Filter2d::getFilterType(method_opt[0])){</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       <span class="keywordflow">case</span>(filter2d::dilate):</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       <span class="keywordflow">case</span>(filter2d::erode):</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="keywordflow">case</span>(filter2d::close):</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">case</span>(filter2d::open):</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       <span class="keywordflow">case</span>(filter2d::smooth):</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     <span class="comment">//implemented in spectral/temporal domain (dimZ>1) and spatial domain</span></div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     <span class="keywordflow">if</span>(dimZ_opt.size())</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       assert(dimZ_opt[0]>1);</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       nband=input.nrOfBand();</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       <span class="keywordflow">case</span>(filter2d::dwt):</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       <span class="keywordflow">case</span>(filter2d::dwti):</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       <span class="keywordflow">case</span>(filter2d::dwt_cut):</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="keywordflow">case</span>(filter2d::smoothnodata):</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     <span class="comment">//implemented in spectral/temporal/spatial domain and nband always input.nrOfBand()</span></div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     nband=input.nrOfBand();</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       <span class="keywordflow">case</span>(filter2d::savgolay):</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     nband=input.nrOfBand();</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     <span class="keywordflow">if</span>(dimZ_opt.empty())</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       dimZ_opt.push_back(1);</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       <span class="keywordflow">case</span>(filter2d::dwt_cut_from):</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     <span class="comment">//only implemented in spectral/temporal domain</span></div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       nband=input.nrOfBand();</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       assert(threshold_opt.size());</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     }</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       cerr << <span class="stringliteral">"filter not implemented in spatial domain"</span> << endl;</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>       exit(1);</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     }</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       <span class="keywordflow">case</span>(filter2d::mrf):<span class="comment">//deliberate fall through</span></div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     assert(class_opt.size()>1);</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       std::cout << <span class="stringliteral">"opening output image "</span> << output_opt[0] << std::endl;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     nband=class_opt.size();</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       <span class="keywordflow">case</span>(filter2d::ismin):</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       <span class="keywordflow">case</span>(filter2d::ismax):</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       <span class="keywordflow">case</span>(filter2d::shift):</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       <span class="keywordflow">case</span>(filter2d::scramble):</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="keywordflow">case</span>(filter2d::mode):</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="keywordflow">case</span>(filter2d::sobelx):</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       <span class="keywordflow">case</span>(filter2d::sobely):</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">case</span>(filter2d::sobelxy):</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       <span class="keywordflow">case</span>(filter2d::countid):</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="keywordflow">case</span>(filter2d::order):</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       <span class="keywordflow">case</span>(filter2d::density):</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">case</span>(filter2d::homog):</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       <span class="keywordflow">case</span>(filter2d::heterog):</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     <span class="comment">//only implemented in spatial domain</span></div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       cerr << <span class="stringliteral">"filter not implemented in spectral/temporal domain"</span> << endl;</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       exit(1);</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     }</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="comment">// case(filter2d::percentile):</span></div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       <span class="comment">//    //implemented in spectral/temporal/spatial domain and nband 1 if dimZ>0</span></div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       <span class="comment">//    if(dimZ_opt.size()){</span></div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       <span class="comment">//      dimZ_opt[0]=1;</span></div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="comment">//      nband=1;</span></div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       <span class="comment">//    }</span></div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       <span class="comment">//    else</span></div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       <span class="comment">//      nband=input.nrOfBand();</span></div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       <span class="comment">//    break;</span></div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       <span class="keywordflow">case</span>(filter2d::sum):</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">case</span>(filter2d::mean):</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       <span class="keywordflow">case</span>(filter2d::min):</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       <span class="keywordflow">case</span>(filter2d::max):</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       <span class="keywordflow">case</span>(filter2d::var):</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       <span class="keywordflow">case</span>(filter2d::stdev):</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       <span class="keywordflow">case</span>(filter2d::nvalid):</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       <span class="keywordflow">case</span>(filter2d::median):</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">case</span>(filter2d::percentile):</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       <span class="keywordflow">case</span>(filter2d::proportion):</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     <span class="comment">//implemented in spectral/temporal/spatial domain and nband 1 if dimZ==1</span></div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     <span class="keywordflow">if</span>(dimZ_opt.size()==1)</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       <span class="keywordflow">if</span>(dimZ_opt[0]==1)</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>         nband=1;</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       nband=input.nrOfBand();</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     cerr << <span class="stringliteral">"filter not implemented"</span> << endl;</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     exit(1);</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     <span class="comment">// if(dimZ_opt.size())</span></div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     <span class="comment">//   nband=dimZ_opt[0];</span></div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     <span class="comment">// else</span></div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     <span class="comment">//   nband=input.nrOfBand();</span></div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       }</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     }</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     std::cout << <span class="stringliteral">"opening output image "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << nband << <span class="stringliteral">" bands"</span> << std::endl;</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     output.open(output_opt[0],(input.nrOfCol()+down_opt[0]-1)/down_opt[0],(input.nrOfRow()+down_opt[0]-1)/down_opt[0],nband,theType,imageType,option_opt);</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>   }</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>     cout << errorstring << endl;</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     exit(4);</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>   }</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   output.setProjection(input.getProjection());</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>   <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   input.getGeoTransform(gt);</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>   gt[1]*=down_opt[0];<span class="comment">//dx</span></div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   gt[5]*=down_opt[0];<span class="comment">//dy</span></div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   output.setGeoTransform(gt);</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   </div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>){</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     cout << <span class="stringliteral">"set colortable "</span> << colorTable_opt[0] << endl;</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       assert(output.getDataType()==GDT_Byte);</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       output.setColorTable(colorTable_opt[0]);</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     }</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   }</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(input.getColorTable()!=NULL)</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     output.setColorTable(input.getColorTable());</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   </div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   <span class="keywordflow">if</span>(nodata_opt.size()){</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.nrOfBand();++iband)</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     output.GDALSetNoDataValue(nodata_opt[0],iband);</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   }</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span> </div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>   <a class="code" href="classfilter2d_1_1Filter2d.html">filter2d::Filter2d</a> filter2d;</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>   <a class="code" href="classfilter_1_1Filter.html">filter::Filter</a> filter1d;</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     cout << <span class="stringliteral">"Set padding to "</span> << padding_opt[0] << endl;</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>   filter1d.setPadding(padding_opt[0]);</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>   <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       std::cout<< <span class="stringliteral">"class values: "</span>;</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordflow">if</span>(!dimZ_opt.size())</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>         filter2d.pushClass(class_opt[iclass]);</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>         filter1d.pushClass(class_opt[iclass]);</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>         std::cout<< class_opt[iclass] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     }</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       std::cout<< std::endl;</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   }</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span> </div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>   <span class="keywordflow">if</span>(nodata_opt.size()){</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       std::cout<< <span class="stringliteral">"mask values: "</span>;</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<nodata_opt.size();++imask){</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>         std::cout<< nodata_opt[imask] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       filter1d.pushNoDataValue(nodata_opt[imask]);</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       filter2d.pushNoDataValue(nodata_opt[imask]);</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     }</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       std::cout<< std::endl;</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   }</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>   <span class="keywordflow">if</span>(tap_opt.size()){</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     ifstream tapfile(tap_opt[0].c_str());</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     assert(tapfile);</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> taps(dimY_opt[0],dimX_opt[0]);</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span> </div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY_opt[0];++j){</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX_opt[0];++i){</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>         tapfile >> taps[j][i];</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       }</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     }</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       std::cout << <span class="stringliteral">"taps: "</span>;</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY_opt[0];++j){</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX_opt[0];++i){</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>           std::cout<< taps[j][i] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>         }</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>         std::cout<< std::endl;</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       }</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     }</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     filter2d.setTaps(taps);</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       filter2d.filter(input,output);</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     }</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       cerr << errorstring << endl;</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     }</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     tapfile.close();</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>   }</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(tapz_opt.size()){</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       std::cout << <span class="stringliteral">"taps: "</span>;</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<tapz_opt.size();++itap)</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     std::cout<< tapz_opt[itap] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       std::cout<< std::endl;</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     }</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>     filter1d.setTaps(tapz_opt);</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>     filter1d.filter(input,output);</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>   }</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(fwhm_opt.size()){</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       std::cout << <span class="stringliteral">"spectral filtering to "</span> << fwhm_opt.size() << <span class="stringliteral">" bands with provided fwhm "</span> << std::endl;</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     assert(wavelengthOut_opt.size()==fwhm_opt.size());</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     assert(wavelengthIn_opt.size());</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span> </div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(wavelengthOut_opt.size(),input.nrOfCol());</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <span class="keywordflow">if</span>((y+1+down_opt[0]/2)%down_opt[0])</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>         input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       filter1d.applyFwhm<<span class="keywordtype">double</span>>(wavelengthIn_opt,lineInput,wavelengthOut_opt,fwhm_opt, interpolationType_opt[0], lineOutput, down_opt[0], verbose_opt[0]);</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.nrOfBand();++iband){</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>           output.writeData(lineOutput[iband],GDT_Float64,y/down_opt[0],iband);</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>         }</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>           cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>         }</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       }</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     }</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>   }</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(srf_opt.size()){</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       std::cout << <span class="stringliteral">"spectral filtering to "</span> << srf_opt.size() << <span class="stringliteral">" bands with provided SRF "</span> << std::endl;</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     assert(wavelengthIn_opt.size());</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     vector< Vector2d<double> > srf(srf_opt.size());<span class="comment">//[0] srf_nr, [1]: wavelength, [2]: response</span></div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     ifstream srfFile;</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isrf=0;isrf<srf_opt.size();++isrf){</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       srf[isrf].resize(2);</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       srfFile.open(srf_opt[isrf].c_str());</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       <span class="keywordtype">double</span> v;</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       <span class="comment">//add 0 to make sure srf is 0 at boundaries after interpolation step</span></div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       srf[isrf][0].push_back(0);</div>
 <div class="line"><a name="l00642"></a><span class="lineno">  642</span>       srf[isrf][1].push_back(0);</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       <span class="keywordflow">while</span>(srfFile >> v){</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>         srf[isrf][0].push_back(v);</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>         srfFile >> v;</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>         srf[isrf][1].push_back(v);</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>       }</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       srfFile.close();</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <span class="comment">//add 0 to make sure srf[isrf] is 0 at boundaries after interpolation step</span></div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       srf[isrf][0].push_back(srf[isrf][0].back()+1);</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       srf[isrf][1].push_back(0);    </div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       srf[isrf][0].push_back(1);</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>       srf[isrf][1].push_back(0);</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       <span class="keywordflow">while</span>(srfFile >> v){</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>         srf[isrf][0].push_back(v);</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>         srfFile >> v;</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>         srf[isrf][1].push_back(v);</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       }</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       srfFile.close();</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       <span class="comment">//add 0 to make sure srf[isrf] is 0 at boundaries after interpolation step</span></div>
 <div class="line"><a name="l00652"></a><span class="lineno">  652</span>       srf[isrf][0].push_back(srf[isrf][0].back()+1);</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       srf[isrf][1].push_back(0);</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>         cout << <span class="stringliteral">"srf file details: "</span> << srf[isrf][0].size() << <span class="stringliteral">" wavelengths defined"</span> << endl;    </div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     }</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     assert(output.nrOfBand()==srf.size());</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     <span class="keywordtype">double</span> centreWavelength=0;</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>       <span class="keywordflow">if</span>((y+1+down_opt[0]/2)%down_opt[0])</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>         input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isrf=0;isrf<srf.size();++isrf){</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>         vector<double> lineOutput(output.nrOfCol());</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>         <span class="keywordtype">double</span> delta=1.0;</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>         <span class="keywordtype">bool</span> normalize=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     centreWavelength=filter1d.applySrf<<span class="keywordtype">double</span>>(wavelengthIn_opt,lineInput,srf[isrf], interpolationType_opt[0], lineOutput, delta, normalize);</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>           std::cout << <span class="stringliteral">"centre wavelength srf "</span> << isrf << <span class="stringliteral">": "</span> << centreWavelength << std::endl;</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>           output.writeData(lineOutput,GDT_Float64,y/down_opt[0],isrf);</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>         }</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>           cerr << errorstring << <span class="stringliteral">"in srf "</span> << srf_opt[isrf] << <span class="stringliteral">", line "</span> << y << endl;</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>         }</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span> </div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       }</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     }</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span> </div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   }</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     <span class="keywordflow">switch</span>(filter2d::Filter2d::getFilterType(method_opt[0])){</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     <span class="keywordflow">case</span>(filter2d::dilate):</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     exit(1);</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       }</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>           std::cout<< <span class="stringliteral">"1-D filtering: dilate"</span> << std::endl;</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       filter1d.morphology(input,output,<span class="stringliteral">"dilate"</span>,dimZ_opt[0],verbose_opt[0]);</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     }</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       filter2d.morphology(input,output,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>       }</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       }</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="keywordflow">case</span>(filter2d::erode):</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     exit(1);</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       }</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     <span class="keywordflow">if</span>(dimZ_opt.size()>0){</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>         std::cout<< <span class="stringliteral">"1-D filtering: dilate"</span> << std::endl;</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>       filter1d.morphology(input,output,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     }</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>       filter2d.morphology(input,output,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     }</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       }</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       }</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     <span class="keywordflow">case</span>(filter2d::close):{<span class="comment">//closing</span></div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     exit(1);</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       }</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span> </div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> tmpout;</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       tmpout.open(<span class="stringliteral">"/vsimem/dilation.tif"</span>,input.nrOfCol(),input.nrOfRow(),input.nrOfBand(),input.getDataType(),input.getImageType());</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>         <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>           filter1d.morphology(input,tmpout,<span class="stringliteral">"dilate"</span>,dimZ_opt[0]);</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         }</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>       filter2d.morphology(input,tmpout,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>         }</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>       }</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       <span class="keywordflow">catch</span>(std::string errorString){</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     std::cout<< errorString;</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     exit(1);</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       }</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       tmpout.close();</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> tmpin;</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       tmpin.open(<span class="stringliteral">"/vsimem/dilation.tif"</span>);</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       filter1d.morphology(tmpin,output,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     }</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       filter2d.morphology(tmpin,output,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     }</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       }</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>       }</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       tmpin.close();</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>     }</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>     <span class="keywordflow">case</span>(filter2d::open):{<span class="comment">//opening</span></div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>     exit(1);</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       }</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> tmpout;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       tmpout.open(<span class="stringliteral">"/vsimem/erosion.tif"</span>,input.nrOfCol(),input.nrOfRow(),input.nrOfBand(),input.getDataType(),input.getImageType());</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>       filter1d.morphology(input,tmpout,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     }</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>       filter2d.morphology(input,tmpout,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     }</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       }</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       <span class="keywordflow">catch</span>(std::string errorString){</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     std::cout<< errorString;</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>     exit(1);</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       }</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       tmpout.close();</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> tmpin;</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     tmpin.open(<span class="stringliteral">"/vsimem/erosion.tif"</span>);</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       filter1d.morphology(tmpin,output,<span class="stringliteral">"dilate"</span>,dimZ_opt[0]);</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     }</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       filter2d.morphology(tmpin,output,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>     }</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>     tmpin.close();</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>     tmpout.close();</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       }</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       }</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>     }</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     <span class="keywordflow">case</span>(filter2d::homog):{<span class="comment">//spatially homogeneous</span></div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     filter2d.doit(input,output,<span class="stringliteral">"homog"</span>,dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       }</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       }</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>     }</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     <span class="keywordflow">case</span>(filter2d::heterog):{<span class="comment">//spatially heterogeneous</span></div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>     filter2d.doit(input,output,<span class="stringliteral">"heterog"</span>,dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       }</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       }</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     }</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>     <span class="keywordflow">case</span>(filter2d::shift):{<span class="comment">//shift</span></div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for shift operator"</span> << std::endl;</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     exit(1);</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       }</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>       assert(input.nrOfBand());</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       assert(input.nrOfCol());</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       assert(input.nrOfRow());</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>         filter2d.shift(input,output,dimX_opt[0],dimY_opt[0],threshold_opt[0],filter2d::Filter2d::getResampleType(resample_opt[0]));</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       }</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>         cerr << errorstring << endl;</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       }</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     }</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     <span class="comment">// case(filter2d::linearfeature):{</span></div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     <span class="comment">//   if(down_opt[0]!=1){</span></div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     <span class="comment">//  std::cerr << "Error: down option not supported for linear feature" << std::endl;</span></div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>     <span class="comment">//  exit(1);</span></div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <span class="comment">//   }</span></div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     <span class="comment">//   assert(input.nrOfBand());</span></div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="comment">//   assert(input.nrOfCol());</span></div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     <span class="comment">//   assert(input.nrOfRow());</span></div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     <span class="comment">//   float theAngle=361;</span></div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     <span class="comment">//   if(angle_opt.size())</span></div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     <span class="comment">//  theAngle=angle_opt[0];</span></div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     <span class="comment">//   if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     <span class="comment">//  std::cout << "using angle " << theAngle << std::endl;</span></div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     <span class="comment">//   try{</span></div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     <span class="comment">//  //using an angle step of 5 degrees and no maximum distance</span></div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <span class="comment">//     filter2d.linearFeature(input,output,theAngle,5,0,eps_opt[0],l1_opt[0],a1_opt[0],l2_opt[0],a2_opt[0],0,verbose_opt[0]);</span></div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     <span class="comment">//   }</span></div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     <span class="comment">//   catch(string errorstring){</span></div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     <span class="comment">//     cerr << errorstring << endl;</span></div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>     <span class="comment">//   }</span></div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>     <span class="comment">//   break;</span></div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>     <span class="comment">// }</span></div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     <span class="keywordflow">case</span>(filter2d::mrf):{<span class="comment">//Markov Random Field</span></div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>     std::cout << <span class="stringliteral">"Markov Random Field filtering"</span> << std::endl;</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>     <span class="keywordflow">if</span>(beta_opt.size()){</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       <span class="comment">//in file: classFrom classTo</span></div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>       <span class="comment">//in variable: beta[classTo][classFrom]</span></div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       <a class="code" href="classFileReaderAscii.html">FileReaderAscii</a> betaReader(beta_opt[0]);</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> beta(class_opt.size(),class_opt.size());</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       vector<int> cols(class_opt.size());</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>         cols[iclass]=iclass;</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       betaReader.readData(beta,cols);</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>         std::cout << <span class="stringliteral">"using values for beta:"</span> << std::endl;</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<class_opt.size();++iclass1)</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>           std::cout << <span class="stringliteral">"      "</span> << iclass1 << <span class="stringliteral">" ("</span> << class_opt[iclass1] << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>         std::cout << std::endl;</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<class_opt.size();++iclass1){</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>           std::cout << iclass1 << <span class="stringliteral">" ("</span> << class_opt[iclass1] << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<class_opt.size();++iclass2)</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>         std::cout << <span class="stringliteral">" "</span> << beta[iclass2][iclass1] << <span class="stringliteral">" ("</span> << class_opt[iclass2] << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>           std::cout << std::endl;</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>         }</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       }</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       filter2d.mrf(input, output, dimX_opt[0], dimY_opt[0], beta, <span class="keyword">true</span>, down_opt[0], verbose_opt[0]);</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>     }</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       filter2d.mrf(input, output, dimX_opt[0], dimY_opt[0], 1, <span class="keyword">true</span>, down_opt[0], verbose_opt[0]);</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>       }</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       }</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>     }</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>     <span class="keywordflow">case</span>(filter2d::sobelx):{<span class="comment">//Sobel edge detection in X</span></div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>     exit(1);</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>       }</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       theTaps[0][0]=-1.0;</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>       theTaps[0][1]=0.0;</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>       theTaps[0][2]=1.0;</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       theTaps[1][0]=-2.0;</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>       theTaps[1][1]=0.0;</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       theTaps[1][2]=2.0;</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>       theTaps[2][0]=-1.0;</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       theTaps[2][1]=0.0;</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       theTaps[2][2]=1.0;</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       filter2d.setTaps(theTaps);</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>       }</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       }</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>     }</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>     <span class="keywordflow">case</span>(filter2d::sobely):{<span class="comment">//Sobel edge detection in Y</span></div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     exit(1);</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       }</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>       theTaps[0][0]=1.0;</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       theTaps[0][1]=2.0;</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       theTaps[0][2]=1.0;</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       theTaps[1][0]=0.0;</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       theTaps[1][1]=0.0;</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       theTaps[1][2]=0.0;</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       theTaps[2][0]=-1.0;</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       theTaps[2][1]=-2.0;</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       theTaps[2][2]=-1.0;</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       filter2d.setTaps(theTaps);</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       }</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       }</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     }</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     <span class="keywordflow">case</span>(filter2d::sobelxy):{<span class="comment">//Sobel edge detection in XY</span></div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     exit(1);</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>       }</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       theTaps[0][0]=0.0;</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       theTaps[0][1]=1.0;</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>       theTaps[0][2]=2.0;</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       theTaps[1][0]=-1.0;</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       theTaps[1][1]=0.0;</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>       theTaps[1][2]=1.0;</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>       theTaps[2][0]=-2.0;</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       theTaps[2][1]=-1.0;</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       theTaps[2][2]=0.0;</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       filter2d.setTaps(theTaps);</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       }</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       }</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>     }</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>     <span class="keywordflow">case</span>(filter2d::sobelyx):{<span class="comment">//Sobel edge detection in XY</span></div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>     exit(1);</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>       }</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       theTaps[0][0]=2.0;</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       theTaps[0][1]=1.0;</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>       theTaps[0][2]=0.0;</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>       theTaps[1][0]=1.0;</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>       theTaps[1][1]=0.0;</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>       theTaps[1][2]=-1.0;</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>       theTaps[2][0]=0.0;</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>       theTaps[2][1]=-1.0;</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>       theTaps[2][2]=-2.0;</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>       filter2d.setTaps(theTaps);</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>       }</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>       }</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>     }</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>     <span class="keywordflow">case</span>(filter2d::smooth):{<span class="comment">//Smoothing filter</span></div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     exit(1);</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>       }</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>         std::cout<< <span class="stringliteral">"1-D filtering: smooth"</span> << std::endl;</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>       filter1d.smooth(input,output,dimZ_opt[0]);</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>     }</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>       filter2d.smooth(input,output,dimX_opt[0],dimY_opt[0]);</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     }</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       }</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       }</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>     }</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>     <span class="keywordflow">case</span>(filter2d::smoothnodata):{<span class="comment">//Smoothing filter</span></div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>     exit(1);</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>       }</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         std::cout<< <span class="stringliteral">"1-D filtering: smooth"</span> << std::endl;</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>       filter1d.smoothNoData(input,interpolationType_opt[0],output);</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>     }</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         std::cout<< <span class="stringliteral">"2-D filtering: smooth"</span> << std::endl;</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>       filter2d.smoothNoData(input,output,dimX_opt[0],dimY_opt[0]);</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     }</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>       }</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>       }</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     }</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>     <span class="keywordflow">case</span>(filter2d::dwt):</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>     exit(1);</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>       }</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>         std::cout<< <span class="stringliteral">"DWT in spectral domain"</span> << std::endl;</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       filter1d.dwtForward(input, output, wavelet_type_opt[0], family_opt[0]);</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>     }</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>       filter2d.dwtForward(input, output, wavelet_type_opt[0], family_opt[0]);</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>       }</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>       }</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>     <span class="keywordflow">case</span>(filter2d::dwti):</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>     exit(1);</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>       }</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>         std::cout<< <span class="stringliteral">"inverse DWT in spectral domain"</span> << std::endl;</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>       filter1d.dwtInverse(input, output, wavelet_type_opt[0], family_opt[0]);</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>     }</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>       filter2d.dwtInverse(input, output, wavelet_type_opt[0], family_opt[0]);</div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>       }</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>       }</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>     <span class="keywordflow">case</span>(filter2d::dwt_cut):</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>     exit(1);</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>       }</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>       <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>           std::cout<< <span class="stringliteral">"DWT approximation in spectral domain"</span> << std::endl;</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>     filter1d.dwtCut(input, output, wavelet_type_opt[0], family_opt[0], threshold_opt[0]);</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>       }</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>     filter2d.dwtCut(input, output, wavelet_type_opt[0], family_opt[0], threshold_opt[0]);</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>     <span class="keywordflow">case</span>(filter2d::dwt_cut_from):</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>     exit(1);</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>       }</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>         std::cout<< <span class="stringliteral">"DWT approximation in spectral domain"</span> << std::endl;</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>       filter1d.dwtCutFrom(input, output, wavelet_type_opt[0], family_opt[0], static_cast<int>(threshold_opt[0]));</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>     }</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>       <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Error: this filter is not supported in 2D"</span>;</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>     }</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>       }</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>       }</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>     <span class="keywordflow">case</span>(filter2d::savgolay):{</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>       assert(savgolay_nl_opt.size());</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>       assert(savgolay_nr_opt.size());</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>       assert(savgolay_ld_opt.size());</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>       assert(savgolay_m_opt.size());</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         std::cout << <span class="stringliteral">"Calculating Savitzky-Golay coefficients: "</span> << endl;</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>       filter1d.getSavGolayCoefficients(tapz_opt, input.nrOfBand(), savgolay_nl_opt[0], savgolay_nr_opt[0], savgolay_ld_opt[0], savgolay_m_opt[0]);</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         std::cout << <span class="stringliteral">"taps (size is "</span> << tapz_opt.size() << <span class="stringliteral">"): "</span>;</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<tapz_opt.size();++itap)</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>           std::cout<< tapz_opt[itap] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         std::cout<< std::endl;</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>       }</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       filter1d.setTaps(tapz_opt);</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>       filter1d.filter(input,output);</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>     }</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>     <span class="keywordflow">case</span>(filter2d::percentile):<span class="comment">//deliberate fall through</span></div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>     <span class="keywordflow">case</span>(filter2d::threshold):<span class="comment">//deliberate fall through</span></div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>       assert(threshold_opt.size());</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       <span class="keywordflow">if</span>(dimZ_opt.size())</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>     filter1d.setThresholds(threshold_opt);</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>     filter2d.setThresholds(threshold_opt);</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>     <span class="keywordflow">case</span>(filter2d::density):<span class="comment">//deliberate fall through</span></div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>       filter2d.setClasses(class_opt);</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>     std::cout << <span class="stringliteral">"classes set"</span> << std::endl;</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       <span class="keywordflow">if</span>(dimZ_opt[0]==1)</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>         filter1d.stat(input,output,method_opt[0]);</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         assert(down_opt[0]==1);<span class="comment">//not implemented yet...</span></div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         filter1d.filter(input,output,method_opt[0],dimZ_opt[0]);</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       }</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>     }</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       filter2d.doit(input,output,method_opt[0],dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       }</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       }</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>     }</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>   }</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>   input.close();</div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>   output.close();</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>   <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> }</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       srf[isrf][1].push_back(0);    </div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       srf[isrf][0].push_back(srf[isrf][0].back()+1);</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       srf[isrf][1].push_back(0);</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>         cout << <span class="stringliteral">"srf file details: "</span> << srf[isrf][0].size() << <span class="stringliteral">" wavelengths defined"</span> << endl;    </div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     }</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     assert(output.nrOfBand()==srf.size());</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>     <span class="keywordtype">double</span> centreWavelength=0;</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       <span class="keywordflow">if</span>((y+1+down_opt[0]/2)%down_opt[0])</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>         input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isrf=0;isrf<srf.size();++isrf){</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>         vector<double> lineOutput(output.nrOfCol());</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>         <span class="keywordtype">double</span> delta=1.0;</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>         <span class="keywordtype">bool</span> normalize=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     centreWavelength=filter1d.applySrf<<span class="keywordtype">double</span>>(wavelengthIn_opt,lineInput,srf[isrf], interpolationType_opt[0], lineOutput, delta, normalize);</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>           std::cout << <span class="stringliteral">"centre wavelength srf "</span> << isrf << <span class="stringliteral">": "</span> << centreWavelength << std::endl;</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>           output.writeData(lineOutput,GDT_Float64,y/down_opt[0],isrf);</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>         }</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>           cerr << errorstring << <span class="stringliteral">"in srf "</span> << srf_opt[isrf] << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>         }</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span> </div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       }</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     }</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span> </div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>   }</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     <span class="keywordflow">switch</span>(filter2d::Filter2d::getFilterType(method_opt[0])){</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     <span class="keywordflow">case</span>(filter2d::dilate):</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     exit(1);</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       }</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>           std::cout<< <span class="stringliteral">"1-D filtering: dilate"</span> << std::endl;</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       filter1d.morphology(input,output,<span class="stringliteral">"dilate"</span>,dimZ_opt[0],verbose_opt[0]);</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     }</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       filter2d.morphology(input,output,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       }</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       }</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     <span class="keywordflow">case</span>(filter2d::erode):</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     exit(1);</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>       }</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <span class="keywordflow">if</span>(dimZ_opt.size()>0){</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>         std::cout<< <span class="stringliteral">"1-D filtering: dilate"</span> << std::endl;</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       filter1d.morphology(input,output,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>     }</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       filter2d.morphology(input,output,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     }</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>       }</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>       }</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     <span class="keywordflow">case</span>(filter2d::close):{<span class="comment">//closing</span></div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     exit(1);</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       }</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span> </div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> tmpout;</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       tmpout.open(<span class="stringliteral">"/vsimem/dilation.tif"</span>,input.nrOfCol(),input.nrOfRow(),input.nrOfBand(),input.getDataType(),input.getImageType());</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>           filter1d.morphology(input,tmpout,<span class="stringliteral">"dilate"</span>,dimZ_opt[0]);</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>         }</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>       filter2d.morphology(input,tmpout,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>         }</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>       }</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>       <span class="keywordflow">catch</span>(std::string errorString){</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>     std::cout<< errorString;</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     exit(1);</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>       }</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       tmpout.close();</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> tmpin;</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>       tmpin.open(<span class="stringliteral">"/vsimem/dilation.tif"</span>);</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       filter1d.morphology(tmpin,output,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>     }</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       filter2d.morphology(tmpin,output,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>     }</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>       }</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       }</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       tmpin.close();</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     }</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     <span class="keywordflow">case</span>(filter2d::open):{<span class="comment">//opening</span></div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>     exit(1);</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       }</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> tmpout;</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       tmpout.open(<span class="stringliteral">"/vsimem/erosion.tif"</span>,input.nrOfCol(),input.nrOfRow(),input.nrOfBand(),input.getDataType(),input.getImageType());</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>       filter1d.morphology(input,tmpout,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     }</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       filter2d.morphology(input,tmpout,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>     }</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       }</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       <span class="keywordflow">catch</span>(std::string errorString){</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>     std::cout<< errorString;</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>     exit(1);</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       }</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       tmpout.close();</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> tmpin;</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     tmpin.open(<span class="stringliteral">"/vsimem/erosion.tif"</span>);</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       filter1d.morphology(tmpin,output,<span class="stringliteral">"dilate"</span>,dimZ_opt[0]);</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     }</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       filter2d.morphology(tmpin,output,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>     }</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     tmpin.close();</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>     tmpout.close();</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       }</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       }</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>     }</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     <span class="keywordflow">case</span>(filter2d::homog):{<span class="comment">//spatially homogeneous</span></div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>     filter2d.doit(input,output,<span class="stringliteral">"homog"</span>,dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       }</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       }</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     }</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>     <span class="keywordflow">case</span>(filter2d::heterog):{<span class="comment">//spatially heterogeneous</span></div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>     filter2d.doit(input,output,<span class="stringliteral">"heterog"</span>,dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       }</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       }</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>     }</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     <span class="keywordflow">case</span>(filter2d::shift):{<span class="comment">//shift</span></div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for shift operator"</span> << std::endl;</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     exit(1);</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       }</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       assert(input.nrOfBand());</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       assert(input.nrOfCol());</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>       assert(input.nrOfRow());</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>         filter2d.shift(input,output,dimX_opt[0],dimY_opt[0],threshold_opt[0],filter2d::Filter2d::getResampleType(resample_opt[0]));</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       }</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>       }</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     }</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     <span class="comment">// case(filter2d::linearfeature):{</span></div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>     <span class="comment">//   if(down_opt[0]!=1){</span></div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <span class="comment">//  std::cerr << "Error: down option not supported for linear feature" << std::endl;</span></div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     <span class="comment">//  exit(1);</span></div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="comment">//   }</span></div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     <span class="comment">//   assert(input.nrOfBand());</span></div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     <span class="comment">//   assert(input.nrOfCol());</span></div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     <span class="comment">//   assert(input.nrOfRow());</span></div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     <span class="comment">//   float theAngle=361;</span></div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     <span class="comment">//   if(angle_opt.size())</span></div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     <span class="comment">//  theAngle=angle_opt[0];</span></div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     <span class="comment">//   if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     <span class="comment">//  std::cout << "using angle " << theAngle << std::endl;</span></div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <span class="comment">//   try{</span></div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     <span class="comment">//  //using an angle step of 5 degrees and no maximum distance</span></div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     <span class="comment">//     filter2d.linearFeature(input,output,theAngle,5,0,eps_opt[0],l1_opt[0],a1_opt[0],l2_opt[0],a2_opt[0],0,verbose_opt[0]);</span></div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     <span class="comment">//   }</span></div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>     <span class="comment">//   catch(string errorstring){</span></div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>     <span class="comment">//     cerr << errorstring << endl;</span></div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>     <span class="comment">//   }</span></div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     <span class="comment">//   break;</span></div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>     <span class="keywordflow">case</span>(filter2d::mrf):{<span class="comment">//Markov Random Field</span></div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>     std::cout << <span class="stringliteral">"Markov Random Field filtering"</span> << std::endl;</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     <span class="keywordflow">if</span>(beta_opt.size()){</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       <span class="comment">//in file: classFrom classTo</span></div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       <span class="comment">//in variable: beta[classTo][classFrom]</span></div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <a class="code" href="classFileReaderAscii.html">FileReaderAscii</a> betaReader(beta_opt[0]);</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> beta(class_opt.size(),class_opt.size());</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       vector<int> cols(class_opt.size());</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>         cols[iclass]=iclass;</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       betaReader.readData(beta,cols);</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>         std::cout << <span class="stringliteral">"using values for beta:"</span> << std::endl;</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<class_opt.size();++iclass1)</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>           std::cout << <span class="stringliteral">"      "</span> << iclass1 << <span class="stringliteral">" ("</span> << class_opt[iclass1] << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>         std::cout << std::endl;</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<class_opt.size();++iclass1){</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>           std::cout << iclass1 << <span class="stringliteral">" ("</span> << class_opt[iclass1] << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<class_opt.size();++iclass2)</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>         std::cout << <span class="stringliteral">" "</span> << beta[iclass2][iclass1] << <span class="stringliteral">" ("</span> << class_opt[iclass2] << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>           std::cout << std::endl;</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>         }</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       }</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       filter2d.mrf(input, output, dimX_opt[0], dimY_opt[0], beta, <span class="keyword">true</span>, down_opt[0], verbose_opt[0]);</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>     }</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       filter2d.mrf(input, output, dimX_opt[0], dimY_opt[0], 1, <span class="keyword">true</span>, down_opt[0], verbose_opt[0]);</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>       }</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       }</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>     }</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>     <span class="keywordflow">case</span>(filter2d::sobelx):{<span class="comment">//Sobel edge detection in X</span></div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>     exit(1);</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       }</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>       theTaps[0][0]=-1.0;</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       theTaps[0][1]=0.0;</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>       theTaps[0][2]=1.0;</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       theTaps[1][0]=-2.0;</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>       theTaps[1][1]=0.0;</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       theTaps[1][2]=2.0;</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       theTaps[2][0]=-1.0;</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       theTaps[2][1]=0.0;</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       theTaps[2][2]=1.0;</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       filter2d.setTaps(theTaps);</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       }</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       }</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>     }</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     <span class="keywordflow">case</span>(filter2d::sobely):{<span class="comment">//Sobel edge detection in Y</span></div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>     exit(1);</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>       }</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       theTaps[0][0]=1.0;</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       theTaps[0][1]=2.0;</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       theTaps[0][2]=1.0;</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       theTaps[1][0]=0.0;</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       theTaps[1][1]=0.0;</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       theTaps[1][2]=0.0;</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       theTaps[2][0]=-1.0;</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       theTaps[2][1]=-2.0;</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>       theTaps[2][2]=-1.0;</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       filter2d.setTaps(theTaps);</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       }</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       }</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>     }</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     <span class="keywordflow">case</span>(filter2d::sobelxy):{<span class="comment">//Sobel edge detection in XY</span></div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>     exit(1);</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       }</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>       theTaps[0][0]=0.0;</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       theTaps[0][1]=1.0;</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       theTaps[0][2]=2.0;</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>       theTaps[1][0]=-1.0;</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>       theTaps[1][1]=0.0;</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       theTaps[1][2]=1.0;</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       theTaps[2][0]=-2.0;</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       theTaps[2][1]=-1.0;</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       theTaps[2][2]=0.0;</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       filter2d.setTaps(theTaps);</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       }</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>       }</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>     }</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     <span class="keywordflow">case</span>(filter2d::sobelyx):{<span class="comment">//Sobel edge detection in XY</span></div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>     exit(1);</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       }</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>       theTaps[0][0]=2.0;</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>       theTaps[0][1]=1.0;</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>       theTaps[0][2]=0.0;</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>       theTaps[1][0]=1.0;</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>       theTaps[1][1]=0.0;</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>       theTaps[1][2]=-1.0;</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>       theTaps[2][0]=0.0;</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>       theTaps[2][1]=-1.0;</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>       theTaps[2][2]=-2.0;</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>       filter2d.setTaps(theTaps);</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>       }</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>       }</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     }</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>     <span class="keywordflow">case</span>(filter2d::smooth):{<span class="comment">//Smoothing filter</span></div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>     exit(1);</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>       }</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>         std::cout<< <span class="stringliteral">"1-D filtering: smooth"</span> << std::endl;</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       filter1d.smooth(input,output,dimZ_opt[0]);</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>     }</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       filter2d.smooth(input,output,dimX_opt[0],dimY_opt[0]);</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>     }</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>       }</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       }</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>     }</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>     <span class="keywordflow">case</span>(filter2d::smoothnodata):{<span class="comment">//Smoothing filter</span></div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>     exit(1);</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>       }</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         std::cout<< <span class="stringliteral">"1-D filtering: smooth"</span> << std::endl;</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>       filter1d.smoothNoData(input,interpolationType_opt[0],output);</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>     }</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>         std::cout<< <span class="stringliteral">"2-D filtering: smooth"</span> << std::endl;</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>       filter2d.smoothNoData(input,output,dimX_opt[0],dimY_opt[0]);</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>     }</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>       }</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>       }</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>     }</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>     <span class="keywordflow">case</span>(filter2d::dwt):</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>     exit(1);</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>       }</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>         std::cout<< <span class="stringliteral">"DWT in spectral domain"</span> << std::endl;</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>       filter1d.dwtForward(input, output, wavelet_type_opt[0], family_opt[0]);</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>     }</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>       filter2d.dwtForward(input, output, wavelet_type_opt[0], family_opt[0]);</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>       }</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>       }</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>     <span class="keywordflow">case</span>(filter2d::dwti):</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>     exit(1);</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>       }</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>         std::cout<< <span class="stringliteral">"inverse DWT in spectral domain"</span> << std::endl;</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>       filter1d.dwtInverse(input, output, wavelet_type_opt[0], family_opt[0]);</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>     }</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>       filter2d.dwtInverse(input, output, wavelet_type_opt[0], family_opt[0]);</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>       }</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>       }</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>     <span class="keywordflow">case</span>(filter2d::dwt_cut):</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>     exit(1);</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>       }</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>       <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>           std::cout<< <span class="stringliteral">"DWT approximation in spectral domain"</span> << std::endl;</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>     filter1d.dwtCut(input, output, wavelet_type_opt[0], family_opt[0], threshold_opt[0]);</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>       }</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>     filter2d.dwtCut(input, output, wavelet_type_opt[0], family_opt[0], threshold_opt[0]);</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>     <span class="keywordflow">case</span>(filter2d::dwt_cut_from):</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>     exit(1);</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>       }</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>         std::cout<< <span class="stringliteral">"DWT approximation in spectral domain"</span> << std::endl;</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>       filter1d.dwtCutFrom(input, output, wavelet_type_opt[0], family_opt[0], static_cast<int>(threshold_opt[0]));</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>     }</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>       <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Error: this filter is not supported in 2D"</span>;</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>     }</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>       }</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>       }</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>     <span class="keywordflow">case</span>(filter2d::savgolay):{</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>       assert(savgolay_nl_opt.size());</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>       assert(savgolay_nr_opt.size());</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>       assert(savgolay_ld_opt.size());</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>       assert(savgolay_m_opt.size());</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         std::cout << <span class="stringliteral">"Calculating Savitzky-Golay coefficients: "</span> << endl;</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>       filter1d.getSavGolayCoefficients(tapz_opt, input.nrOfBand(), savgolay_nl_opt[0], savgolay_nr_opt[0], savgolay_ld_opt[0], savgolay_m_opt[0]);</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>         std::cout << <span class="stringliteral">"taps (size is "</span> << tapz_opt.size() << <span class="stringliteral">"): "</span>;</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<tapz_opt.size();++itap)</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>           std::cout<< tapz_opt[itap] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>         std::cout<< std::endl;</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>       }</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>       filter1d.setTaps(tapz_opt);</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       filter1d.filter(input,output);</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>     }</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>     <span class="keywordflow">case</span>(filter2d::percentile):<span class="comment">//deliberate fall through</span></div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>     <span class="keywordflow">case</span>(filter2d::threshold):<span class="comment">//deliberate fall through</span></div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>       assert(threshold_opt.size());</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       <span class="keywordflow">if</span>(dimZ_opt.size())</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>     filter1d.setThresholds(threshold_opt);</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>     filter2d.setThresholds(threshold_opt);</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>     <span class="keywordflow">case</span>(filter2d::density):<span class="comment">//deliberate fall through</span></div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>       filter2d.setClasses(class_opt);</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>     std::cout << <span class="stringliteral">"classes set"</span> << std::endl;</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordflow">if</span>(dimZ_opt[0]==1)</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         filter1d.stat(input,output,method_opt[0]);</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>         assert(down_opt[0]==1);<span class="comment">//not implemented yet...</span></div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>         filter1d.filter(input,output,method_opt[0],dimZ_opt[0]);</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>       }</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>     }</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>       filter2d.doit(input,output,method_opt[0],dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       }</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>       }</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>     }</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>   }</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>   input.close();</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>   output.close();</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>   <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span> }</div>
 <div class="ttc" id="classFileReaderAscii_html"><div class="ttname"><a href="classFileReaderAscii.html">FileReaderAscii</a></div><div class="ttdef"><b>Definition:</b> <a href="FileReaderAscii_8h_source.html#l00030">FileReaderAscii.h:30</a></div></div>
 <div class="ttc" id="classfilter_1_1Filter_html"><div class="ttname"><a href="classfilter_1_1Filter.html">filter::Filter</a></div><div class="ttdef"><b>Definition:</b> <a href="Filter_8h_source.html#l00040">Filter.h:40</a></div></div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classfilter2d_1_1Filter2d_html"><div class="ttname"><a href="classfilter2d_1_1Filter2d.html">filter2d::Filter2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Filter2d_8h_source.html#l00065">Filter2d.h:65</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
@@ -1029,7 +1030,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilter__spatial_8py_source.html b/doc/html/pkfilter__spatial_8py_source.html
index d51c916..9a7850c 100644
--- a/doc/html/pkfilter__spatial_8py_source.html
+++ b/doc/html/pkfilter__spatial_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -183,7 +183,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilter__spectral_8py_source.html b/doc/html/pkfilter__spectral_8py_source.html
index ecbc049..e22d9ba 100644
--- a/doc/html/pkfilter__spectral_8py_source.html
+++ b/doc/html/pkfilter__spectral_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -177,7 +177,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilterascii.html b/doc/html/pkfilterascii.html
index f9df8ba..c04e1b6 100644
--- a/doc/html/pkfilterascii.html
+++ b/doc/html/pkfilterascii.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -97,7 +97,7 @@ Usage: pkfilterascii -i input.txt [-ic column]* </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilterascii_8cc_source.html b/doc/html/pkfilterascii_8cc_source.html
index 3eddc0b..24291cd 100644
--- a/doc/html/pkfilterascii_8cc_source.html
+++ b/doc/html/pkfilterascii_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -369,7 +369,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilterdem.html b/doc/html/pkfilterdem.html
index dd326bb..9246f6b 100644
--- a/doc/html/pkfilterdem.html
+++ b/doc/html/pkfilterdem.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@ Options</h1>
 <tr>
 <td>ot </td><td>otype </td><td>std::string </td><td></td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td></td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). </td></tr>
 <tr>
 <td>ct </td><td>ct </td><td>std::string </td><td></td><td>color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table </td></tr>
 <tr>
@@ -91,7 +91,7 @@ Usage: pkfilterdem -i input.txt -o output </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilterdem_8cc_source.html b/doc/html/pkfilterdem_8cc_source.html
index 25316f3..da952a3 100644
--- a/doc/html/pkfilterdem_8cc_source.html
+++ b/doc/html/pkfilterdem_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -96,7 +96,7 @@
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> hThreshold_opt(<span class="stringliteral">"ht"</span>, <span class="stringliteral">"ht"</span>, <span class="stringliteral">"initial height threshold for progressive morphological filtering. Use low values to remove more height objects. Optionally, a maximum height threshold can be set via a second argument (e.g., - [...]
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> minChange_opt(<span class="stringliteral">"minchange"</span>, <span class="stringliteral">"minchange"</span>, <span class="stringliteral">"Stop iterations when no more pixels are changed than this threshold."</span>, 0);</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>,<span class="stringl [...]
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>,<span class="stringliteral">"GTiff"</span>);</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table"</span>);</div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value"</span>);</div>
@@ -172,7 +172,7 @@
 <div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
 <div class="line"><a name="l00161"></a><span class="lineno">  161</span>     std::cout << std::endl << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
 <div class="line"><a name="l00162"></a><span class="lineno">  162</span> </div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <span class="keywordtype">string</span> imageType=input.getImageType();</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <span class="keywordtype">string</span> imageType;<span class="comment">//=input.getImageType();</span></div>
 <div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <span class="keywordflow">if</span>(oformat_opt.size())</div>
 <div class="line"><a name="l00165"></a><span class="lineno">  165</span>     imageType=oformat_opt[0];</div>
 <div class="line"><a name="l00166"></a><span class="lineno">  166</span> </div>
@@ -437,8 +437,8 @@
 <div class="line"><a name="l00425"></a><span class="lineno">  425</span>   outputWriter.close();</div>
 <div class="line"><a name="l00426"></a><span class="lineno">  426</span>   <span class="keywordflow">return</span> 0;</div>
 <div class="line"><a name="l00427"></a><span class="lineno">  427</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classfilter2d_1_1Filter2d_html"><div class="ttname"><a href="classfilter2d_1_1Filter2d.html">filter2d::Filter2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Filter2d_8h_source.html#l00065">Filter2d.h:65</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
@@ -446,7 +446,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilterdem_8py_source.html b/doc/html/pkfilterdem_8py_source.html
index 98e8fd5..3767370 100644
--- a/doc/html/pkfilterdem_8py_source.html
+++ b/doc/html/pkfilterdem_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -163,7 +163,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfsann.html b/doc/html/pkfsann.html
index 52c144a..8b15de5 100644
--- a/doc/html/pkfsann.html
+++ b/doc/html/pkfsann.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -115,7 +115,7 @@ Usage: pkfsann -t training -n number </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfsann_8cc_source.html b/doc/html/pkfsann_8cc_source.html
index 353f2a7..5c64117 100644
--- a/doc/html/pkfsann_8cc_source.html
+++ b/doc/html/pkfsann_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -447,7 +447,7 @@
 <div class="line"><a name="l00448"></a><span class="lineno">  448</span>     exit(1);</div>
 <div class="line"><a name="l00449"></a><span class="lineno">  449</span>   }</div>
 <div class="line"><a name="l00450"></a><span class="lineno">  450</span>   <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
 <div class="line"><a name="l00452"></a><span class="lineno">  452</span>     exit(1);</div>
 <div class="line"><a name="l00453"></a><span class="lineno">  453</span>   }</div>
 <div class="line"><a name="l00454"></a><span class="lineno">  454</span>   <span class="comment">//delete class 0 ?</span></div>
@@ -694,7 +694,7 @@
 <div class="line"><a name="l00695"></a><span class="lineno">  695</span>     }</div>
 <div class="line"><a name="l00696"></a><span class="lineno">  696</span>   }</div>
 <div class="line"><a name="l00697"></a><span class="lineno">  697</span>   <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     std::cout << <span class="stringliteral">"catched feature selection"</span> << std::endl;</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     std::cout << <span class="stringliteral">"caught feature selection"</span> << std::endl;</div>
 <div class="line"><a name="l00699"></a><span class="lineno">  699</span>     exit(1);</div>
 <div class="line"><a name="l00700"></a><span class="lineno">  700</span>   }</div>
 <div class="line"><a name="l00701"></a><span class="lineno">  701</span> </div>
@@ -730,7 +730,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfsann_8h_source.html b/doc/html/pkfsann_8h_source.html
index f9befaf..cfd1f89 100644
--- a/doc/html/pkfsann_8h_source.html
+++ b/doc/html/pkfsann_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -105,7 +105,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfssvm.html b/doc/html/pkfssvm.html
index 9c7fa8c..974b17b 100644
--- a/doc/html/pkfssvm.html
+++ b/doc/html/pkfssvm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -127,7 +127,7 @@ Usage: pkfssvm -t training -n number </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfssvm_8cc_source.html b/doc/html/pkfssvm_8cc_source.html
index 4f5e181..ced46cf 100644
--- a/doc/html/pkfssvm_8cc_source.html
+++ b/doc/html/pkfssvm_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -485,7 +485,7 @@
 <div class="line"><a name="l00492"></a><span class="lineno">  492</span>     exit(1);</div>
 <div class="line"><a name="l00493"></a><span class="lineno">  493</span>   }</div>
 <div class="line"><a name="l00494"></a><span class="lineno">  494</span>   <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
 <div class="line"><a name="l00496"></a><span class="lineno">  496</span>     exit(1);</div>
 <div class="line"><a name="l00497"></a><span class="lineno">  497</span>   }</div>
 <div class="line"><a name="l00498"></a><span class="lineno">  498</span>   <span class="comment">//todo: delete class 0 ?</span></div>
@@ -726,7 +726,7 @@
 <div class="line"><a name="l00733"></a><span class="lineno">  733</span>     }</div>
 <div class="line"><a name="l00734"></a><span class="lineno">  734</span>   }</div>
 <div class="line"><a name="l00735"></a><span class="lineno">  735</span>   <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     std::cout << <span class="stringliteral">"catched feature selection"</span> << std::endl;</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     std::cout << <span class="stringliteral">"caught feature selection"</span> << std::endl;</div>
 <div class="line"><a name="l00737"></a><span class="lineno">  737</span>     exit(1);</div>
 <div class="line"><a name="l00738"></a><span class="lineno">  738</span>   }</div>
 <div class="line"><a name="l00739"></a><span class="lineno">  739</span> </div>
@@ -760,7 +760,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkgetmask.html b/doc/html/pkgetmask.html
index f97cf71..3010172 100644
--- a/doc/html/pkgetmask.html
+++ b/doc/html/pkgetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@ Options</h1>
 <tr>
 <td>ot </td><td>otype </td><td>std::string </td><td>Byte </td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td></td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). </td></tr>
 <tr>
 <td>co </td><td>co </td><td>std::string </td><td></td><td>Creation option for output file. Multiple options can be specified. </td></tr>
 <tr>
@@ -93,7 +93,7 @@ Usage: pkgetmask -i input -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkgetmask_8cc_source.html b/doc/html/pkgetmask_8cc_source.html
index 867e3c9..b626f45 100644
--- a/doc/html/pkgetmask_8cc_source.html
+++ b/doc/html/pkgetmask_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -89,7 +89,7 @@
 <div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"value(s) for invalid pixels: not between min and max"</span>, 0);</div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output mask file"</span>);</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringlitera [...]
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>,<span class="stringliteral">"GTiff"</span>);</div>
 <div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0,2);</div>
@@ -197,7 +197,7 @@
 <div class="line"><a name="l00187"></a><span class="lineno">  187</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
 <div class="line"><a name="l00188"></a><span class="lineno">  188</span>       cout << <span class="stringliteral">"Using data type from input image: "</span> << GDALGetDataTypeName(theType) << endl;</div>
 <div class="line"><a name="l00189"></a><span class="lineno">  189</span>   }</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordtype">string</span> imageType=imgReader.getImageType();</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordtype">string</span> imageType;<span class="comment">//=imgReader.getImageType();</span></div>
 <div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
 <div class="line"><a name="l00192"></a><span class="lineno">  192</span>     imageType=oformat_opt[0];</div>
 <div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
@@ -279,14 +279,14 @@
 <div class="line"><a name="l00269"></a><span class="lineno">  269</span>   imgReader.close();</div>
 <div class="line"><a name="l00270"></a><span class="lineno">  270</span>   imgWriter.close();</div>
 <div class="line"><a name="l00271"></a><span class="lineno">  271</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkgetmask_8py_source.html b/doc/html/pkgetmask_8py_source.html
index c33f8eb..d7f2f10 100644
--- a/doc/html/pkgetmask_8py_source.html
+++ b/doc/html/pkgetmask_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -196,7 +196,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkinfo.html b/doc/html/pkinfo.html
index d5f548d..cb20c23 100644
--- a/doc/html/pkinfo.html
+++ b/doc/html/pkinfo.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -135,7 +135,7 @@ Usage: pkinfo -i input [options]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkinfo_8cc_source.html b/doc/html/pkinfo_8cc_source.html
index a8aa662..d6e095e 100644
--- a/doc/html/pkinfo_8cc_source.html
+++ b/doc/html/pkinfo_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -330,7 +330,7 @@
 <div class="line"><a name="l00338"></a><span class="lineno">  338</span>       imgReader.getMinMax(static_cast<int>(uli),static_cast<int>(lri),static_cast<int>(ulj),static_cast<int>(lrj),theBand,minValue,maxValue);</div>
 <div class="line"><a name="l00339"></a><span class="lineno">  339</span>     }</div>
 <div class="line"><a name="l00340"></a><span class="lineno">  340</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       imgReader.getMinMax(minValue,maxValue,theBand,<span class="keyword">true</span>);</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       imgReader.getMinMax(minValue,maxValue,theBand);</div>
 <div class="line"><a name="l00342"></a><span class="lineno">  342</span>     <span class="keywordflow">if</span>(minmax_opt[0])</div>
 <div class="line"><a name="l00343"></a><span class="lineno">  343</span>       std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" -max "</span> << maxValue << <span class="stringliteral">" "</span>;</div>
 <div class="line"><a name="l00344"></a><span class="lineno">  344</span>     <span class="keywordflow">else</span>{</div>
@@ -362,7 +362,7 @@
 <div class="line"><a name="l00370"></a><span class="lineno">  370</span>       <span class="comment">//    std::cout << "image description: " << imgReader.getImageDescription() << std::endl;</span></div>
 <div class="line"><a name="l00371"></a><span class="lineno">  371</span>       <span class="comment">// }</span></div>
 <div class="line"><a name="l00372"></a><span class="lineno">  372</span>       <span class="comment">// catch(...){</span></div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       <span class="comment">//    std::cout << "catched" << std::endl;</span></div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       <span class="comment">//    std::cout << "caught" << std::endl;</span></div>
 <div class="line"><a name="l00374"></a><span class="lineno">  374</span>       <span class="comment">// }</span></div>
 <div class="line"><a name="l00375"></a><span class="lineno">  375</span>       std::list<std::string> metaData;</div>
 <div class="line"><a name="l00376"></a><span class="lineno">  376</span>       imgReader.getMetadata(metaData);</div>
@@ -436,7 +436,7 @@
 <div class="line"><a name="l00444"></a><span class="lineno">  444</span>   <span class="keywordflow">if</span>(!read_opt[0])</div>
 <div class="line"><a name="l00445"></a><span class="lineno">  445</span>     std::cout << std::endl;</div>
 <div class="line"><a name="l00446"></a><span class="lineno">  446</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 <div class="ttc" id="classEgcs_html"><div class="ttname"><a href="classEgcs.html">Egcs</a></div><div class="ttdef"><b>Definition:</b> <a href="Egcs_8h_source.html#l00026">Egcs.h:26</a></div></div>
@@ -444,7 +444,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkkalman.html b/doc/html/pkkalman.html
index 2f41143..a0b50ed 100644
--- a/doc/html/pkkalman.html
+++ b/doc/html/pkkalman.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -45,135 +45,90 @@
 <div class="contents">
 <div class="textblock"><p>produce kalman filtered raster time series </p>
 <h2>SYNOPSIS</h2>
+<p><code> Usage: pkkalman -mod modelinput.tif -obs obsinput.tif [-direction [forward|backward|smooth]]* -ofw output_fc.tif -obw output_bw.tif -ofb output_fb.tif </code></p>
 <p><code></code></p>
-<p><code></code></p>
-<h1><a class="anchor" id="pkkalman_options"></a>
+<p><code> Options[-tmod time]* [-tobs time]* [-modnodata value]* [-obsnodata value]* [-modmask mask.tif] [-obsmask mask.tif] [-msknodata value]* [-mskband] [-u_ofw uncert_fw.tif] [-u_obw uncert_bw.tif] [-u_ofb uncert_fb.tif]</code></p>
+<p><code> Advanced options (see table) </code></p>
+<h1><a class="anchor" id="pkkalman_description"></a>
+Description</h1>
+<p>The utilty pkkalman will complement a time series of observations (option -obs) at fine spatial resolution. A data assimilation technique based on a Kalman filter is hereby used. The data at fine spatial resolution are assimilated with coarse spatial resolution time series at a finer temporal resolution, referred to as a model (option -mod). The time series for both observation and model can either be provided as multi-band raster datasets or as multiple single band datasets. Missing  [...]
+<h1><a class="anchor" id="pkcrop_options"></a>
 Options</h1>
 <ul>
 <li>use either <code>-short</code> or <code>--long</code> options (both <code>--long=value</code> and <code>--long value</code> are supported)</li>
-<li>short option <code>-h</code> shows basic options only, long option <code>--help</code> shows all options</li>
-</ul>
-<table class="doxtable">
+<li>short option <code>-h</code> shows basic options only, long option <code>--help</code> shows all options <table class="doxtable">
 <tr>
 <th>short</th><th>long</th><th>type</th><th>default</th><th>description  </th></tr>
 <tr>
 <td>dir </td><td>direction </td><td>std::string </td><td>forward </td><td>direction to run model (forward|backward|smooth) </td></tr>
 <tr>
-<td>mod </td><td>model </td><td>std::string </td><td></td><td>model input datasets, e.g., MODIS (use: -mod model1 -mod model2 etc. </td></tr>
-<tr>
-<td>obs </td><td>observation </td><td>std::string </td><td></td><td>observation input datasets, e.g., landsat (use: -obs obs1 -obs obs2 etc. </td></tr>
-<tr>
-<td>tmod </td><td>tmodel </td><td>int </td><td></td><td>time sequence of model input. Sequence must have exact same length as model input. Leave empty to have default sequence 0,1,2,etc. </td></tr>
-<tr>
-<td>tobs </td><td>tobservation </td><td>int </td><td></td><td>time sequence of observation input. Sequence must have exact same length as observation input) </td></tr>
-<tr>
-<td>a_srs </td><td>a_srs </td><td>std::string </td><td></td><td>Override the projection for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid </td></tr>
-<tr>
-<td>ofw </td><td>outputfw </td><td>std::string </td><td></td><td>Output raster dataset for forward model </td></tr>
-<tr>
-<td>obw </td><td>outputbw </td><td>std::string </td><td></td><td>Output raster dataset for backward model </td></tr>
-<tr>
-<td>ofb </td><td>outputfb </td><td>std::string </td><td></td><td>Output raster dataset for smooth model </td></tr>
-<tr>
-<td>modnodata </td><td>modnodata </td><td>double </td><td>0 </td><td>invalid value for model input </td></tr>
-<tr>
-<td>obsnodata </td><td>obsnodata </td><td>double </td><td>0 </td><td>invalid value for observation input </td></tr>
-<tr>
-<td>obsmin </td><td>obsmin </td><td>double </td><td></td><td>Minimum value for observation data </td></tr>
-<tr>
-<td>obsmax </td><td>obsmax </td><td>double </td><td></td><td>Maximum value for observation data </td></tr>
-<tr>
-<td>eps </td><td>eps </td><td>double </td><td>1e-05 </td><td>epsilon for non zero division </td></tr>
+<td>mod </td><td>model </td><td>std::string </td><td></td><td>coarse spatial resolution input datasets(s) used as model. Use either multi-band input (-model multiband_model.tif) or multiple single-band inputs (-mod model1 -mod model2 etc.) </td></tr>
 <tr>
-<td>um </td><td>uncertmodel </td><td>double </td><td>2 </td><td>Multiply this value with std dev of first model image to obtain uncertainty of model </td></tr>
+<td>modmask</td><td>modmask </td><td>std::string </td><td></td><td>model mask datasets(s). Must have same dimension as model input. Use either multi-band input or multiple single-band inputs </td></tr>
 <tr>
-<td>uo </td><td>uncertobs </td><td>double </td><td>0 </td><td>Uncertainty of valid observations </td></tr>
+<td>obs </td><td>observation </td><td>std::string </td><td></td><td>fine spatial resolution input dataset(s) used as observation. Use either multi-band input (-obs multiband_obs.tif) or multiple single-band inputs (-obs obs1 -obs obs2 etc.) </td></tr>
 <tr>
-<td>unodata </td><td>uncertnodata </td><td>double </td><td>10000 </td><td>Uncertainty in case of no-data values in observation </td></tr>
-<tr>
-<td>q </td><td>q </td><td>double </td><td>1 </td><td>Process noise: expresses instability (variance) of proportions of fine res pixels within a moderate resolution pixel </td></tr>
-<tr>
-<td>down </td><td>down </td><td>int </td><td></td><td>Downsampling factor for reading model data to calculate regression </td></tr>
-<tr>
-<td>co </td><td>co </td><td>std::string </td><td></td><td>Creation option for output file. Multiple options can be specified. </td></tr>
-<tr>
-<td>v </td><td>verbose </td><td>short </td><td>0 </td><td>verbose mode when positive </td></tr>
-</table>
-<p>produce kalman filtered raster time series </p>
-<h2>SYNOPSIS</h2>
-<p><code></code></p>
-<p><code></code></p>
-<h1><a class="anchor" id="pkkalman_options"></a>
-Options</h1>
-<ul>
-<li>use either <code>-short</code> or <code>--long</code> options (both <code>--long=value</code> and <code>--long value</code> are supported)</li>
-<li>short option <code>-h</code> shows basic options only, long option <code>--help</code> shows all options</li>
-</ul>
-<table class="doxtable">
-<tr>
-<th>short</th><th>long</th><th>type</th><th>default</th><th>description  </th></tr>
-<tr>
-<td>dir </td><td>direction </td><td>std::string </td><td>forward </td><td>direction to run model (forward|backward|smooth) </td></tr>
-<tr>
-<td>mod </td><td>model </td><td>std::string </td><td></td><td>model input datasets, e.g., MODIS (use: -mod model1 -mod model2 etc. </td></tr>
-<tr>
-<td>obs </td><td>observation </td><td>std::string </td><td></td><td>observation input datasets, e.g., landsat (use: -obs obs1 -obs obs2 etc. </td></tr>
+<td>obsmask</td><td>obsmask </td><td>std::string </td><td></td><td>observation mask dataset(s). Must have same dimension as observation input (use multi-band input or multiple single-band inputs </td></tr>
 <tr>
 <td>tmod </td><td>tmodel </td><td>int </td><td></td><td>time sequence of model input. Sequence must have exact same length as model input. Leave empty to have default sequence 0,1,2,etc. </td></tr>
 <tr>
-<td>tobs </td><td>tobservation </td><td>int </td><td></td><td>time sequence of observation input. Sequence must have exact same length as observation input) </td></tr>
+<td>tobs </td><td>tobservation </td><td>int </td><td></td><td>time sequence of observation input. Sequence must have exact same length as observation input </td></tr>
 <tr>
 <td>a_srs </td><td>a_srs </td><td>std::string </td><td></td><td>Override the projection for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid </td></tr>
 <tr>
 <td>ofw </td><td>outputfw </td><td>std::string </td><td></td><td>Output raster dataset for forward model </td></tr>
 <tr>
+<td>u_ofw </td><td>u_outputfw </td><td>std::string </td><td></td><td>Uncertainty output raster dataset for forward model </td></tr>
+<tr>
 <td>obw </td><td>outputbw </td><td>std::string </td><td></td><td>Output raster dataset for backward model </td></tr>
 <tr>
+<td>u_obw </td><td>u_outputbw </td><td>std::string </td><td></td><td>Uncertainty output raster dataset for backward model </td></tr>
+<tr>
 <td>ofb </td><td>outputfb </td><td>std::string </td><td></td><td>Output raster dataset for smooth model </td></tr>
 <tr>
+<td>u_ofb </td><td>u_outputfb </td><td>std::string </td><td></td><td>Uncertainty output raster dataset for smooth model </td></tr>
+<tr>
 <td>modnodata </td><td>modnodata </td><td>double </td><td>0 </td><td>invalid value for model input </td></tr>
 <tr>
 <td>obsnodata </td><td>obsnodata </td><td>double </td><td>0 </td><td>invalid value for observation input </td></tr>
 <tr>
-<td>modoffset </td><td>modoffset </td><td>double </td><td></td><td>offset used to read model input dataset (value=offset+scale*readValue </td></tr>
+<td>msknodata </td><td>msknodata </td><td>float </td><td>0 </td><td>Mask value not to consider </td></tr>
 <tr>
-<td>modscale </td><td>modscale </td><td>double </td><td></td><td>scale used to read model input dataset (value=offset+scale*readValue </td></tr>
+<td>mskband </td><td>mskband </td><td>short </td><td>0 </td><td>Mask band to read (0 indexed) </td></tr>
 <tr>
-<td>obsoffset </td><td>obsoffset </td><td>double </td><td></td><td>offset used to read observation input dataset (value=offset+scale*readValue </td></tr>
+<td>obsmin </td><td>obsmin </td><td>double </td><td></td><td>Minimum value for observation data </td></tr>
 <tr>
-<td>obsscale </td><td>obsscale </td><td>double </td><td></td><td>scale used to read observation input dataset (value=offset+scale*readValue </td></tr>
+<td>obsmax </td><td>obsmax </td><td>double </td><td></td><td>Maximum value for observation data </td></tr>
 <tr>
 <td>eps </td><td>eps </td><td>double </td><td>1e-05 </td><td>epsilon for non zero division </td></tr>
 <tr>
-<td>um </td><td>uncertmodel </td><td>double </td><td>2 </td><td>Multiply this value with std dev of first model image to obtain uncertainty of model </td></tr>
-<tr>
-<td>uo </td><td>uncertobs </td><td>double </td><td>0 </td><td>Uncertainty of valid observations </td></tr>
-<tr>
-<td>w </td><td>weight </td><td>double </td><td></td><td>Set observation uncertainty as weighted difference between observation and model (use -w 0 to use a constant observation uncertainty, use -w value >> 1 to penalize low observation values with respect to model, use -w value << 0 to penalize a high observation values with respect to model </td></tr>
+<td>um </td><td>uncertmodel </td><td>double </td><td>1 </td><td>Uncertainty of the model </td></tr>
 <tr>
-<td>dobs </td><td>deltaobs </td><td>double </td><td></td><td>Lower and upper thresholds for relative pixel differences (in percentage): (observation-model)/model. For instance to force the observation within a +/- 10 % interval, use: -dobs -10 -dobs 10 (equivalent to -dobs 10). Leave empty to always update on observation </td></tr>
+<td>uo </td><td>uncertobs </td><td>double </td><td>1 </td><td>Uncertainty of valid observations </td></tr>
 <tr>
-<td>unodata </td><td>uncertnodata </td><td>double </td><td>10000 </td><td>Uncertainty in case of no-data values in observation </td></tr>
+<td>unodata </td><td>uncertnodata </td><td>double </td><td>100 </td><td>Uncertainty in case of no-data values in observation </td></tr>
 <tr>
-<td>rt </td><td>regtime </td><td>double </td><td>1 </td><td>Set optional regression for sensor difference (model - observation). </td></tr>
-<tr>
-<td>rs </td><td>regsensor </td><td>double </td><td>1 </td><td>Set optional regression for sensor difference (model - observation). </td></tr>
+<td>q </td><td>q </td><td>double </td><td>1 </td><td>Process noise: expresses instability (variance) of proportions of fine res pixels within a moderate resolution pixel </td></tr>
 <tr>
-<td>down </td><td>down </td><td>int </td><td></td><td>Downsampling factor for reading model data to calculate regression </td></tr>
+<td>down </td><td>down </td><td>int </td><td></td><td>Downsampling factor for reading model data to calculate regression (default is ratio between coarse (model) and fine (obs) resolution raster datasets) </td></tr>
 <tr>
-<td>th </td><td>threshold </td><td>float </td><td>0 </td><td>threshold for selecting samples (randomly). Provide probability in percentage (>0) or absolute (<0). </td></tr>
+<td>ot </td><td>otype </td><td>std::string </td><td></td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
 <tr>
-<td>win </td><td>window </td><td>unsigned short </td><td>0 </td><td>window size for calculating regression (use 0 for global) </td></tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). </td></tr>
 <tr>
 <td>co </td><td>co </td><td>std::string </td><td></td><td>Creation option for output file. Multiple options can be specified. </td></tr>
 <tr>
 <td>v </td><td>verbose </td><td>short </td><td>0 </td><td>verbose mode when positive </td></tr>
 </table>
+<h1>Examples </h1>
+</li>
+</ul>
+<p>Some examples how to use pkcrop can be found <a class="el" href="md_examples_pkkalman.html#examples_pkkalman">here</a> </p>
 </div></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkkalman1_8cc_source.html b/doc/html/pkkalman1_8cc_source.html
index 0935788..21f87e0 100644
--- a/doc/html/pkkalman1_8cc_source.html
+++ b/doc/html/pkkalman1_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -1935,15 +1935,15 @@
 <div class="line"><a name="l01929"></a><span class="lineno"> 1929</span> }</div>
 <div class="line"><a name="l01930"></a><span class="lineno"> 1930</span> </div>
 <div class="ttc" id="classimgregression_1_1ImgRegression_html"><div class="ttname"><a href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgRegression_8h_source.html#l00030">ImgRegression.h:30</a></div></div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Jan 19 2016 16:07:01 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkkalman_8cc_source.html b/doc/html/pkkalman_8cc_source.html
index afa7ffb..135fe06 100644
--- a/doc/html/pkkalman_8cc_source.html
+++ b/doc/html/pkkalman_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,1473 +78,1869 @@
 <div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="preprocessor">#include "base/Vector2d.h"</span></div>
 <div class="line"><a name="l00025"></a><span class="lineno">   25</span> <span class="preprocessor">#include "imageclasses/ImgReaderGdal.h"</span></div>
 <div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="preprocessor">#include "imageclasses/ImgWriterGdal.h"</span></div>
-<div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="preprocessor">#include "algorithms/StatFactory.h"</span></div>
-<div class="line"><a name="l00028"></a><span class="lineno">   28</span> </div>
-<div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span> <span class="comment">/*------------------</span></div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span> <span class="comment">  Main procedure</span></div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span> <span class="comment">  ----------------*/</span></div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> direction_opt(<span class="stringliteral">"dir"</span>,<span class="stringliteral">"direction"</span>,<span class="stringliteral">"direction to run model (forward|backward|smooth)"</span>,<span class="stringliteral">"forward"</span>);</div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> model_opt(<span class="stringliteral">"mod"</span>,<span class="stringliteral">"model"</span>,<span class="stringliteral">"model input datasets, e.g., MODIS (use: -mod model1 -mod model2 etc.)"</span>);</div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> observation_opt(<span class="stringliteral">"obs"</span>,<span class="stringliteral">"observation"</span>,<span class="stringliteral">"observation input datasets, e.g., landsat (use: -obs obs1 -obs obs2 etc.)"</span>);</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> tmodel_opt(<span class="stringliteral">"tmod"</span>,<span class="stringliteral">"tmodel"</span>,<span class="stringliteral">"time sequence of model input. Sequence must have exact same length as model input. Leave empty to have default sequence 0,1,2,etc."</span>); </div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> tobservation_opt(<span class="stringliteral">"tobs"</span>,<span class="stringliteral">"tobservation"</span>,<span class="stringliteral">"time sequence of observation input. Sequence must have exact same length as observation input)"</span>); </div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"Override the projection for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid"</span>);</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputfw_opt(<span class="stringliteral">"ofw"</span>, <span class="stringliteral">"outputfw"</span>, <span class="stringliteral">"Output raster dataset for forward model"</span>);</div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputbw_opt(<span class="stringliteral">"obw"</span>, <span class="stringliteral">"outputbw"</span>, <span class="stringliteral">"Output raster dataset for backward model"</span>);</div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputfb_opt(<span class="stringliteral">"ofb"</span>, <span class="stringliteral">"outputfb"</span>, <span class="stringliteral">"Output raster dataset for smooth model"</span>);</div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> gain_opt(<span class="stringliteral">"gain"</span>, <span class="stringliteral">"gain"</span>, <span class="stringliteral">"Output raster dataset for gain"</span>);</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   </div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modnodata_opt(<span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"invalid value for model input"</span>, 0);</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsnodata_opt(<span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"invalid value for observation input"</span>, 0);</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsmin_opt(<span class="stringliteral">"obsmin"</span>, <span class="stringliteral">"obsmin"</span>, <span class="stringliteral">"Minimum value for observation data"</span>);</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsmax_opt(<span class="stringliteral">"obsmax"</span>, <span class="stringliteral">"obsmax"</span>, <span class="stringliteral">"Maximum value for observation data"</span>);</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> eps_opt(<span class="stringliteral">"eps"</span>, <span class="stringliteral">"eps"</span>, <span class="stringliteral">"epsilon for non zero division"</span>, 0.00001);</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertModel_opt(<span class="stringliteral">"um"</span>, <span class="stringliteral">"uncertmodel"</span>, <span class="stringliteral">"Multiplication factor for uncertainty of model"</span>,1,1);</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertObs_opt(<span class="stringliteral">"uo"</span>, <span class="stringliteral">"uncertobs"</span>, <span class="stringliteral">"Uncertainty of valid observations"</span>,1,1);</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> processNoise_opt(<span class="stringliteral">"q"</span>, <span class="stringliteral">"q"</span>, <span class="stringliteral">"Process noise: expresses instability (variance) of proportions of fine res pixels within a moderate resolution pixel"</span>,1);</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertNodata_opt(<span class="stringliteral">"unodata"</span>, <span class="stringliteral">"uncertnodata"</span>, <span class="stringliteral">"Uncertainty in case of no-data values in observation"</span>, 10000);</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> down_opt(<span class="stringliteral">"down"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"Downsampling factor for reading model data to calculate regression"</span>);</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>,<span class="stringliteral">"GTiff"</span>,2);</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode when positive"</span>, 0);</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span> </div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>     doProcess=direction_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>     model_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>     observation_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     tmodel_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     tobservation_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>     projection_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>     outputfw_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>     outputbw_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>     outputfb_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>     gain_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>     modnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>     obsnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>     obsmin_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>     obsmax_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>     eps_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>     uncertModel_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>     uncertObs_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     processNoise_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     uncertNodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     down_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   }</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     exit(0);</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   }</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     std::cerr << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   }</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span> </div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <span class="keywordflow">if</span>(down_opt.empty()){</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     std::cerr << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   }</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     ostringstream errorStream;</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     <span class="keywordflow">if</span>(model_opt.size()<2){</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>       errorStream << <span class="stringliteral">"Error: no model dataset selected, use option -mod"</span> << endl;</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     }</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     <span class="keywordflow">if</span>(observation_opt.size()<1){</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>       errorStream << <span class="stringliteral">"Error: no observation dataset selected, use option -obs"</span> << endl;</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     }</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"smooth"</span>){</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>       <span class="keywordflow">if</span>(outputfw_opt.empty()){</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     errorStream << <span class="stringliteral">"Error: output forward datasets is not provided, use option -ofw"</span> << endl;</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>       }</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>       <span class="keywordflow">if</span>(outputbw_opt.empty()){</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>       }</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>       <span class="keywordflow">if</span>(outputfb_opt.empty()){</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     errorStream << <span class="stringliteral">"Error: output smooth datasets is not provided, use option -ofb"</span> << endl;</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>       }</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     }</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>       <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"forward"</span>&&outputfw_opt.empty()){</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     errorStream << <span class="stringliteral">"Error: output forward datasets is not provided, use option -ofw"</span> << endl;</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>       }</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"backward"</span>&&outputbw_opt.empty()){</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>       }</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span> </div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>       <span class="keywordflow">if</span>(model_opt.size()<observation_opt.size()){</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     errorStream << <span class="stringliteral">"Error: sequence of models should be larger than observations"</span> << endl;</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>       }</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>       <span class="keywordflow">if</span>(tmodel_opt.size()!=model_opt.size()){</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     <span class="keywordflow">if</span>(tmodel_opt.empty())</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>       cout << <span class="stringliteral">"Warning: time sequence is not provided, self generating time sequence from 0 to "</span> << model_opt.size() << endl;</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>       cout << <span class="stringliteral">"Warning: time sequence provided ("</span> << tmodel_opt.size() << <span class="stringliteral">") does not match number of model raster datasets ("</span> << model_opt.size() << <span class="stringliteral">")"</span> << endl;</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     tmodel_opt.clear();</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> tindex=0;tindex<model_opt.size();++tindex)</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>       tmodel_opt.push_back(tindex);</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>       }</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>       <span class="keywordflow">if</span>(tobservation_opt.size()!=observation_opt.size()){</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     errorStream << <span class="stringliteral">"Error: time sequence for observation must match size of observation dataset"</span> << endl;</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>       }</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     }</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   }</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     std::cout << errorString << std::endl;</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     exit(1);</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   }</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span> </div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   stat.setNoDataValues(modnodata_opt);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel1;</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel2;</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderObs;</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterEst;</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="comment">//test</span></div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterGain;</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span> </div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   imgReaderObs.open(observation_opt[0]);</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span> </div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   <span class="keywordtype">int</span> ncol=imgReaderObs.nrOfCol();</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   <span class="keywordtype">int</span> nrow=imgReaderObs.nrOfRow();</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   <span class="keywordflow">if</span>(projection_opt.empty())</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     projection_opt.push_back(imgReaderObs.getProjection());</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <span class="keywordtype">double</span> geotransform[6];</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span> </div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordtype">string</span> imageType=imgReaderObs.getImageType();</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     theInterleave+=imgReaderObs.getInterleave();</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   }</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span> </div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   <span class="keywordflow">if</span>(down_opt.empty()){</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     imgReaderModel1.open(model_opt[0]);</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <span class="keywordtype">double</span> resModel=imgReaderModel1.getDeltaX();</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     <span class="keywordtype">double</span> resObs=imgReaderObs.getDeltaX();</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     <span class="keywordtype">int</span> down=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ceil(resModel/resObs));</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="keywordflow">if</span>(!(down%2))</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       down+=1;</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     down_opt.push_back(down);</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     imgReaderModel1.close();</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   }</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   imgReaderObs.close();</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span> </div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <span class="keywordtype">int</span> obsindex=0;</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span> </div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span> </div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="keywordtype">double</span> errObs=uncertNodata_opt[0];<span class="comment">//start with high initial value in case we do not have first observation at time 0</span></div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span> </div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   vector<int> relobsindex;</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span> </div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> tindex=0;tindex<tobservation_opt.size();++tindex){</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     vector<int>::iterator modit;</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     modit=upper_bound(tmodel_opt.begin(),tmodel_opt.end(),tobservation_opt[tindex]);</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     <span class="keywordtype">int</span> relpos=modit-tmodel_opt.begin()-1;</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     assert(relpos>=0);<span class="comment">//todo: for now, we assume model is available at time before first measurement</span></div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     relobsindex.push_back(relpos);</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       cout << <span class="stringliteral">"observation "</span> << tindex << <span class="stringliteral">": "</span> << <span class="stringliteral">"relative position in model time series is "</span> << relpos << <span class="stringliteral">", date of observation is (tobservation_opt[tindex]): "</span> << tobservation_opt[tindex]  [...]
+<div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="preprocessor">#include "imageclasses/ImgUpdaterGdal.h"</span></div>
+<div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="preprocessor">#include "algorithms/StatFactory.h"</span></div>
+<div class="line"><a name="l00029"></a><span class="lineno">   29</span> </div>
+<div class="line"><a name="l00030"></a><span class="lineno">   30</span> <span class="comment">/******************************************************************************/</span></div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span> <span class="comment">/*------------------</span></div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span> <span class="comment">  Main procedure</span></div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span> <span class="comment">  ----------------*/</span></div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> direction_opt(<span class="stringliteral">"dir"</span>,<span class="stringliteral">"direction"</span>,<span class="stringliteral">"direction to run model (forward|backward|smooth)"</span>,<span class="stringliteral">"forward"</span>);</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> model_opt(<span class="stringliteral">"mod"</span>,<span class="stringliteral">"model"</span>,<span class="stringliteral">"coarse spatial resolution input datasets(s) used as model. Use either multi-band input (-model multiband_model.tif) or multiple single-band inputs (-mod model1 -mod model2 etc.)"</span>);</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> modelmask_opt(<span class="stringliteral">"modmask"</span>,<span class="stringliteral">"modmask"</span>,<span class="stringliteral">"model mask datasets(s). Must have same dimension as model input. Use either multi-band input or multiple single-band inputs"</span>);</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> observation_opt(<span class="stringliteral">"obs"</span>,<span class="stringliteral">"observation"</span>,<span class="stringliteral">"fine spatial resolution input dataset(s) used as observation. Use either multi-band input (-obs multiband_obs.tif) or multiple single-band inputs (-obs obs1 -obs obs2 etc.)"</spa [...]
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> observationmask_opt(<span class="stringliteral">"obsmask"</span>,<span class="stringliteral">"obsmask"</span>,<span class="stringliteral">"observation mask dataset(s). Must have same dimension as observation input (use multi-band input or multiple single-band inputs"</span>);</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> tmodel_opt(<span class="stringliteral">"tmod"</span>,<span class="stringliteral">"tmodel"</span>,<span class="stringliteral">"time sequence of model input. Sequence must have exact same length as model input. Leave empty to have default sequence 0,1,2,etc."</span>); </div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> tobservation_opt(<span class="stringliteral">"tobs"</span>,<span class="stringliteral">"tobservation"</span>,<span class="stringliteral">"time sequence of observation input. Sequence must have exact same length as observation input)"</span>); </div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"Override the projection for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid"</span>);</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputfw_opt(<span class="stringliteral">"ofw"</span>, <span class="stringliteral">"outputfw"</span>, <span class="stringliteral">"Output raster dataset for forward model"</span>);</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> uncertfw_opt(<span class="stringliteral">"u_ofw"</span>, <span class="stringliteral">"u_outputfw"</span>, <span class="stringliteral">"Uncertainty output raster dataset for forward model"</span>);</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputbw_opt(<span class="stringliteral">"obw"</span>, <span class="stringliteral">"outputbw"</span>, <span class="stringliteral">"Output raster dataset for backward model"</span>);</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> uncertbw_opt(<span class="stringliteral">"u_obw"</span>, <span class="stringliteral">"u_outputbw"</span>, <span class="stringliteral">"Uncertainty output raster dataset for backward model"</span>);</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputfb_opt(<span class="stringliteral">"ofb"</span>, <span class="stringliteral">"outputfb"</span>, <span class="stringliteral">"Output raster dataset for smooth model"</span>);</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> uncertfb_opt(<span class="stringliteral">"u_ofb"</span>, <span class="stringliteral">"u_outputfb"</span>, <span class="stringliteral">"Uncertainty output raster dataset for smooth model"</span>);</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> gain_opt(<span class="stringliteral">"gain"</span>, <span class="stringliteral">"gain"</span>, <span class="stringliteral">"Output raster dataset for gain"</span>);</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modnodata_opt(<span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"invalid value for model input"</span>, 0);</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsnodata_opt(<span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"invalid value for observation input"</span>, 0);</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsmin_opt(<span class="stringliteral">"obsmin"</span>, <span class="stringliteral">"obsmin"</span>, <span class="stringliteral">"Minimum value for observation data"</span>);</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsmax_opt(<span class="stringliteral">"obsmax"</span>, <span class="stringliteral">"obsmax"</span>, <span class="stringliteral">"Maximum value for observation data"</span>);</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value not to consider"</span>, 0);</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> mskband_opt(<span class="stringliteral">"mskband"</span>, <span class="stringliteral">"mskband"</span>, <span class="stringliteral">"Mask band to read (0 indexed)"</span>, 0);</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> eps_opt(<span class="stringliteral">"eps"</span>, <span class="stringliteral">"eps"</span>, <span class="stringliteral">"epsilon for non zero division"</span>, 0.00001);</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertModel_opt(<span class="stringliteral">"um"</span>, <span class="stringliteral">"uncertmodel"</span>, <span class="stringliteral">"Uncertainty of model"</span>,1);</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertObs_opt(<span class="stringliteral">"uo"</span>, <span class="stringliteral">"uncertobs"</span>, <span class="stringliteral">"Uncertainty of valid observations"</span>,1);</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> processNoise_opt(<span class="stringliteral">"q"</span>, <span class="stringliteral">"q"</span>, <span class="stringliteral">"Process noise: expresses instability (variance) of proportions of fine res pixels within a moderate resolution pixel"</span>,1);</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertNodata_opt(<span class="stringliteral">"unodata"</span>, <span class="stringliteral">"uncertnodata"</span>, <span class="stringliteral">"Uncertainty in case of no-data values in observation"</span>, 100);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> down_opt(<span class="stringliteral">"down"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"Downsampling factor for reading model data to calculate regression"</span>);</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>,<span class="stringlitera [...]
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>,<span class="stringliteral">"GTiff"</span>,2);</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode when positive"</span>, 0);</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span> </div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   observationmask_opt.setHide(1);</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   modelmask_opt.setHide(1);</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   tmodel_opt.setHide(1);</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   tobservation_opt.setHide(1);</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   projection_opt.setHide(1);</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   uncertfw_opt.setHide(1);</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   uncertbw_opt.setHide(1);</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   uncertfb_opt.setHide(1);</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   obsmin_opt.setHide(1);</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   obsmax_opt.setHide(1);</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   msknodata_opt.setHide(1);</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   mskband_opt.setHide(1);</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   eps_opt.setHide(1);</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   uncertNodata_opt.setHide(1);</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   down_opt.setHide(1);</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   otype_opt.setHide(1);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   oformat_opt.setHide(1);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   verbose_opt.setHide(1);</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   gain_opt.setHide(2);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span> </div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     doProcess=direction_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     model_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     modelmask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     observation_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     observationmask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     tmodel_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     tobservation_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     projection_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     outputfw_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     uncertfw_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     outputbw_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     uncertbw_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     outputfb_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     uncertfb_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     gain_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     modnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     obsnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     obsmin_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     obsmax_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     msknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     mskband_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     eps_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     uncertModel_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     uncertObs_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     processNoise_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     uncertNodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     down_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   }</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     exit(0);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   }</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     std::cerr << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   }</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span> </div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     ostringstream errorStream;</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     <span class="keywordflow">if</span>(model_opt.size()<1){</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>       errorStream << <span class="stringliteral">"Error: no model dataset selected, use option -mod"</span> << endl;</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     }</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     <span class="keywordflow">if</span>(observation_opt.size()<1){</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>       errorStream << <span class="stringliteral">"Error: no observation dataset selected, use option -obs"</span> << endl;</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     }</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"forward"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>       <span class="keywordflow">if</span>(outputfw_opt.empty()){</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     errorStream << <span class="stringliteral">"Error: output forward datasets is not provided, use option -ofw"</span> << endl;</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>       }</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>       <span class="keywordflow">if</span>(uncertfw_opt.empty()){</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     ostringstream uncertStream;</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     uncertStream << outputfw_opt[0] << <span class="stringliteral">"_uncert"</span>;</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     uncertfw_opt.push_back(uncertStream.str());</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       }</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     }</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"backward"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>       <span class="keywordflow">if</span>(outputbw_opt.empty()){</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>       }</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>       <span class="keywordflow">if</span>(uncertbw_opt.empty()){</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     ostringstream uncertStream;</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     uncertStream << outputbw_opt[0] << <span class="stringliteral">"_uncert"</span>;</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     uncertbw_opt.push_back(uncertStream.str());</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       }</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     }</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <span class="comment">// if(model_opt.size()<observation_opt.size()){</span></div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     <span class="comment">//  errorStream << "Error: sequence of models should be larger than observations" << endl;</span></div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     <span class="comment">//  throw(errorStream.str());</span></div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     <span class="keywordflow">if</span>(tmodel_opt.empty()){</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>       cout << <span class="stringliteral">"Warning: model time sequence is not provided, self generating time sequence from model input"</span>  << endl;</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     }</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     <span class="keywordflow">if</span>(tobservation_opt.empty()){</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       cout << <span class="stringliteral">"Warning: observation time sequence is not provided, self generating time sequence from observation input"</span> << endl;</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     }</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"smooth"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>       <span class="keywordflow">if</span>(outputfw_opt.empty()){</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     errorStream << <span class="stringliteral">"Error: output forward dataset is not provided, use option -ofw"</span> << endl;</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>       }</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>       <span class="keywordflow">if</span>(outputbw_opt.empty()){</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>       }</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>       <span class="keywordflow">if</span>(outputfb_opt.empty()){</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     errorStream << <span class="stringliteral">"Error: output smooth datasets is not provided, use option -ofb"</span> << endl;</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>       }</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>       <span class="keywordflow">if</span>(uncertfb_opt.empty()){</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     ostringstream uncertStream;</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     uncertStream << outputfb_opt[0] << <span class="stringliteral">"_uncert"</span>;</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     uncertfb_opt.push_back(uncertStream.str());</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       }</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     }</div>
 <div class="line"><a name="l00253"></a><span class="lineno">  253</span>   }</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span> </div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <span class="keywordtype">int</span> ndigit=log(1.0*tmodel_opt.back())/log(10.0)+1;</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span> </div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="keywordtype">double</span> geox=0;</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordtype">double</span> geoy=0;</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span> </div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"forward"</span>)!=direction_opt.end()){</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     cout << <span class="stringliteral">"Running forward model"</span> << endl;</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     obsindex=0;</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="comment">//initialization</span></div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size()){</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>       output=outputfw_opt[0];</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     }</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>       ostringstream outputstream;</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>       outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>       outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[0];</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>       output=outputstream.str();</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     }</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>       cout << <span class="stringliteral">"Opening image "</span> << output << <span class="stringliteral">" for writing "</span> << endl;</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span> </div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span> </div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     <span class="comment">//test</span></div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="keywordflow">if</span>(gain_opt.size()){</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       imgWriterGain.open(gain_opt[0],ncol,nrow,model_opt.size(),GDT_Float64,imageType,option_opt);</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>       imgWriterGain.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       imgWriterGain.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       imgWriterGain.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     }</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span> </div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[0] << endl;</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     }</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     std::cout << errorString << std::endl;</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     exit(1);</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   }</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span> </div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   stat.setNoDataValues(modnodata_opt);</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel1;</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel2;</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel1Mask;</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel2Mask;</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderObs;</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderObsMask;</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="comment">//test</span></div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterGain;</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span> </div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   imgReaderModel1.open(model_opt[0]);</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   imgReaderObs.open(observation_opt[0]);</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="comment">// if(observationmask_opt.empty())</span></div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="comment">//   observationmask_opt=observation_opt;</span></div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordflow">if</span>(modelmask_opt.size()){</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     imgReaderModel1Mask.open(modelmask_opt[0]);</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     imgReaderModel1Mask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   }</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="keywordflow">if</span>(observationmask_opt.size()){</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     imgReaderObsMask.open(observationmask_opt[0]);</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     imgReaderObsMask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   }</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span> </div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nobs=(observation_opt.size()>1)? observation_opt.size() : imgReaderObs.nrOfBand();</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nmodel=(model_opt.size()>1)? model_opt.size() : imgReaderModel1.nrOfBand();</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span> </div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     cout << <span class="stringliteral">"number of observations: "</span> << nobs << endl;</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     cout << <span class="stringliteral">"number of models: "</span> << nmodel << endl;</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   }</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span> </div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="keywordtype">int</span> ncol=imgReaderObs.nrOfCol();</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="keywordtype">int</span> nrow=imgReaderObs.nrOfRow();</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="keywordflow">if</span>(projection_opt.empty())</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     projection_opt.push_back(imgReaderObs.getProjection());</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="keywordtype">double</span> geotransform[6];</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   imgReaderObs.getGeoTransform(geotransform);</div>
 <div class="line"><a name="l00299"></a><span class="lineno">  299</span> </div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       imgReaderModel1.open(model_opt[0]);</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     }</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     }</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     }</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       </div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     <span class="comment">//calculate standard deviation of image to serve as model uncertainty</span></div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     rasterBand=imgReaderModel1.getRasterBand(0);</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     <span class="keywordtype">double</span> minValue, maxValue, meanValue, stdDev;</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     <span class="keywordtype">double</span> modRow=0;</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="keywordtype">double</span> modCol=0;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="keywordtype">double</span> lowerCol=0;</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     <span class="keywordtype">double</span> upperCol=0;</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     RESAMPLE theResample=BILINEAR;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   GDALDataType theType=GDT_Unknown;</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>                  otype_opt[0].c_str()))</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>       theType=(GDALDataType) iType;</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   }</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     theType=imgReaderObs.getDataType();</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span> </div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   <span class="keywordtype">string</span> imageType;<span class="comment">//=imgReaderObs.getImageType();</span></div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     theInterleave+=imgReaderObs.getInterleave();</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   }</div>
 <div class="line"><a name="l00322"></a><span class="lineno">  322</span> </div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     <span class="keywordflow">if</span>(relobsindex[0]>0){<span class="comment">//initialize output_opt[0] as model[0]</span></div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>       <span class="comment">//write first model as output</span></div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     cout << <span class="stringliteral">"write first model as output"</span> << endl;</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="comment">//test</span></div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     vector<double> gainWriteBuffer(ncol);</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>         imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>         <span class="keywordflow">if</span>(modRow<0||modRow>=imgReaderModel1.nrOfRow()){</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>           cerr << <span class="stringliteral">"Error: geo coordinates ("</span> << geox << <span class="stringliteral">","</span> << geoy << <span class="stringliteral">") not covered in model image "</span> << imgReaderModel1.getFileName() << endl;</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>           assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>         }</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>         imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=icol;icol<icol+down_opt[0];++icol){</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>         lowerCol=modCol-0.5;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>         upperCol=modCol+0.5;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>         <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>           lowerCol=0;</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>         <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>           upperCol=imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>         <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>         <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>           gainWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>         }</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>           estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>           }</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>           }</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*stdDev;</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           gainWriteBuffer[icol]=0;</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         }</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>           }</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>         }</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>         imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>         imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>         <span class="keywordflow">if</span>(gain_opt.size())</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>           imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       }</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     }</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     }</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     }</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       }</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     }</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     <span class="keywordflow">else</span>{<span class="comment">//we have a measurement</span></div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     cout << <span class="stringliteral">"we have a measurement at initial time"</span> << endl;</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       imgReaderObs.open(observation_opt[0]);</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span> </div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       <span class="comment">//test</span></div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       vector<double> gainWriteBuffer(ncol);</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span> </div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       }</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       obsLineVector.erase(obsLineVector.begin());</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       obsLineVector.push_back(obsLineBuffer);</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       <span class="comment">// obsLineBuffer=obsLineVector[down_opt[0]/2];</span></div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span> </div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0];++icol){</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>           imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>           lowerCol=modCol-0.5;</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>           upperCol=modCol+0.5;</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>         lowerCol=0;</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>           <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>           <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>           <span class="keywordtype">double</span> errMod=uncertModel_opt[0]*stdDev*stdDev;</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>           <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){<span class="comment">//model is nodata: retain observation </span></div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         <span class="keywordflow">if</span>(imgReaderObs.isNoData(obsLineBuffer[icol])){<span class="comment">//both model and observation nodata</span></div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>           gainWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         }</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>           estWriteBuffer[icol]=obsLineBuffer[icol];</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>           }</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>           }</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>           <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>             uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>             uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>         }</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>           }</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>           <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>         estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>         uncertWriteBuffer[icol]=errMod;<span class="comment">//in case observation is not valid</span></div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>         gainWriteBuffer[icol]=0;</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>           }</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>           <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>           <span class="keywordflow">if</span>(!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>         <span class="comment">// estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2</span></div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>         <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>         <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         obsWindowBuffer.clear();</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>             assert(isample<obsLineVector[iline].size());</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>             obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>           }</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         }</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         <span class="keywordflow">if</span>(!imgReaderModel1.isNoData(modValue)){<span class="comment">//model is valid</span></div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>           <span class="keywordtype">double</span> obsMeanValue=statobs.mean(obsWindowBuffer);</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>           <span class="keywordtype">double</span> difference=0;</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>           difference=obsMeanValue-modValue;</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>           errObs=uncertObs_opt[0]*sqrt(difference*difference);</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>           <span class="comment">// errObs=(difference<0)? sqrt(difference*difference) : uncertObs_opt[0];</span></div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>           <span class="comment">//errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)</span></div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>           <span class="keywordtype">double</span> errorCovariance=errMod;<span class="comment">//assumed initial errorCovariance (P in Kalman equations)</span></div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>           <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>             kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>           <span class="keywordflow">else</span> </div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>             kalmanGain=1;</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>           estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           }</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <span class="keywordflow">if</span>(down_opt.empty()){</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordtype">double</span> resModel=imgReaderModel1.getDeltaX();</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordtype">double</span> resObs=imgReaderObs.getDeltaX();</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordtype">int</span> down=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ceil(resModel/resObs));</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="keywordflow">if</span>(!(down%2))</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       down+=1;</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     down_opt.push_back(down);</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   }</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span> </div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   <span class="keywordtype">int</span> obsindex=0;</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span> </div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span> </div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   <span class="keywordtype">double</span> errObs=uncertNodata_opt[0];<span class="comment">//start with high initial value in case we do not have first observation at time 0</span></div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span> </div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   <span class="keywordflow">while</span>(tmodel_opt.size()<nmodel)</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     tmodel_opt.push_back(tmodel_opt.size());</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     <span class="keywordflow">if</span>(tobservation_opt.size()<nobs){</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       <span class="keywordflow">if</span>(nobs==nmodel){</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     <span class="keywordflow">while</span>(tobservation_opt.size()<nobs)</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       tobservation_opt.push_back(tobservation_opt.size());</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       }</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     ostringstream errorStream;</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     errorStream << <span class="stringliteral">"Error: please provide time sequence for observation using option tobs"</span> << endl;</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       }</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>     }</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   }</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     std::cout << errorString << std::endl;</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     exit(1);</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   }</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   </div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   vector<int> relobsindex;</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span> </div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> tindex=0;tindex<tobservation_opt.size();++tindex){</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     vector<int>::iterator modit;</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     modit=upper_bound(tmodel_opt.begin(),tmodel_opt.end(),tobservation_opt[tindex]);</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="keywordtype">int</span> relpos=modit-tmodel_opt.begin()-1;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     assert(relpos>=0);<span class="comment">//todo: for now, we assume model is available at time before first measurement</span></div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     relobsindex.push_back(relpos);</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       cout << <span class="stringliteral">"observation "</span> << tindex << <span class="stringliteral">": "</span> << <span class="stringliteral">"relative position in model time series is "</span> << relpos << <span class="stringliteral">", date of observation is (tobservation_opt[tindex]): "</span> << tobservation_opt[tindex]  [...]
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       <span class="keywordflow">if</span>(observation_opt.size()>tindex)</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     cout << <span class="stringliteral">", filename observation: "</span> << observation_opt[tindex];</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     cout << <span class="stringliteral">", observation band index: "</span> << tindex;</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       <span class="keywordflow">if</span>(model_opt.size()>relpos)</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     cout << <span class="stringliteral">", filename of corresponding model: "</span> << model_opt[relpos] << endl;</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     cout << <span class="stringliteral">", band index of corresponding model: "</span> << relpos;</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     }</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   }</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span> </div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   <span class="keywordtype">int</span> ndigit=log(1.0*tmodel_opt.back())/log(10.0)+1;</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span> </div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   <span class="keywordtype">double</span> geox=0;</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>   <span class="keywordtype">double</span> geoy=0;</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span> </div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   <span class="keywordflow">if</span>(model_opt.size()==nmodel)</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     imgReaderModel1.close();</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>   <span class="keywordflow">if</span>(modelmask_opt.size()==nmodel)</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     imgReaderModel1Mask.close();</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <span class="keywordflow">if</span>(observation_opt.size()==nobs)</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     imgReaderObs.close();</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>   <span class="keywordflow">if</span>(observationmask_opt.size()==nobs)</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     imgReaderObsMask.close();</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span> </div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"forward"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       cout << <span class="stringliteral">"Running forward model"</span> << endl;</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       obsindex=0;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     cout << <span class="stringliteral">"Opening image "</span> << outputfw_opt[0] << <span class="stringliteral">" for writing "</span> << endl << flush;</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     </div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       <span class="comment">// imgWriterEst.open(theOutput,ncol,nrow,2,theType,imageType,option_opt);</span></div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterEst;</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterUncert;</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       imgWriterEst.open(outputfw_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       imgWriterUncert.open(uncertfw_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       imgWriterUncert.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       imgWriterUncert.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span> </div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     <span class="keywordflow">if</span>(gain_opt.size()){</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       imgWriterGain.open(gain_opt[0],ncol,nrow,nmodel,GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       imgWriterGain.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       imgWriterGain.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       imgWriterGain.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     }</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span> </div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[0] << endl;</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         assert(tmodel_opt.size()>relobsindex[obsindex]);</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>         cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       }</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>         cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>     }</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     <span class="keywordflow">if</span>(model_opt.size()==nmodel){</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       imgReaderModel1.open(model_opt[0]);</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     }</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">if</span>(modelmask_opt.size()==nmodel){</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       imgReaderModel1Mask.open(modelmask_opt[0]);</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       imgReaderModel1Mask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     }</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       }</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     cerr << errorString << endl;</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       }</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       }</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       </div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="keywordtype">double</span> modRow=0;</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       <span class="keywordtype">double</span> modCol=0;</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordtype">double</span> lowerCol=0;</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       <span class="keywordtype">double</span> upperCol=0;</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       RESAMPLE theResample=BILINEAR;</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span> </div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">if</span>(relobsindex[0]>0){<span class="comment">//initialize output_opt[0] as model[0]</span></div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     <span class="comment">//write first model as output</span></div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       cout << <span class="stringliteral">"write first model as output"</span> << endl;</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       vector<double> estReadBuffer;</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       vector<double> lineModelMask;</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>       vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       vector<double> gainWriteBuffer(ncol);</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>           imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           <span class="keywordflow">if</span>(modRow<0||modRow>=imgReaderModel1.nrOfRow()){</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>         cerr << <span class="stringliteral">"Error: geo coordinates ("</span> << geox << <span class="stringliteral">","</span> << geoy << <span class="stringliteral">") not covered in model image "</span> << imgReaderModel1.getFileName() << endl;</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>           }</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>           <span class="comment">// imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);</span></div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span> </div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>           <span class="keywordtype">int</span> readModelBand=(model_opt.size()==nmodel)? 0:0;</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>           <span class="keywordtype">int</span> readModelMaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:0;</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>           imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,readModelBand,theResample);</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>           <span class="keywordflow">if</span>(modelmask_opt.size())</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>         imgReaderModel1Mask.readData(lineModelMask,GDT_Float64,modRow,readModelMaskBand,theResample);</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>           imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>           <span class="keywordflow">if</span>(modelmask_opt.size()){</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>             <span class="keywordflow">if</span>(imgReaderModel1Mask.isNoData(lineModelMask[modCol])){</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>               estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>               uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>               <span class="comment">//test</span></div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>               gainWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>               <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>             }</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>           }</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>           lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>           upperCol=modCol+0.5;</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>             lowerCol=0;</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>             upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>           <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>           <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>             estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>             uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>             gainWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>             <span class="keywordflow">continue</span>;</div>
 <div class="line"><a name="l00510"></a><span class="lineno">  510</span>           }</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>         }</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         gainWriteBuffer[icol]=kalmanGain;</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>           }</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>         }</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       }</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       <span class="keywordflow">if</span>(gain_opt.size())</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>         imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     }</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       }</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       imgReaderObs.close();</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       ++obsindex;</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     }</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     imgReaderModel1.close();</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     imgWriterEst.close();</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span> </div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=1;modindex<model_opt.size();++modindex){</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       }</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     output=outputfw_opt[modindex];</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     output=outputstream.str();</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       }</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     </div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span> </div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       <span class="comment">//calculate regression between two subsequence model inputs</span></div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       imgReaderModel1.open(model_opt[modindex-1]);</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       imgReaderModel2.open(model_opt[modindex]);</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       imgReaderModel2.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="comment">//calculate regression</span></div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="comment">//we could re-use the points from second image from last run, but</span></div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       <span class="comment">//to keep it general, we must redo it (overlap might have changed)</span></div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     </div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span> </div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     update=(relobsindex[obsindex]==modindex);</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       }</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span> </div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       }</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       <span class="comment">//prediction (also to fill cloudy pixels in measurement update mode)</span></div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       <span class="keywordtype">string</span> input;</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     input=outputfw_opt[modindex-1];</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex-1];</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex-1] << ".tif";</span></div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     input=outputstream.str();</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       }</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     cout << <span class="stringliteral">"opening "</span> << input << endl;</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderEst(input);</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       imgReaderEst.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span> </div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       vector<double> model1LineBuffer;</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       vector<double> model2LineBuffer;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       vector< vector<double> > estLineVector(down_opt[0]);</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       vector<double> estLineBuffer;</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       vector<double> estWindowBuffer;<span class="comment">//buffer for estimate to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       vector<double> uncertReadBuffer;</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       vector<double> gainWriteBuffer(ncol);</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span> </div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="comment">//initialize obsLineVector if update</span></div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     }</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       }</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       <span class="comment">//initialize estLineVector</span></div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     cout << <span class="stringliteral">"initialize estLineVector"</span> << endl;</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       }</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span> </div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     <span class="comment">//todo: read entire window for uncertReadBuffer...</span></div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       imgReaderEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0,theResample);</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span> </div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>       imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0,theResample);</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span> </div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       estLineVector.erase(estLineVector.begin());</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       imgReaderEst.readData(estLineBuffer,GDT_Float64,maxRow,0);</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       estLineVector.push_back(estLineBuffer);</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       estLineBuffer=estLineVector[down_opt[0]/2];</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span> </div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>         obsLineVector.erase(obsLineVector.begin());</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>         imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>         obsLineVector.push_back(obsLineBuffer);</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>         obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>         <span class="comment">// imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</span></div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>         <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>           imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>       }</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0];++icol){</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>           imgReaderEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>           estWindowBuffer.clear();</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<estLineVector.size();++iline){</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>           assert(isample<estLineVector[iline].size());</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>           estWindowBuffer.push_back(estLineVector[iline][isample]);</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         }</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>           }</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>           <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>         obsWindowBuffer.clear();</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>             assert(isample<obsLineVector[iline].size());</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>             obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>           }</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>         }</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>           }</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>           <span class="keywordtype">double</span> estValue=estLineBuffer[icol];</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>           lowerCol=modCol-0.5;</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>           upperCol=modCol+0.5;</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>         lowerCol=0;</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>           <span class="keywordtype">double</span> modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>           <span class="comment">// double modValue1=model1LineBuffer[modCol];</span></div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>           imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>           lowerCol=modCol-0.5;</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>           upperCol=modCol+0.5;</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>         lowerCol=0;</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>           <span class="keywordtype">double</span> modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>           <span class="comment">// double modValue2=model2LineBuffer[modCol];</span></div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>           <span class="keywordflow">if</span>(imgReaderEst.isNoData(estValue)){</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>         <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>         <span class="keywordflow">if</span>(imgReaderModel2.isNoData(modValue2)){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>           gainWriteBuffer[icol]=0;</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>         }</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>           estWriteBuffer[icol]=modValue2;</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>           }</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>           }</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*stdDev;</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>           gainWriteBuffer[icol]=0;</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>         }</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>           }</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>           <span class="keywordflow">else</span>{<span class="comment">//previous estimate is valid</span></div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>         <span class="keywordtype">double</span> estMeanValue=statobs.mean(estWindowBuffer);</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>         <span class="keywordtype">double</span> nvalid=0;</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>         <span class="comment">//time update</span></div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>         <span class="keywordtype">double</span> processNoiseVariance=processNoise_opt[0];</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>         <span class="comment">//todo: estimate process noise variance expressing instability of weights over time</span></div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         <span class="comment">//estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. </span></div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span> </div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue1)||imgReaderModel2.isNoData(modValue2)){</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>           estWriteBuffer[icol]=estValue;</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>           uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>         }</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>         <span class="keywordflow">else</span>{<span class="comment">//model is good</span></div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>           <span class="keywordtype">double</span> modRatio=modValue2/modValue1;<span class="comment">//transition matrix A in Kalman equations</span></div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>           estWriteBuffer[icol]=estValue*modRatio;</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>           uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>         }</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>         <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>         }</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>         <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>         }</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>           }</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>           <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>           <span class="keywordflow">if</span>(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>         <span class="keywordflow">if</span>(!imgReaderModel2.isNoData(modValue2)){<span class="comment">//model is valid</span></div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>           <span class="keywordtype">double</span> obsMeanValue=statobs.mean(obsWindowBuffer);</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>           <span class="keywordtype">double</span> difference=0;</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>           difference=obsMeanValue-modValue2;</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>           errObs=uncertObs_opt[0]*sqrt(difference*difference);</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>           <span class="comment">// errObs=(difference<0)? sqrt(difference*difference) : uncertObs_opt[0];</span></div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>           <span class="comment">//errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)</span></div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span> </div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>           <span class="keywordflow">if</span>(errObs<eps_opt[0])</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>             errObs=eps_opt[0];</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>           <span class="keywordtype">double</span> errorCovariance=uncertWriteBuffer[icol];<span class="comment">//P in Kalman equations</span></div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span> </div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>           <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>             kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>           <span class="keywordflow">else</span> </div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>             kalmanGain=1;</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>           estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>           }</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>           }</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>           uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>         }</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>         gainWriteBuffer[icol]=kalmanGain;</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>           }</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>         }</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       }</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       <span class="comment">//test</span></div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       <span class="keywordflow">if</span>(gain_opt.size()){</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>         imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,modindex);</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       }</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     }</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       }</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       imgWriterEst.close();</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       imgReaderEst.close();</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span> </div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>     imgReaderObs.close();</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     ++obsindex;</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       }</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>       imgReaderModel1.close();</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       imgReaderModel2.close();</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>     }</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     <span class="keywordflow">if</span>(gain_opt.size())</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       imgWriterGain.close();</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>   }</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"backward"</span>)!=direction_opt.end()){</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>     cout << <span class="stringliteral">"Running backward model"</span> << endl;</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     obsindex=relobsindex.size()-1;</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     <span class="comment">//initialization</span></div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       output=outputbw_opt.back();</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       ostringstream outputstream;</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>       outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt.back();</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt.back() << ".tif";</span></div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       output=outputstream.str();</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>     }</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>       cout << <span class="stringliteral">"Opening image "</span> << output << <span class="stringliteral">" for writing "</span> << endl;</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span> </div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>     imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span> </div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt.back() << endl;</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     }</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span> </div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>       imgReaderModel1.open(model_opt.back());</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     }</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>     }</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>       cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>     }</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span> </div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>     <span class="comment">//calculate standard deviation of image to serve as model uncertainty</span></div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>     GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     rasterBand=imgReaderModel1.getRasterBand(0);</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>     <span class="keywordtype">double</span> minValue, maxValue, meanValue, stdDev;</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>     <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>     <span class="keywordtype">double</span> modRow=0;</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>     <span class="keywordtype">double</span> modCol=0;</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>     <span class="keywordtype">double</span> lowerCol=0;</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>     <span class="keywordtype">double</span> upperCol=0;</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>     RESAMPLE theResample=BILINEAR;</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span> </div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>     <span class="keywordflow">if</span>(relobsindex.back()<model_opt.size()-1){<span class="comment">//initialize output_opt.back() as model[0]</span></div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       <span class="comment">//write last model as output</span></div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     cout << <span class="stringliteral">"write last model as output"</span> << endl;</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>     vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>     vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>         imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>         imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=icol;icol<icol+down_opt[0];++icol){</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>         lowerCol=modCol-0.5;</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>         upperCol=modCol+0.5;</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>         <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>           lowerCol=0;</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>         <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>           upperCol=imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>         <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span> </div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>         <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>         }</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>           estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>           }</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>           }</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*stdDev;</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>         }</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>           }</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>         }</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>         imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>         imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>       }</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     }</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>     }</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>     }</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       }</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>     }</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     <span class="keywordflow">else</span>{<span class="comment">//we have a measurement at end time</span></div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     cout << <span class="stringliteral">"we have a measurement at end time"</span> << endl;</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       imgReaderObs.open(observation_opt.back());</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       </div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>       vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>       vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span> </div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>       imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       }</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       RESAMPLE theResample=BILINEAR;</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       obsLineVector.erase(obsLineVector.begin());</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>       imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>       obsLineVector.push_back(obsLineBuffer);</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>       <span class="comment">// obsLineBuffer=obsLineVector[down_opt[0]/2];</span></div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span> </div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0];++icol){</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>           imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>           assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>           lowerCol=modCol-0.5;</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>           upperCol=modCol+0.5;</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>         lowerCol=0;</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>           <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>           <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>           <span class="keywordtype">double</span> errMod=uncertModel_opt[0]*stdDev*stdDev;</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>           <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){<span class="comment">//model is nodata: retain observation </span></div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>         <span class="keywordflow">if</span>(imgReaderObs.isNoData(obsLineBuffer[icol])){<span class="comment">//both model and observation nodata</span></div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>         }</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>           estWriteBuffer[icol]=obsLineBuffer[icol];</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>           }</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>           }</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>           <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>             uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>             uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         }</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>           estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>           }</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>           }</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>           uncertWriteBuffer[icol]=uncertModel_opt[0];</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>           gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>         }</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>           }</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>           imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>           imgWriterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>           <span class="keywordflow">if</span>(gain_opt.size())</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>         imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         }</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       }</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>         cerr << errorString << endl;</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       }</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>         cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       }</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     }</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       }</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       <span class="keywordflow">else</span>{<span class="comment">//we have a measurement</span></div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       cout << <span class="stringliteral">"we have a measurement at initial time"</span> << endl;</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">if</span>(observation_opt.size()==nobs){</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       imgReaderObs.open(observation_opt[0]);</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     }</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     <span class="keywordflow">if</span>(observationmask_opt.size()==nobs){</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       imgReaderObsMask.open(observationmask_opt[0]);</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       imgReaderObsMask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     }</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span> </div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     vector< vector<double> > obsLineVector(down_opt[0]);</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     vector<double> obsMaskLineBuffer;</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     vector<double> modelMaskLineBuffer;</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     vector<double> estReadBuffer;</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     vector<double> gainWriteBuffer(ncol);</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span> </div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     <span class="keywordtype">int</span> readObsBand=(observation_opt.size()==nobs)? 0:0;</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     <span class="keywordtype">int</span> readObsMaskBand=(observationmask_opt.size()==nobs)? mskband_opt[0]:0;</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordtype">int</span> readModelBand=(model_opt.size()==nmodel)? 0:0;</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     <span class="keywordtype">int</span> readModelMaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:0;</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,readObsBand);</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,readObsBand);</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     }</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>         imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>         imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,readModelBand,theResample);</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>         <span class="keywordflow">if</span>(modelmask_opt.size())</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>           imgReaderModel1Mask.readData(modelMaskLineBuffer,GDT_Float64,modRow,readModelMaskBand);</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>         obsLineVector.erase(obsLineVector.begin());</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>         imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,readObsBand);</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         obsLineVector.push_back(obsLineBuffer);</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span> </div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>         <span class="keywordflow">if</span>(observationmask_opt.size())</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>           imgReaderObsMask.readData(obsMaskLineBuffer,GDT_Float64,irow,readObsMaskBand);</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span> </div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>         <span class="keywordtype">bool</span> modelIsNoData=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>         <span class="keywordflow">if</span>(modelmask_opt.size())</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>           modelIsNoData=imgReaderModel1Mask.isNoData(modelMaskLineBuffer[modCol]);</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>         upperCol=modCol+0.5;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>         <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>           lowerCol=0;</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>         <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>           upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>         <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>         <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         <span class="keywordtype">double</span> errMod=uncertModel_opt[0];<span class="comment">//*stdDev*stdDev;</span></div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>         modelIsNoData=modelIsNoData||imgReaderModel1.isNoData(modValue);</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>         <span class="keywordtype">bool</span> obsIsNoData=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>         <span class="keywordflow">if</span>(observationmask_opt.size())</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>           obsIsNoData=imgReaderObsMask.isNoData(obsMaskLineBuffer[icol]);</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>         obsIsNoData=obsIsNoData||imgReaderObs.isNoData(obsLineBuffer[icol]);</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         <span class="keywordflow">if</span>(modelIsNoData){<span class="comment">//model is nodata: retain observation </span></div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>           <span class="keywordflow">if</span>(obsIsNoData){<span class="comment">//both model and observation nodata</span></div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>             estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>             uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>             gainWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>           }</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>             estWriteBuffer[icol]=obsLineBuffer[icol];</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>             <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>             }</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>             <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>             }</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>             uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>           }</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         }</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>         <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>           estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>           uncertWriteBuffer[icol]=errMod;<span class="comment">//in case observation is not valid</span></div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>           gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>         }</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>         <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>         <span class="keywordflow">if</span>(!obsIsNoData){</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>           <span class="comment">// estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2</span></div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>           <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>           obsWindowBuffer.clear();</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>               assert(isample<obsLineVector[iline].size());</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>               obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>             }</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>           }</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>           <span class="keywordflow">if</span>(!modelIsNoData){<span class="comment">//model is valid</span></div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>             <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>             statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>             <span class="keywordtype">double</span> obsMeanValue=0;</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>             <span class="keywordtype">double</span> obsVarValue=0;</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>             statobs.meanVar(obsWindowBuffer,obsMeanValue,obsVarValue);</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>             <span class="keywordtype">double</span> difference=0;</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>             difference=obsMeanValue-modValue;</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>             <span class="comment">// errObs=uncertObs_opt[0]*sqrt(difference*difference);</span></div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>             errObs=uncertObs_opt[0]*difference*difference;<span class="comment">//uncertainty of the observation (R in Kalman equations)</span></div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>             <span class="comment">// double errorCovariance=errMod;</span></div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>             <span class="keywordtype">double</span> errorCovariance=processNoise_opt[0]*obsVarValue;<span class="comment">//assumed initial errorCovariance (P in Kalman equations)</span></div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>             <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>               kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>             <span class="keywordflow">else</span> </div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>               kalmanGain=1;</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>             estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>             <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>             }</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>             <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>               <span class="keywordflow">if</span>(uncertWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>             uncertWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>             }</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>           }</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>           assert(kalmanGain<=1);</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>           gainWriteBuffer[icol]=kalmanGain;</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>         }</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>           }</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>         }</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>         imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>         imgWriterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>         <span class="keywordflow">if</span>(gain_opt.size())</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>           imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       }</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     }</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="keywordflow">if</span>(observation_opt.size()==nobs)</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       imgReaderObs.close();</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="keywordflow">if</span>(observationmask_opt.size()==nobs)</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       imgReaderObsMask.close();</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     ++obsindex;</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>       }</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       <span class="keywordflow">if</span>(model_opt.size()==nmodel)</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     imgReaderModel1.close();</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       <span class="keywordflow">if</span>(modelmask_opt.size()==nmodel)</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     imgReaderModel1Mask.close();</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       imgWriterEst.close();</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       imgWriterUncert.close();</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span> </div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>       <a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a> imgUpdaterEst;</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       <a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a> imgUpdaterUncert;</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=1;modindex<nmodel;++modindex){</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     imgUpdaterEst.open(outputfw_opt[0]);</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     imgUpdaterEst.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     imgUpdaterUncert.open(uncertfw_opt[0]);</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>         cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>         cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     }</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span> </div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>     <span class="comment">//calculate regression between two subsequence model inputs</span></div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     <span class="keywordflow">if</span>(model_opt.size()==nmodel){</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>       imgReaderModel1.open(model_opt[modindex-1]);</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>       imgReaderModel2.open(model_opt[modindex]);</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>       imgReaderModel2.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     }</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     <span class="keywordflow">if</span>(modelmask_opt.size()==nmodel){</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       imgReaderModel1Mask.open(modelmask_opt[modindex-1]);</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       imgReaderModel1Mask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>       imgReaderModel2Mask.open(modelmask_opt[modindex]);</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       imgReaderModel2Mask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>     }</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>     </div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span> </div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>     <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       update=(relobsindex[obsindex]==modindex);</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     }</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       <span class="keywordflow">if</span>(observation_opt.size()==nobs){</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>           cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>         imgReaderObs.open(observation_opt[obsindex]);</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>         imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>         imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       }</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       <span class="keywordflow">if</span>(observationmask_opt.size()==nobs){</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>         imgReaderObsMask.open(observationmask_opt[obsindex]);</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>         imgReaderObsMask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>       }</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>     }</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>     <span class="comment">//prediction (also to fill cloudy pixels in measurement update mode)</span></div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     <span class="keywordtype">string</span> input;</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>     input=outputfw_opt[0];</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span> </div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>     vector< vector<double> > obsLineVector(down_opt[0]);</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>     vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>     vector<double> obsMaskLineBuffer;</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     vector<double> model1MaskLineBuffer;</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     vector<double> model2MaskLineBuffer;</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>     vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     vector<double> model1LineBuffer;</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>     vector<double> model2LineBuffer;</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>     vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>     vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>     vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     vector< vector<double> > estLineVector(down_opt[0]);</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     vector<double> estLineBuffer;</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     vector<double> estWindowBuffer;<span class="comment">//buffer for estimate to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     vector<double> uncertReadBuffer;</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>     vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     vector<double> gainWriteBuffer(ncol);</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span> </div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>     <span class="keywordtype">int</span> readObsBand=(observation_opt.size()==nobs)? 0:obsindex;</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>     <span class="keywordtype">int</span> readObsMaskBand=(observationmask_opt.size()==nobs)? mskband_opt[0]:obsindex;</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     <span class="keywordtype">int</span> readModel1Band=(model_opt.size()==nmodel)? 0:modindex-1;</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     <span class="keywordtype">int</span> readModel2Band=(model_opt.size()==nmodel)? 0:modindex;</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     <span class="keywordtype">int</span> readModel1MaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:modindex-1;</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     <span class="keywordtype">int</span> readModel2MaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:modindex;</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span> </div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     <span class="comment">//initialize obsLineVector if update</span></div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>         cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>         <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>           imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,readObsBand);</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>           imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,readObsBand);</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       }</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>     }</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     <span class="comment">//initialize estLineVector</span></div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>       cout << <span class="stringliteral">"initialize estLineVector"</span> << endl;</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span> </div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>         imgUpdaterEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,modindex-1);</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>         imgUpdaterEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,modindex-1);</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     }</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>     <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       <span class="comment">//todo: read entire window for uncertReadBuffer...</span></div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         imgUpdaterUncert.readData(uncertReadBuffer,GDT_Float64,irow,modindex-1);</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         imgUpdaterUncert.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>         <span class="keywordflow">if</span>(model_opt.size()==nmodel){</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>           imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>           imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,readModel2Band,theResample);</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>         }</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>           imgReaderModel1.readData(model2LineBuffer,GDT_Float64,modRow,readModel2Band,theResample);</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>         }</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>         imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,readModel1Band,theResample);</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span> </div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         <span class="keywordflow">if</span>(modelmask_opt.size()){</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>           imgReaderModel1Mask.readData(model1MaskLineBuffer,GDT_Float64,modRow,readModel1MaskBand);</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>           <span class="keywordflow">if</span>(modelmask_opt.size()==nmodel)</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         imgReaderModel2Mask.readData(model2MaskLineBuffer,GDT_Float64,modRow,readModel2MaskBand);</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>         imgReaderModel1Mask.readData(model2MaskLineBuffer,GDT_Float64,modRow,readModel2MaskBand);</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>         }</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span> </div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgUpdaterEst.nrOfRow()) ? irow+down_opt[0]/2 : imgUpdaterEst.nrOfRow()-1;</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>         estLineVector.erase(estLineVector.begin());</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>         imgUpdaterEst.readData(estLineBuffer,GDT_Float64,maxRow,modindex-1);</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>         estLineVector.push_back(estLineBuffer);</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>         estLineBuffer=estLineVector[down_opt[0]/2];</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span> </div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>         <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>           obsLineVector.erase(obsLineVector.begin());</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>           imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,readObsBand);</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>           obsLineVector.push_back(obsLineBuffer);</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>           obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span> </div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>           <span class="keywordflow">if</span>(observationmask_opt.size())</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>         imgReaderObsMask.readData(obsMaskLineBuffer,GDT_Float64,irow,readObsMaskBand);</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>         }</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span> </div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>         imgUpdaterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>         <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>         <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgUpdaterEst.nrOfCol()) ? icol+down_opt[0]/2 : imgUpdaterEst.nrOfCol()-1;</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>         <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgUpdaterEst.nrOfRow()) ? irow+down_opt[0]/2 : imgUpdaterEst.nrOfRow()-1;</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>         estWindowBuffer.clear();</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<estLineVector.size();++iline){</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>             assert(isample<estLineVector[iline].size());</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>             estWindowBuffer.push_back(estLineVector[iline][isample]);</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>           }</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>         }</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>         <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>           obsWindowBuffer.clear();</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>               assert(isample<obsLineVector[iline].size());</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>               obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>             }</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>           }</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>         }</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>         <span class="keywordtype">double</span> estValue=estLineBuffer[icol];</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>         <span class="keywordtype">bool</span> model1IsNoData=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>         <span class="keywordflow">if</span>(modelmask_opt.size())</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>           model1IsNoData=imgReaderModel1Mask.isNoData(model1MaskLineBuffer[modCol]);</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>         lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>         upperCol=modCol+0.5;</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>         <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>           lowerCol=0;</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>         <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>           upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>         <span class="keywordtype">double</span> modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>         model1IsNoData=model1IsNoData||imgReaderModel1.isNoData(modValue1);</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>         <span class="keywordflow">if</span>(model_opt.size()==nmodel)</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>           imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>         <span class="keywordtype">bool</span> model2IsNoData=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>         <span class="keywordflow">if</span>(modelmask_opt.size())</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>           model2IsNoData=imgReaderModel1Mask.isNoData(model2MaskLineBuffer[modCol]);</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>         lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>         upperCol=modCol+0.5;</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>         <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>           lowerCol=0;</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>         <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>           upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>         <span class="keywordtype">double</span> modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>         model2IsNoData=model2IsNoData||imgReaderModel1.isNoData(modValue2);</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>         <span class="keywordtype">bool</span> obsIsNoData=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>         <span class="keywordflow">if</span>(observationmask_opt.size())</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>           obsIsNoData=imgReaderObsMask.isNoData(obsMaskLineBuffer[icol]);</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>         obsIsNoData=obsIsNoData||imgReaderObs.isNoData(obsLineBuffer[icol]);</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span> </div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>         <span class="keywordflow">if</span>(imgUpdaterEst.isNoData(estValue)){</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>           <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>           <span class="keywordflow">if</span>(model2IsNoData){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>             estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>             uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>             gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>           }</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>             estWriteBuffer[icol]=modValue2;</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>             uncertWriteBuffer[icol]=uncertModel_opt[0];<span class="comment">//*stdDev*stdDev;</span></div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>             <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>             }</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>             <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>               <span class="keywordflow">if</span>(uncertWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>             uncertWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>             }</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>             gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>           }</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>         }</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>         <span class="keywordflow">else</span>{<span class="comment">//previous estimate is valid</span></div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>           <span class="keywordtype">double</span> estMeanValue=0;</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>           <span class="keywordtype">double</span> estVarValue=0;</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>           statobs.meanVar(estWindowBuffer,estMeanValue,estVarValue);</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>           <span class="keywordtype">double</span> nvalid=0;</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>           <span class="comment">//time update</span></div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>           <span class="keywordtype">double</span> processNoiseVariance=processNoise_opt[0]*estVarValue;</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>           <span class="comment">//estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. </span></div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span> </div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>           <span class="keywordflow">if</span>(model1IsNoData||model2IsNoData){</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>             estWriteBuffer[icol]=estValue;</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>             <span class="comment">// uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;</span></div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>             <span class="comment">//todo: check following line if makes sense</span></div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>             uncertWriteBuffer[icol]=uncertReadBuffer[icol]+uncertObs_opt[0];</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>           }</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>           <span class="keywordflow">else</span>{<span class="comment">//model is good</span></div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>             <span class="keywordtype">double</span> modRatio=modValue2/modValue1;<span class="comment">//transition matrix A in Kalman equations</span></div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>             estWriteBuffer[icol]=estValue*modRatio;</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>             uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>           }</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>           }</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>             <span class="keywordflow">if</span>(uncertWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>               uncertWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>           }</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>         }</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>         <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>         <span class="keywordflow">if</span>(update&&!obsIsNoData){</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>           <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>           <span class="keywordflow">if</span>(!model2IsNoData){<span class="comment">//model is valid</span></div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>             <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>             statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>             <span class="keywordtype">double</span> obsMeanValue=0;</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>             <span class="keywordtype">double</span> obsVarValue=0;</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>             <span class="keywordtype">double</span> difference=0;</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>             statobs.meanVar(obsWindowBuffer,obsMeanValue,obsVarValue);</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>             difference=obsMeanValue-modValue2;</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>             <span class="comment">// errObs=uncertObs_opt[0]*sqrt(difference*difference);</span></div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>             errObs=uncertObs_opt[0]*difference*difference;<span class="comment">//uncertainty of the observation (R in Kalman equations)</span></div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span> </div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>             <span class="keywordflow">if</span>(errObs<eps_opt[0])</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>               errObs=eps_opt[0];</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>             <span class="keywordtype">double</span> errorCovariance=uncertWriteBuffer[icol];<span class="comment">//P in Kalman equations</span></div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span> </div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>             <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>               kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>             <span class="keywordflow">else</span> </div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>               kalmanGain=1;</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>             estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>             uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>             <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>             }</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>             <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>               <span class="keywordflow">if</span>(uncertWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>             uncertWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>             }</div>
 <div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>           }</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>           <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>         uncertWriteBuffer[icol]=errMod;<span class="comment">//in case observation is not valid</span></div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>           }</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>           <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>           <span class="keywordflow">if</span>(!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>         <span class="comment">// estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2</span></div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>         obsWindowBuffer.clear();</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>             assert(isample<obsLineVector[iline].size());</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>             obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>           }</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         }</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>         <span class="keywordflow">if</span>(!imgReaderModel1.isNoData(modValue)){<span class="comment">//model is valid</span></div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>           <span class="keywordtype">double</span> obsMeanValue=statobs.mean(obsWindowBuffer);</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>           <span class="keywordtype">double</span> difference=0;</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>           difference=obsMeanValue-modValue;</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>           errObs=uncertObs_opt[0]*sqrt(difference*difference);</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>           <span class="comment">// errObs=(difference<0)? sqrt(difference*difference) : uncertObs_opt[0];</span></div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>           <span class="comment">//errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)</span></div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>           <span class="keywordtype">double</span> errorCovariance=errMod;<span class="comment">//assumed initial errorCovariance (P in Kalman equations)</span></div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>           <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>             kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>           <span class="keywordflow">else</span> </div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>             kalmanGain=1;</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           }</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>           }</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>         }</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>           }</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>         }</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>       }</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>     }</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>       }</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>       imgReaderObs.close();</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>       --obsindex;</div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>     }</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>     </div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>     imgReaderModel1.close();</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>     imgWriterEst.close();</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span> </div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=model_opt.size()-2;modindex>=0;--modindex){</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>       }</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>       <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>     output=outputbw_opt[modindex];</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>     output=outputstream.str();</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>       }</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span> </div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>       imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span> </div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>       <span class="comment">//calculate regression between two subsequence model inputs</span></div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>       imgReaderModel1.open(model_opt[modindex+1]);</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>       imgReaderModel2.open(model_opt[modindex]);</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>       imgReaderModel2.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>       <span class="comment">//calculate regression</span></div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>       <span class="comment">//we could re-use the points from second image from last run, but</span></div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>       <span class="comment">//to keep it general, we must redo it (overlap might have changed)</span></div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>     </div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span> </div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>     update=(relobsindex[obsindex]==modindex);</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>       }</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span> </div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>     imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>       }</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>       <span class="comment">//prediction (also to fill cloudy pixels in update mode)</span></div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       <span class="keywordtype">string</span> input;</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>     input=outputbw_opt[modindex+1];</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex+1];</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex+1] << ".tif";</span></div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>     input=outputstream.str();</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>       }</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>     cout << <span class="stringliteral">"opening "</span> << input << endl;</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderEst(input);</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>       imgReaderEst.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       </div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>       vector<double> model1LineBuffer;</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       vector<double> model2LineBuffer;</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>       vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>       vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       vector< vector<double> > estLineVector(down_opt[0]);</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>       vector<double> estLineBuffer;</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       vector<double> estWindowBuffer;<span class="comment">//buffer for estimate to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       vector<double> uncertReadBuffer;</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>       vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span> </div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>       <span class="comment">//initialize obsLineVector</span></div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>       cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>     }</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>       }</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>       <span class="comment">//initialize estLineVector</span></div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     cout << <span class="stringliteral">"initialize estLineVector"</span> << endl;</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>       assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>     <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>       }</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>       <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>       statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span> </div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     <span class="comment">//todo: read entire window for uncertReadBuffer...</span></div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>       imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>       imgReaderEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>       imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0,theResample);</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> </div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0,theResample);</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> </div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>       estLineVector.erase(estLineVector.begin());</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       imgReaderEst.readData(estLineBuffer,GDT_Float64,maxRow,0);</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>       estLineVector.push_back(estLineBuffer);</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>       estLineBuffer=estLineVector[down_opt[0]/2];</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> </div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>         obsLineVector.erase(obsLineVector.begin());</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>         imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>         obsLineVector.push_back(obsLineBuffer);</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>         obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>         <span class="comment">// imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</span></div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>         <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>           imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>           assert(kalmanGain<=1);</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>           gainWriteBuffer[icol]=kalmanGain;</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>         }</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>           }</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>         }</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span> </div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         <span class="keywordflow">if</span>(gain_opt.size())</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>           imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         imgUpdaterEst.writeData(estWriteBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>         imgUpdaterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgUpdaterEst.nrOfRow());</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>       }</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     }</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span> </div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>     <span class="comment">//must close writers to ensure flush</span></div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>     imgUpdaterEst.close();</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     imgUpdaterUncert.close();</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>     <span class="comment">// imgWriterEst.close();</span></div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     <span class="comment">// imgReaderEst.close();</span></div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span> </div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>     <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>       <span class="keywordflow">if</span>(observation_opt.size()==nobs)</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>         imgReaderObs.close();</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>       <span class="keywordflow">if</span>(observationmask_opt.size()==nobs)</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>         imgReaderObsMask.close();</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>       ++obsindex;</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>     }</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>     <span class="keywordflow">if</span>(model_opt.size()==nmodel){</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       imgReaderModel1.close();</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>       imgReaderModel2.close();</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>     }</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>     <span class="keywordflow">if</span>(modelmask_opt.size()==nmodel){</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>       imgReaderModel1Mask.close();</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>       imgReaderModel2Mask.close();</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>     }</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>       }</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>       <span class="keywordflow">if</span>(gain_opt.size())</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>     imgWriterGain.close();</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>     }</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>   }</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>     cerr << errorString << endl;</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>     exit(1);</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>   }</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>   <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>     cerr << <span class="stringliteral">"Error in forward direction "</span> << endl;</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>     exit(2);</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>   }</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>     <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"backward"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>       cout << <span class="stringliteral">"Running backward model"</span> << endl;</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>       obsindex=relobsindex.size()-1;</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>     cout << <span class="stringliteral">"Opening image "</span> << outputbw_opt[0] << <span class="stringliteral">" for writing "</span> << endl;</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span> </div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>       <span class="comment">// imgWriterEst.open(theOutput,ncol,nrow,2,theType,imageType,option_opt);</span></div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterEst;</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterUncert;</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>       imgWriterEst.open(outputbw_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>       imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>       imgWriterUncert.open(uncertbw_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>       imgWriterUncert.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>       imgWriterUncert.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span> </div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>     <span class="comment">// //test</span></div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>     <span class="comment">// if(gain_opt.size()){</span></div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>     <span class="comment">//   imgWriterGain.open(gain_opt[0],ncol,nrow,nmodel,GDT_Float64,imageType,option_opt);</span></div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>     <span class="comment">//   imgWriterGain.setProjectionProj4(projection_opt[0]);</span></div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>     <span class="comment">//   imgWriterGain.setGeoTransform(geotransform);</span></div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>     <span class="comment">//   imgWriterGain.GDALSetNoDataValue(obsnodata_opt[0]);</span></div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span> </div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt.back() << endl;</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>         assert(tmodel_opt.size()>relobsindex[obsindex]);</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>         cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>       }</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>         cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>     }</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>     <span class="keywordflow">if</span>(model_opt.size()==nmodel){</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>       imgReaderModel1.open(model_opt.back());</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>     }</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>     <span class="keywordflow">if</span>(modelmask_opt.size()==nmodel){</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>       imgReaderModel1Mask.open(modelmask_opt[0]);</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>       imgReaderModel1Mask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>     }</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>       }</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>     cerr << errorString << endl;</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>       }</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>     cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>       }</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span> </div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       <span class="keywordtype">double</span> modRow=0;</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>       <span class="keywordtype">double</span> modCol=0;</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>       <span class="keywordtype">double</span> lowerCol=0;</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       <span class="keywordtype">double</span> upperCol=0;</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>       RESAMPLE theResample=BILINEAR;</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span> </div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>       <span class="keywordflow">if</span>(relobsindex.back()<nmodel-1){<span class="comment">//initialize output_opt.back() as last model</span></div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>     <span class="comment">//write last model as output</span></div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       cout << <span class="stringliteral">"write last model as output"</span> << endl;</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>       vector<double> estReadBuffer;</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>       vector<double> lineModelMask;</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>       vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>       vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>       <span class="comment">// //test</span></div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       <span class="comment">// vector<double> gainWriteBuffer(ncol);</span></div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>           imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>           <span class="keywordflow">if</span>(modRow<0||modRow>=imgReaderModel1.nrOfRow()){</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         cerr << <span class="stringliteral">"Error: geo coordinates ("</span> << geox << <span class="stringliteral">","</span> << geoy << <span class="stringliteral">") not covered in model image "</span> << imgReaderModel1.getFileName() << endl;</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>           }</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>           <span class="comment">// imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);</span></div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>           <span class="keywordtype">int</span> readModelBand=(model_opt.size()==nmodel)? 0:nmodel-1;</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>           <span class="keywordtype">int</span> readModelMaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:0;</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>           imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,readModelBand,theResample);</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>           <span class="keywordflow">if</span>(modelmask_opt.size())</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>         imgReaderModel1Mask.readData(lineModelMask,GDT_Float64,modRow,readModelMaskBand,theResample);</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>           imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>           <span class="keywordflow">if</span>(lineModelMask.size()>modCol){</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>             <span class="keywordflow">if</span>(imgReaderModel1Mask.isNoData(lineModelMask[modCol])){</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>               estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>               uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>               <span class="comment">//test</span></div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>               <span class="comment">// gainWriteBuffer[icol]=obsnodata_opt[0];</span></div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>               <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>             }</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>           }</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>           lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>           upperCol=modCol+0.5;</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>             lowerCol=0;</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>             upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>           <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>           <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>           <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>             estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>             uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>             <span class="comment">// gainWriteBuffer[icol]=obsnodata_opt[0];</span></div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>           }</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>           estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>           }</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>           }</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>           uncertWriteBuffer[icol]=uncertModel_opt[0];<span class="comment">//*stdDev*stdDev;</span></div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>           <span class="comment">// gainWriteBuffer[icol]=0;</span></div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>         }</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>           }</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>           imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,nmodel-1);</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>           imgWriterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,nmodel-1);</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>           <span class="comment">// //test</span></div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>           <span class="comment">// if(gain_opt.size())</span></div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>           <span class="comment">//   imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);</span></div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>         }</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>       }</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>         cerr << errorString << endl;</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>       }</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>         cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
 <div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>       }</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0];++icol){</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>           imgReaderEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>           estWindowBuffer.clear();</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<estLineVector.size();++iline){</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>           assert(isample<estLineVector[iline].size());</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>           estWindowBuffer.push_back(estLineVector[iline][isample]);</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>         }</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>           }</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>           <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>         obsWindowBuffer.clear();</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>             assert(isample<obsLineVector[iline].size());</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>             obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>           }</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>         }</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>           }</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>           <span class="keywordtype">double</span> estValue=estLineBuffer[icol];</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>           lowerCol=modCol-0.5;</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>           upperCol=modCol+0.5;</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>         lowerCol=0;</div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>           <span class="keywordtype">double</span> modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];</div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>           <span class="comment">// double modValue1=model1LineBuffer[modCol];</span></div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>           imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>           lowerCol=modCol-0.5;</div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>           upperCol=modCol+0.5;</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>         lowerCol=0;</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>           <span class="keywordtype">double</span> modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>           <span class="comment">// double modValue2=model2LineBuffer[modCol];</span></div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>           <span class="keywordflow">if</span>(imgReaderEst.isNoData(estValue)){</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>         <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>         <span class="keywordflow">if</span>(imgReaderModel2.isNoData(modValue2)){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>         }</div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>           estWriteBuffer[icol]=modValue2;</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>           }</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>           }</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*stdDev;</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>         }</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>           }</div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>           <span class="keywordflow">else</span>{<span class="comment">//previous estimate is valid</span></div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         <span class="keywordtype">double</span> estMeanValue=statobs.mean(estWindowBuffer);</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>         <span class="keywordtype">double</span> nvalid=0;</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>         <span class="comment">//time update</span></div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>         <span class="keywordtype">double</span> processNoiseVariance=processNoise_opt[0];</div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>         <span class="comment">//todo: estimate process noise variance expressing instabilityof weights over time</span></div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>         <span class="comment">//estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. </span></div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span> </div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue1)||imgReaderModel2.isNoData(modValue2)){</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>           estWriteBuffer[icol]=estValue;</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>           uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>         }</div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>         <span class="keywordflow">else</span>{<span class="comment">//model is good</span></div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>           <span class="keywordtype">double</span> modRatio=modValue2/modValue1;<span class="comment">//transition matrix A in Kalman equations</span></div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>           estWriteBuffer[icol]=estValue*modRatio;</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>           uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;</div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>         }</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>         <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>         }</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>         <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>         }</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>           }</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>           <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>           <span class="keywordflow">if</span>(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>         <span class="keywordflow">if</span>(!imgReaderModel2.isNoData(modValue2)){<span class="comment">//model is valid</span></div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>           <span class="keywordtype">double</span> obsMeanValue=statobs.mean(obsWindowBuffer);</div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>           <span class="keywordtype">double</span> difference=0;</div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>           difference=obsMeanValue-modValue2;</div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>           errObs=uncertObs_opt[0]*sqrt(difference*difference);</div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>           <span class="comment">// errObs=(difference<0)? sqrt(difference*difference) : uncertObs_opt[0];</span></div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>           <span class="comment">//errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)</span></div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> </div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>           <span class="keywordtype">double</span> errorCovariance=uncertWriteBuffer[icol];<span class="comment">//P in Kalman equations</span></div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> </div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>           <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>             kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>           <span class="keywordflow">else</span> </div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>             kalmanGain=1;</div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>           estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>           }</div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>     }</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>       }</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>       <span class="keywordflow">else</span>{<span class="comment">//we have a measurement at end time</span></div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       cout << <span class="stringliteral">"we have a measurement at end time"</span> << endl;</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     <span class="keywordflow">if</span>(observation_opt.size()==nobs){</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>       imgReaderObs.open(observation_opt.back());</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>     }</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>     <span class="keywordflow">if</span>(observationmask_opt.size()==nobs){</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>       imgReaderObsMask.open(observationmask_opt.back());</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>       imgReaderObsMask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>     }</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>     imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>       </div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>     vector< vector<double> > obsLineVector(down_opt[0]);</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>     vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>     vector<double> obsMaskLineBuffer;</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>     vector<double> modelMaskLineBuffer;</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>     vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     vector<double> estReadBuffer;</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>     vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>     vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     <span class="comment">// //test</span></div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>     <span class="comment">// vector<double> gainWriteBuffer(ncol);</span></div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span> </div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>       cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>     <span class="keywordtype">int</span> readObsBand=(observation_opt.size()==nobs)? 0:nobs-1;</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>     <span class="keywordtype">int</span> readObsMaskBand=(observationmask_opt.size()==nobs)? mskband_opt[0]:nobs-1;</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>     <span class="keywordtype">int</span> readModelBand=(model_opt.size()==nmodel)? 0:nmodel-1;</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>     <span class="keywordtype">int</span> readModelMaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:nmodel-1;</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,readObsBand);</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,readObsBand);</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>     }</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>         imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>         imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,readModelBand,theResample);</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>         <span class="keywordflow">if</span>(modelmask_opt.size())</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>           imgReaderModel1Mask.readData(modelMaskLineBuffer,GDT_Float64,modRow,readModelMaskBand);</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>         obsLineVector.erase(obsLineVector.begin());</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>         imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,readObsBand);</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>         obsLineVector.push_back(obsLineBuffer);</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span> </div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>         <span class="keywordflow">if</span>(observationmask_opt.size())</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>           imgReaderObsMask.readData(obsMaskLineBuffer,GDT_Float64,irow,readObsMaskBand);</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span> </div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>         <span class="keywordtype">bool</span> modelIsNoData=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>         <span class="keywordflow">if</span>(modelmask_opt.size())</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>           modelIsNoData=imgReaderModel1Mask.isNoData(modelMaskLineBuffer[modCol]);</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>         lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>         upperCol=modCol+0.5;</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>           lowerCol=0;</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>         <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>           upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>         <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>         <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>         <span class="keywordtype">double</span> errMod=uncertModel_opt[0];<span class="comment">//*stdDev*stdDev;</span></div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>         modelIsNoData=modelIsNoData||imgReaderModel1.isNoData(modValue);</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>         <span class="keywordtype">bool</span> obsIsNoData=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>         <span class="keywordflow">if</span>(observationmask_opt.size())</div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>           obsIsNoData=imgReaderObsMask.isNoData(obsMaskLineBuffer[icol]);</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>         obsIsNoData=obsIsNoData||imgReaderObs.isNoData(obsLineBuffer[icol]);</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>         <span class="keywordflow">if</span>(modelIsNoData){<span class="comment">//model is nodata: retain observation </span></div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>           <span class="keywordflow">if</span>(obsIsNoData){<span class="comment">//both model and observation nodata</span></div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>             estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>             uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>             <span class="comment">// gainWriteBuffer[icol]=obsnodata_opt[0];</span></div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>           }</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>             estWriteBuffer[icol]=obsLineBuffer[icol];</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>             <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>             }</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>             <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>             }</div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>             uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>           }</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>         }</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>         <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>           estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>           uncertWriteBuffer[icol]=errMod;<span class="comment">//in case observation is not valid</span></div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>           <span class="comment">// gainWriteBuffer[icol]=0;</span></div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>         }</div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>         <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>         <span class="keywordflow">if</span>(!obsIsNoData){</div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>           <span class="comment">// estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2</span></div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>           <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>           obsWindowBuffer.clear();</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>               assert(isample<obsLineVector[iline].size());</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>               obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>             }</div>
 <div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>           }</div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>           uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>         }</div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>           }</div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>         }</div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>       }</div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
-<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>     }</div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>       }</div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>       imgWriterEst.close();</div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>       imgReaderEst.close();</div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span> </div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>     imgReaderObs.close();</div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>     --obsindex;</div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>       }</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>       imgReaderModel1.close();</div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>       imgReaderModel2.close();</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>     }</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>   }</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"smooth"</span>)!=direction_opt.end()){</div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>     cout << <span class="stringliteral">"Running smooth model"</span> << endl;</div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>     obsindex=0;</div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=0;modindex<model_opt.size();++modindex){</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
-<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>       }</div>
-<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>       <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>       <span class="keywordflow">if</span>(outputfb_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>     output=outputfb_opt[modindex];</div>
-<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>     outputstream << outputfb_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>     <span class="comment">// outputstream << outputfb_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>     output=outputstream.str();</div>
-<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>       }</div>
-<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>     </div>
-<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
-<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
-<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>       imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span> </div>
-<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>       <span class="comment">//open forward and backward estimates</span></div>
-<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>       <span class="comment">//we assume forward in model and backward in observation...</span></div>
-<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span> </div>
-<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>       <span class="keywordtype">string</span> inputfw;</div>
-<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>       <span class="keywordtype">string</span> inputbw;</div>
-<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>     inputfw=outputfw_opt[modindex];</div>
-<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>     inputfw=outputstream.str();</div>
-<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>       }</div>
-<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>     inputbw=outputbw_opt[modindex];</div>
-<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>     inputbw=outputstream.str();</div>
-<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>       }</div>
-<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderForward(inputfw);</div>
-<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderBackward(inputbw);</div>
-<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>       imgReaderForward.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>       imgReaderBackward.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>       </div>
-<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>       vector<double> estForwardBuffer;</div>
-<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>       vector<double> estBackwardBuffer;</div>
-<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>       vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>       vector<double> uncertForwardBuffer;</div>
-<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>       vector<double> uncertBackwardBuffer;</div>
-<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>       vector<double> uncertReadBuffer;</div>
-<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>       vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>       vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>       <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span> </div>
-<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
-<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>     update=(relobsindex[obsindex]==modindex);</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>           <span class="keywordflow">if</span>(!modelIsNoData){<span class="comment">//model is valid</span></div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>             <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>             statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>             <span class="keywordtype">double</span> obsMeanValue=0;</div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>             <span class="keywordtype">double</span> obsVarValue=0;</div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>             statobs.meanVar(obsWindowBuffer,obsMeanValue,obsVarValue);</div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>             <span class="keywordtype">double</span> difference=0;</div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>             difference=obsMeanValue-modValue;</div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>             <span class="comment">// errObs=uncertObs_opt[0]*sqrt(difference*difference);</span></div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>             errObs=uncertObs_opt[0]*difference*difference;<span class="comment">//uncertainty of the observation (R in Kalman equations)</span></div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>             <span class="comment">// double errorCovariance=errMod;</span></div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>             <span class="keywordtype">double</span> errorCovariance=processNoise_opt[0]*obsVarValue;<span class="comment">//assumed initial errorCovariance (P in Kalman equations)</span></div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>             <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>               kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>             <span class="keywordflow">else</span> </div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>               kalmanGain=1;</div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>             estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>             <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>             }</div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>             <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>               <span class="keywordflow">if</span>(uncertWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>             uncertWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>             }</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>           }</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>           assert(kalmanGain<=1);</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>           <span class="comment">// gainWriteBuffer[icol]=kalmanGain;</span></div>
+<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>         }</div>
+<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>           }</div>
+<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>         }</div>
+<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>         imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,nmodel-1);</div>
+<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>         imgWriterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,nmodel-1);</div>
+<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>         <span class="comment">// //test</span></div>
+<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>         <span class="comment">// if(gain_opt.size())</span></div>
+<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>         <span class="comment">//   imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);</span></div>
+<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>       }</div>
+<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>     }</div>
+<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>     <span class="keywordflow">if</span>(observation_opt.size()==nobs)</div>
+<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>       imgReaderObs.close();</div>
+<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>     <span class="keywordflow">if</span>(observationmask_opt.size()==nobs)</div>
+<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>       imgReaderObsMask.close();</div>
+<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>     --obsindex;</div>
+<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>       }</div>
+<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span> </div>
+<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>       <span class="keywordflow">if</span>(model_opt.size()==nmodel)</div>
+<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>     imgReaderModel1.close();</div>
+<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>       <span class="keywordflow">if</span>(modelmask_opt.size()==nmodel)</div>
+<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>     imgReaderModel1Mask.close();</div>
+<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>       imgWriterEst.close();</div>
+<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>       imgWriterUncert.close();</div>
+<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span> </div>
+<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>       <a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a> imgUpdaterEst;</div>
+<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>       <a class="code" href="classImgUpdaterGdal.html">ImgUpdaterGdal</a> imgUpdaterUncert;</div>
+<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=nmodel-2;modindex>=0;--modindex){</div>
+<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>     imgUpdaterEst.open(outputbw_opt[0]);</div>
+<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>     imgUpdaterEst.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>     imgUpdaterUncert.open(uncertbw_opt[0]);</div>
+<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
+<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>         cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>         cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>     }</div>
+<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span> </div>
+<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>     <span class="comment">//calculate regression between two subsequence model inputs</span></div>
+<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>     <span class="keywordflow">if</span>(model_opt.size()==nmodel){</div>
+<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>       imgReaderModel1.open(model_opt[modindex+1]);</div>
+<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>       imgReaderModel2.open(model_opt[modindex]);</div>
+<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>       imgReaderModel2.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>     }</div>
+<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>     <span class="keywordflow">if</span>(modelmask_opt.size()==nmodel){</div>
+<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>       imgReaderModel1Mask.open(modelmask_opt[modindex-1]);</div>
+<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>       imgReaderModel1Mask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>       imgReaderModel2Mask.open(modelmask_opt[modindex]);</div>
+<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>       imgReaderModel2Mask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>     }</div>
+<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>     </div>
+<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span> </div>
+<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>     <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
+<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>       update=(relobsindex[obsindex]==modindex);</div>
+<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>     }</div>
+<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>     <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>       <span class="keywordflow">if</span>(observation_opt.size()==nobs){</div>
+<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>           cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
+<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>         imgReaderObs.open(observation_opt[obsindex]);</div>
+<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>         imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>         imgReaderObs.setNoData(obsnodata_opt);</div>
 <div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>       }</div>
-<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span> </div>
-<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
-<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
-<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>     imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>     <span class="comment">//calculate regression between model and observation</span></div>
-<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>       }</div>
-<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span> </div>
-<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span> </div>
-<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
-<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>     assert(irow<imgReaderForward.nrOfRow());</div>
-<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>     assert(irow<imgReaderBackward.nrOfRow());</div>
-<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>     imgReaderForward.readData(estForwardBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>     imgReaderBackward.readData(estBackwardBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>     imgReaderForward.readData(uncertForwardBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>     imgReaderBackward.readData(uncertBackwardBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span> </div>
-<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>     <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>       imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>     }</div>
-<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span> </div>
-<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
-<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>       <span class="keywordtype">double</span> A=estForwardBuffer[icol];</div>
-<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>       <span class="keywordtype">double</span> B=estBackwardBuffer[icol];</div>
-<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>       <span class="keywordtype">double</span> C=uncertForwardBuffer[icol]*uncertForwardBuffer[icol];</div>
-<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>       <span class="keywordtype">double</span> D=uncertBackwardBuffer[icol]*uncertBackwardBuffer[icol];</div>
-<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>       <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
-<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span> </div>
-<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>       <span class="comment">// if(update){//check for nodata in observation</span></div>
-<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>       <span class="comment">//   if(imgReaderObs.isNoData(estWriteBuffer[icol]))</span></div>
-<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>       <span class="comment">//     uncertObs=uncertNodata_opt[0];</span></div>
-<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>       <span class="comment">//   else if(uncertObsLineBuffer.size()>icol)</span></div>
-<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>       <span class="comment">//     uncertObs=uncertObsLineBuffer[icol];</span></div>
-<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span> </div>
-<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>       <span class="keywordtype">double</span> noemer=(C+D);</div>
-<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>       <span class="comment">//todo: consistently check for division by zero...</span></div>
-<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>       <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)&&imgReaderBackward.isNoData(B)){</div>
-<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>         uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>       }</div>
-<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)){</div>
-<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>         estWriteBuffer[icol]=B;</div>
-<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>         uncertWriteBuffer[icol]=uncertBackwardBuffer[icol];</div>
-<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>       }</div>
-<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(B)){</div>
-<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>         estWriteBuffer[icol]=A;</div>
-<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>         uncertWriteBuffer[icol]=uncertForwardBuffer[icol];</div>
-<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>       }</div>
-<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>         <span class="keywordflow">if</span>(noemer<eps_opt[0]){<span class="comment">//simple average if both uncertainties are ~>0</span></div>
-<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>           estWriteBuffer[icol]=0.5*(A+B);</div>
-<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>           uncertWriteBuffer[icol]=uncertObs;</div>
-<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>         }</div>
-<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>           estWriteBuffer[icol]=(A*D+B*C)/noemer;</div>
-<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
-<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
-<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>         estWriteBuffer[icol]=obsmin_opt[0];</div>
-<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>           }</div>
-<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
-<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
-<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>         estWriteBuffer[icol]=obsmax_opt[0];</div>
-<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>           }</div>
-<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>           <span class="keywordtype">double</span> P=0;</div>
-<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>           <span class="keywordflow">if</span>(C>eps_opt[0])</div>
-<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>         P+=1.0/C;</div>
-<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>           <span class="keywordflow">if</span>(D>eps_opt[0])</div>
-<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>         P+=1.0/D;</div>
-<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>           <span class="keywordflow">if</span>(uncertObs*uncertObs>eps_opt[0])</div>
-<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>         P-=1.0/uncertObs/uncertObs;</div>
-<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>           <span class="keywordflow">if</span>(P>eps_opt[0])</div>
-<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>         P=1.0/P;</div>
-<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>         P=0;</div>
-<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>           uncertWriteBuffer[icol]=P;</div>
-<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>         }</div>
-<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>       }</div>
-<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>     }</div>
-<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
-<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>       }</div>
-<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span> </div>
-<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>       imgWriterEst.close();</div>
-<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>       imgReaderForward.close();</div>
-<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>       imgReaderBackward.close();</div>
-<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>     imgReaderObs.close();</div>
-<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>     ++obsindex;</div>
-<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>       }</div>
-<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>     }</div>
-<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>   }</div>
-<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>   <span class="comment">// if(mask_opt.size())</span></div>
-<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>   <span class="comment">//   maskReader.close();</span></div>
-<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span> }</div>
-<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span> </div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>       <span class="keywordflow">if</span>(observationmask_opt.size()==nobs){</div>
+<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>         imgReaderObsMask.open(observationmask_opt[obsindex]);</div>
+<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>         imgReaderObsMask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>       }</div>
+<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>     }</div>
+<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>     <span class="comment">//prediction (also to fill cloudy pixels in update mode)</span></div>
+<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>     <span class="keywordtype">string</span> input;</div>
+<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>     input=outputbw_opt[0];</div>
+<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>       </div>
+<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>     vector< vector<double> > obsLineVector(down_opt[0]);</div>
+<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>     vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>     vector<double> obsMaskLineBuffer;</div>
+<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>     vector<double> model1MaskLineBuffer;</div>
+<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>     vector<double> model2MaskLineBuffer;</div>
+<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>     vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>     vector<double> model1LineBuffer;</div>
+<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>     vector<double> model2LineBuffer;</div>
+<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>     vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
+<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>     vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
+<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>     vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>     vector< vector<double> > estLineVector(down_opt[0]);</div>
+<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>     vector<double> estLineBuffer;</div>
+<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>     vector<double> estWindowBuffer;<span class="comment">//buffer for estimate to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>     vector<double> uncertReadBuffer;</div>
+<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>     vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>     vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>     <span class="comment">// vector<double> gainWriteBuffer(ncol);</span></div>
+<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span> </div>
+<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>     <span class="keywordtype">int</span> readObsBand=(observation_opt.size()==nobs)? 0:obsindex;</div>
+<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>     <span class="keywordtype">int</span> readObsMaskBand=(observationmask_opt.size()==nobs)? mskband_opt[0]:obsindex;</div>
+<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>     <span class="keywordtype">int</span> readModel1Band=(model_opt.size()==nmodel)? 0:modindex+1;</div>
+<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>     <span class="keywordtype">int</span> readModel2Band=(model_opt.size()==nmodel)? 0:modindex;</div>
+<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>     <span class="keywordtype">int</span> readModel1MaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:modindex+1;</div>
+<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>     <span class="keywordtype">int</span> readModel2MaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:modindex;</div>
+<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span> </div>
+<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>     <span class="comment">//initialize obsLineVector</span></div>
+<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>     <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>         cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
+<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>       assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>         <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>           imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,readObsBand);</div>
+<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>           imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,readObsBand);</div>
+<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>       }</div>
+<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>     }</div>
+<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>     <span class="comment">//initialize estLineVector</span></div>
+<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>       cout << <span class="stringliteral">"initialize estLineVector"</span> << endl;</div>
+<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span> </div>
+<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>         imgUpdaterEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,modindex+1);</div>
+<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>         imgUpdaterEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,modindex+1);</div>
+<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>     }</div>
+<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>     <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>     statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span> </div>
+<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>       <span class="comment">//todo: read entire window for uncertReadBuffer...</span></div>
+<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){</div>
+<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>         imgUpdaterUncert.readData(uncertReadBuffer,GDT_Float64,irow,modindex+1);</div>
+<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>         imgUpdaterUncert.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>         <span class="keywordflow">if</span>(model_opt.size()==nmodel){</div>
+<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>           imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>           imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,readModel2Band,theResample);</div>
+<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>         }</div>
+<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>           imgReaderModel1.readData(model2LineBuffer,GDT_Float64,modRow,readModel2Band,theResample);</div>
+<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>         }</div>
+<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span> </div>
+<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>         imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,readModel1Band,theResample);</div>
+<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>         <span class="keywordflow">if</span>(modelmask_opt.size()){</div>
+<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>           imgReaderModel1Mask.readData(model1MaskLineBuffer,GDT_Float64,modRow,readModel1MaskBand);</div>
+<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>           <span class="keywordflow">if</span>(modelmask_opt.size()==nmodel)</div>
+<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>         imgReaderModel2Mask.readData(model2MaskLineBuffer,GDT_Float64,modRow,readModel2MaskBand);</div>
+<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>         imgReaderModel1Mask.readData(model2MaskLineBuffer,GDT_Float64,modRow,readModel2MaskBand);</div>
+<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>         }</div>
+<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgUpdaterEst.nrOfRow()) ? irow+down_opt[0]/2 : imgUpdaterEst.nrOfRow()-1;</div>
+<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>         estLineVector.erase(estLineVector.begin());</div>
+<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>         imgUpdaterEst.readData(estLineBuffer,GDT_Float64,maxRow,modindex+1);</div>
+<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>         estLineVector.push_back(estLineBuffer);</div>
+<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>         estLineBuffer=estLineVector[down_opt[0]/2];</div>
+<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span> </div>
+<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>         <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>           obsLineVector.erase(obsLineVector.begin());</div>
+<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>           imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,readObsBand);</div>
+<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>           obsLineVector.push_back(obsLineBuffer);</div>
+<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>           obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
+<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span> </div>
+<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>           <span class="keywordflow">if</span>(observationmask_opt.size())</div>
+<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>         imgReaderObsMask.readData(obsMaskLineBuffer,GDT_Float64,irow,readObsBand);</div>
+<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>         }</div>
+<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){</div>
+<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>         imgUpdaterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>         <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>         <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgUpdaterEst.nrOfCol()) ? icol+down_opt[0]/2 : imgUpdaterEst.nrOfCol()-1;</div>
+<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>         <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgUpdaterEst.nrOfRow()) ? irow+down_opt[0]/2 : imgUpdaterEst.nrOfRow()-1;</div>
+<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>         estWindowBuffer.clear();</div>
+<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<estLineVector.size();++iline){</div>
+<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>             assert(isample<estLineVector[iline].size());</div>
+<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>             estWindowBuffer.push_back(estLineVector[iline][isample]);</div>
+<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>           }</div>
+<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>         }</div>
+<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>         <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>           obsWindowBuffer.clear();</div>
+<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
+<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>               assert(isample<obsLineVector[iline].size());</div>
+<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>               obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
+<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>             }</div>
+<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>           }</div>
+<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>         }</div>
+<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span> </div>
+<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>         <span class="keywordtype">double</span> estValue=estLineBuffer[icol];</div>
+<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>         <span class="keywordtype">bool</span> model1IsNoData=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span> </div>
+<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>         <span class="keywordflow">if</span>(modelmask_opt.size())</div>
+<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>           model1IsNoData=imgReaderModel1Mask.isNoData(model1MaskLineBuffer[modCol]);</div>
+<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span> </div>
+<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>         lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>         upperCol=modCol+0.5;</div>
+<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>         <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>           lowerCol=0;</div>
+<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>         <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>           upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>         <span class="keywordtype">double</span> modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];</div>
+<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>         model1IsNoData=model1IsNoData||imgReaderModel1.isNoData(modValue1);</div>
+<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>         <span class="keywordflow">if</span>(model_opt.size()==nmodel)</div>
+<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>           imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>         <span class="keywordtype">bool</span> model2IsNoData=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span> </div>
+<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>         <span class="keywordflow">if</span>(modelmask_opt.size())</div>
+<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>           model2IsNoData=imgReaderModel1Mask.isNoData(model2MaskLineBuffer[modCol]);</div>
+<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>         lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>         upperCol=modCol+0.5;</div>
+<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>         <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>           lowerCol=0;</div>
+<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>         <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>           upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>         <span class="keywordtype">double</span> modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];</div>
+<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>         model2IsNoData=model2IsNoData||imgReaderModel1.isNoData(modValue2);</div>
+<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>         <span class="keywordtype">bool</span> obsIsNoData=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>         <span class="keywordflow">if</span>(observationmask_opt.size())</div>
+<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>           obsIsNoData=imgReaderObsMask.isNoData(obsMaskLineBuffer[icol]);</div>
+<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>         obsIsNoData=obsIsNoData||imgReaderObs.isNoData(obsLineBuffer[icol]);</div>
+<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span> </div>
+<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>         <span class="keywordflow">if</span>(imgUpdaterEst.isNoData(estValue)){</div>
+<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>           <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
+<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>           <span class="keywordflow">if</span>(model2IsNoData){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
+<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>             estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>             uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>             <span class="comment">// gainWriteBuffer[icol]=0;</span></div>
+<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>           }</div>
+<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>             estWriteBuffer[icol]=modValue2;</div>
+<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>             uncertWriteBuffer[icol]=uncertModel_opt[0];<span class="comment">//*stdDev*stdDev;</span></div>
+<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>             <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>             }</div>
+<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>             <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>               <span class="keywordflow">if</span>(uncertWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>             uncertWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>             }</div>
+<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>             <span class="comment">// gainWriteBuffer[icol]=0;</span></div>
+<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>           }</div>
+<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>         }</div>
+<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>         <span class="keywordflow">else</span>{<span class="comment">//previous estimate is valid</span></div>
+<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>           <span class="keywordtype">double</span> estMeanValue=0;</div>
+<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>           <span class="keywordtype">double</span> estVarValue=0;</div>
+<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>           statobs.meanVar(estWindowBuffer,estMeanValue,estVarValue);</div>
+<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>           <span class="keywordtype">double</span> nvalid=0;</div>
+<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>           <span class="comment">//time update</span></div>
+<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>           <span class="keywordtype">double</span> processNoiseVariance=processNoise_opt[0]*estVarValue;</div>
+<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>           <span class="comment">//estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. </span></div>
+<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span> </div>
+<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>           <span class="keywordflow">if</span>(model1IsNoData||model2IsNoData){</div>
+<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>             estWriteBuffer[icol]=estValue;</div>
+<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>             <span class="comment">// uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;</span></div>
+<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>             <span class="comment">//todo: check following line if makes sense</span></div>
+<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>             uncertWriteBuffer[icol]=uncertReadBuffer[icol]+uncertObs_opt[0];</div>
+<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>           }</div>
+<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>           <span class="keywordflow">else</span>{<span class="comment">//model is good</span></div>
+<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>             <span class="keywordtype">double</span> modRatio=modValue2/modValue1;<span class="comment">//transition matrix A in Kalman equations</span></div>
+<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>             estWriteBuffer[icol]=estValue*modRatio;</div>
+<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>             uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;</div>
+<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>           }</div>
+<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>           }</div>
+<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>             <span class="keywordflow">if</span>(uncertWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>               uncertWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>           }</div>
+<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>         }</div>
+<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>         <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>         <span class="keywordflow">if</span>(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
+<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>           <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>           <span class="keywordflow">if</span>(!imgReaderModel1.isNoData(modValue2)){<span class="comment">//model is valid</span></div>
+<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>             <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>             statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>             <span class="keywordtype">double</span> obsMeanValue=0;</div>
+<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>             <span class="keywordtype">double</span> obsVarValue=0;</div>
+<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>             <span class="keywordtype">double</span> difference=0;</div>
+<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>             statobs.meanVar(obsWindowBuffer,obsMeanValue,obsVarValue);</div>
+<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>             difference=obsMeanValue-modValue2;</div>
+<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>             <span class="comment">// errObs=uncertObs_opt[0]*sqrt(difference*difference);</span></div>
+<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>             errObs=uncertObs_opt[0]*difference*difference;<span class="comment">//uncertainty of the observation (R in Kalman equations)</span></div>
+<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span> </div>
+<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>             <span class="keywordflow">if</span>(errObs<eps_opt[0])</div>
+<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>               errObs=eps_opt[0];</div>
+<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>             <span class="keywordtype">double</span> errorCovariance=uncertWriteBuffer[icol];<span class="comment">//P in Kalman equations</span></div>
+<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span> </div>
+<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>             <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
+<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>               kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
+<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>             <span class="keywordflow">else</span> </div>
+<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>               kalmanGain=1;</div>
+<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>             estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>             uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
+<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>             <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>             }</div>
+<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>             <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>               <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>               <span class="keywordflow">if</span>(uncertWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>             uncertWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>             }</div>
+<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>           }</div>
+<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>           assert(kalmanGain<=1);</div>
+<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>           <span class="comment">// gainWriteBuffer[icol]=kalmanGain;</span></div>
+<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>         }</div>
+<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>           }</div>
+<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>         }</div>
+<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>         <span class="comment">// //test</span></div>
+<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>         <span class="comment">// if(gain_opt.size())</span></div>
+<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>         <span class="comment">//   imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,modindex);</span></div>
+<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>         imgUpdaterEst.writeData(estWriteBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>         imgUpdaterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgUpdaterEst.nrOfRow());</div>
+<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>       }</div>
+<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>     }</div>
+<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>     <span class="comment">//must close writers to ensure flush</span></div>
+<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>     imgUpdaterEst.close();</div>
+<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>     imgUpdaterUncert.close();</div>
+<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>     <span class="comment">// imgWriterEst.close();</span></div>
+<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>     <span class="comment">// imgReaderEst.close();</span></div>
+<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span> </div>
+<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>     <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>       <span class="keywordflow">if</span>(observation_opt.size()==nobs)</div>
+<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>         imgReaderObs.close();</div>
+<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>       <span class="keywordflow">if</span>(observationmask_opt.size()==nobs)</div>
+<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>         imgReaderObsMask.close();</div>
+<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>       --obsindex;</div>
+<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>     }</div>
+<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>     <span class="keywordflow">if</span>(model_opt.size()==nmodel){</div>
+<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>       imgReaderModel1.close();</div>
+<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>       imgReaderModel2.close();</div>
+<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>     }</div>
+<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>     <span class="keywordflow">if</span>(modelmask_opt.size()==nmodel){</div>
+<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>       imgReaderModel1Mask.close();</div>
+<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>       imgReaderModel2Mask.close();</div>
+<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>     }</div>
+<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>       }</div>
+<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>       <span class="comment">// //test</span></div>
+<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>       <span class="comment">// if(gain_opt.size())</span></div>
+<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>       <span class="comment">//    imgWriterGain.close();</span></div>
+<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>     }</div>
+<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>   }</div>
+<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>     cerr << errorString << endl;</div>
+<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>     exit(1);</div>
+<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>   }</div>
+<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>   <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>     cerr << <span class="stringliteral">"Error in backward direction "</span> << endl;</div>
+<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>     exit(2);</div>
+<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>   }</div>
+<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"smooth"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>     cout << <span class="stringliteral">"Running smooth model"</span> << endl;</div>
+<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>     obsindex=0;</div>
+<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span> </div>
+<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderForward(outputfw_opt[0]);</div>
+<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderBackward(outputbw_opt[0]);</div>
+<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderForwardUncert(uncertfw_opt[0]);</div>
+<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderBackwardUncert(uncertbw_opt[0]);</div>
+<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>     imgReaderForward.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>     imgReaderBackward.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>       </div>
+<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>     assert(imgReaderForward.nrOfBand()==nmodel);</div>
+<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>     assert(imgReaderForwardUncert.nrOfBand()==nmodel);</div>
+<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>     assert(imgReaderBackward.nrOfBand()==nmodel);</div>
+<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>     assert(imgReaderBackwardUncert.nrOfBand()==nmodel);</div>
+<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterEst;</div>
+<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>     imgWriterEst.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterUncert;</div>
+<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>     imgWriterEst.open(outputfb_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);</div>
+<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>     imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>     imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span> </div>
+<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>     imgWriterUncert.open(uncertfb_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);</div>
+<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>     imgWriterUncert.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>     imgWriterUncert.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=0;modindex<nmodel;++modindex){</div>
+<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
+<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>       }</div>
+<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>       <span class="comment">// if(outputfb_opt.size()==model_opt.size())</span></div>
+<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>       <span class="comment">//    theOutput=outputfb_opt[modindex];</span></div>
+<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>       <span class="comment">// else{</span></div>
+<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>       <span class="comment">//    ostringstream outputstream;</span></div>
+<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>       <span class="comment">//    outputstream << outputfb_opt[0] << "_";</span></div>
+<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>       <span class="comment">//    outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex];</span></div>
+<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>       <span class="comment">//    outputstream << ".tif";</span></div>
+<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>       <span class="comment">//    // outputstream << outputfb_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>       <span class="comment">//    theOutput=outputstream.str();</span></div>
+<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>     </div>
+<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
+<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span> </div>
+<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>       <span class="comment">//open forward and backward estimates</span></div>
+<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>       <span class="comment">//we assume forward in model and backward in observation...</span></div>
+<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span> </div>
+<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>       <span class="comment">// string inputfw;</span></div>
+<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>       <span class="comment">// string inputbw;</span></div>
+<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>       <span class="comment">// if(outputfw_opt.size()==model_opt.size())</span></div>
+<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>       <span class="comment">//    inputfw=outputfw_opt[modindex];</span></div>
+<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>       <span class="comment">// else{</span></div>
+<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>       <span class="comment">//    ostringstream outputstream;</span></div>
+<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>       <span class="comment">//    outputstream << outputfw_opt[0] << "_";</span></div>
+<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>       <span class="comment">//    outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex];</span></div>
+<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>       <span class="comment">//    outputstream << ".tif";</span></div>
+<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>       <span class="comment">//    // outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>       <span class="comment">//    inputfw=outputstream.str();</span></div>
+<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>       <span class="comment">// if(outputbw_opt.size()==model_opt.size())</span></div>
+<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>       <span class="comment">//    inputbw=outputbw_opt[modindex];</span></div>
+<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>       <span class="comment">// else{</span></div>
+<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>       <span class="comment">//    ostringstream outputstream;</span></div>
+<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>       <span class="comment">//    outputstream << outputbw_opt[0] << "_";</span></div>
+<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>       <span class="comment">//    outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex];</span></div>
+<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>       <span class="comment">//    outputstream << ".tif";</span></div>
+<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>       <span class="comment">//    // outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>       <span class="comment">//    inputbw=outputstream.str();</span></div>
+<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>       vector<double> estForwardBuffer;</div>
+<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>       vector<double> estBackwardBuffer;</div>
+<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>       vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>       vector<double> uncertForwardBuffer;</div>
+<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>       vector<double> uncertBackwardBuffer;</div>
+<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>       vector<double> uncertReadBuffer;</div>
+<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>       vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>       vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>       <span class="comment">// vector<double> lineMask;</span></div>
+<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span> </div>
+<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
+<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>     update=(relobsindex[obsindex]==modindex);</div>
+<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>       }</div>
+<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span> </div>
+<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>       <span class="keywordtype">int</span> readObsBand=(observation_opt.size()==nobs)? 0:obsindex;</div>
+<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span> </div>
+<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>     <span class="keywordflow">if</span>(observation_opt.size()==nobs){</div>
+<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>         cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
+<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>       imgReaderObs.open(observation_opt[obsindex]);</div>
+<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>       imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>     }</div>
+<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>     <span class="keywordflow">if</span>(observationmask_opt.size()==nobs){</div>
+<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>       imgReaderObsMask.open(observationmask_opt[obsindex]);</div>
+<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>       imgReaderObsMask.setNoData(msknodata_opt);</div>
+<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>     }</div>
+<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>     <span class="comment">// imgReaderObs.open(observation_opt[obsindex]);</span></div>
+<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>     <span class="comment">// imgReaderObs.getGeoTransform(geotransform);</span></div>
+<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>     <span class="comment">// imgReaderObs.setNoData(obsnodata_opt);</span></div>
+<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>     <span class="comment">//calculate regression between model and observation</span></div>
+<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>       }</div>
+<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span> </div>
+<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span> </div>
+<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
+<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>     assert(irow<imgReaderForward.nrOfRow());</div>
+<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>     assert(irow<imgReaderBackward.nrOfRow());</div>
+<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>     imgReaderForward.readData(estForwardBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>     imgReaderBackward.readData(estBackwardBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>     imgReaderForwardUncert.readData(uncertForwardBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>     imgReaderBackwardUncert.readData(uncertBackwardBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>     <span class="comment">// imgReaderForward.readData(estForwardBuffer,GDT_Float64,irow,0);</span></div>
+<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>     <span class="comment">// imgReaderBackward.readData(estBackwardBuffer,GDT_Float64,irow,0);</span></div>
+<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>     <span class="comment">// imgReaderForward.readData(uncertForwardBuffer,GDT_Float64,irow,1);</span></div>
+<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>     <span class="comment">// imgReaderBackward.readData(uncertBackwardBuffer,GDT_Float64,irow,1);</span></div>
+<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span> </div>
+<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>     <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>       <span class="keywordflow">if</span>(observation_opt.size()==nobs)</div>
+<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>         imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,readObsBand);</div>
+<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>       <span class="keywordflow">if</span>(observationmask_opt.size())</div>
+<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>         imgReaderObsMask.readData(uncertObsLineBuffer,GDT_Float64,irow,readObsBand);</div>
+<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>     }</div>
+<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span> </div>
+<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
+<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>       <span class="keywordtype">double</span> A=estForwardBuffer[icol];</div>
+<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>       <span class="keywordtype">double</span> B=estBackwardBuffer[icol];</div>
+<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>       <span class="keywordtype">double</span> C=uncertForwardBuffer[icol];</div>
+<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>       <span class="keywordtype">double</span> D=uncertBackwardBuffer[icol];</div>
+<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>       <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
+<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span> </div>
+<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>       <span class="comment">// if(update){//check for nodata in observation</span></div>
+<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>       <span class="comment">//   if(imgReaderObs.isNoData(estWriteBuffer[icol]))</span></div>
+<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>       <span class="comment">//     uncertObs=uncertNodata_opt[0];</span></div>
+<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>       <span class="comment">//   else if(uncertObsLineBuffer.size()>icol)</span></div>
+<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>       <span class="comment">//     uncertObs=uncertObsLineBuffer[icol];</span></div>
+<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span> </div>
+<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>       <span class="keywordtype">double</span> noemer=(C+D);</div>
+<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>       <span class="comment">//todo: consistently check for division by zero...</span></div>
+<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>       <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)&&imgReaderBackward.isNoData(B)){</div>
+<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>         uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>       }</div>
+<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)){</div>
+<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>         estWriteBuffer[icol]=B;</div>
+<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>         uncertWriteBuffer[icol]=uncertBackwardBuffer[icol];</div>
+<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>       }</div>
+<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(B)){</div>
+<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>         estWriteBuffer[icol]=A;</div>
+<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>         uncertWriteBuffer[icol]=uncertForwardBuffer[icol];</div>
+<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>       }</div>
+<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>         <span class="keywordflow">if</span>(noemer<eps_opt[0]){<span class="comment">//simple average if both uncertainties are ~>0</span></div>
+<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>           estWriteBuffer[icol]=0.5*(A+B);</div>
+<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>           uncertWriteBuffer[icol]=eps_opt[0];</div>
+<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>         }</div>
+<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>           estWriteBuffer[icol]=(A*D+B*C)/noemer;</div>
+<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>           uncertWriteBuffer[icol]=C*D/noemer;</div>
+<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>         estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>           }</div>
+<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>           estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>         <span class="keywordflow">if</span>(uncertWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>           uncertWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>           }</div>
+<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>           <span class="comment">// double P=0;</span></div>
+<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>           <span class="comment">// if(C>eps_opt[0])</span></div>
+<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>           <span class="comment">//    P+=1.0/C;</span></div>
+<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>           <span class="comment">// if(D>eps_opt[0])</span></div>
+<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>           <span class="comment">//    P+=1.0/D;</span></div>
+<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>           <span class="comment">// if(P>eps_opt[0])</span></div>
+<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>           <span class="comment">//    P=1.0/P;</span></div>
+<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>           <span class="comment">// else</span></div>
+<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>           <span class="comment">//    P=0;</span></div>
+<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>           <span class="comment">// uncertWriteBuffer[icol]=P;</span></div>
+<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>         }</div>
+<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>       }</div>
+<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>     }</div>
+<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>     imgWriterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
+<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>       }</div>
+<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>     <span class="keywordflow">if</span>(observation_opt.size()==nobs)</div>
+<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>       imgReaderObs.close();</div>
+<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>     ++obsindex;</div>
+<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>       }</div>
+<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>     }</div>
+<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>     imgReaderForward.close();</div>
+<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>     imgReaderBackward.close();</div>
+<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>     imgWriterEst.close();</div>
+<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>     imgWriterUncert.close();</div>
+<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>   }</div>
+<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>   <span class="keywordflow">if</span>(observation_opt.size()<nobs)</div>
+<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>     imgReaderObs.close();</div>
+<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>   <span class="keywordflow">if</span>(model_opt.size()<nmodel)</div>
+<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>     imgReaderModel1.close();</div>
+<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>   <span class="comment">// if(mask_opt.size())</span></div>
+<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>   <span class="comment">//   maskReader.close();</span></div>
+<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span> }</div>
+<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span> </div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
+<div class="ttc" id="classImgUpdaterGdal_html"><div class="ttname"><a href="classImgUpdaterGdal.html">ImgUpdaterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgGdal_8h_source.html#l00027">ImgGdal.h:27</a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pklas2img.html b/doc/html/pklas2img.html
index 00d9eb4..75fc63f 100644
--- a/doc/html/pklas2img.html
+++ b/doc/html/pklas2img.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -92,7 +92,7 @@ Options</h1>
 <tr>
 <td>ot </td><td>otype </td><td>std::string </td><td>Byte </td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). </td></tr>
 <tr>
 <td>dx </td><td>dx </td><td>double </td><td>1 </td><td>Output resolution in x (in meter) </td></tr>
 <tr>
@@ -114,7 +114,7 @@ pklas2img -i lasfile -o output </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pklas2img_8cc_source.html b/doc/html/pklas2img_8cc_source.html
index 69d8ce0..ac70997 100644
--- a/doc/html/pklas2img_8cc_source.html
+++ b/doc/html/pklas2img_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -106,11 +106,11 @@
 <div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> lrx_opt(<span class="stringliteral">"lrx"</span>, <span class="stringliteral">"lrx"</span>, <span class="stringliteral">"Lower right x value bounding box (in geocoordinates if georef is true). 0 is read from input file"</span>, 0.0);</div>
 <div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> lry_opt(<span class="stringliteral">"lry"</span>, <span class="stringliteral">"lry"</span>, <span class="stringliteral">"Lower right y value bounding box (in geocoordinates if georef is true). 0 is read from input file"</span>, 0.0);</div>
 <div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringlitera [...]
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>, <span class="stringliteral">"GTiff"</span>);</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>, <span class="stringliteral">"GTiff"</span>);</div>
 <div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dx_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"Output resolution in x (in meter)"</span>, 1.0);</div>
 <div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dy_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"Output resolution in y (in meter)"</span>, 1.0);</div>
 <div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> nbin_opt(<span class="stringliteral">"nbin"</span>, <span class="stringliteral">"nbin"</span>, <span class="stringliteral">"Number of percentile bins for calculating percentile height value profile (=number of output bands)"</span>, 10.0);</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> percentile_opt(<span class="stringliteral">"perc"</span>,<span class="stringliteral">"perc"</span>,<span class="stringliteral">"Percentile value used for rule percentile"</span>,95);</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> percentile_opt(<span class="stringliteral">"perc"</span>,<span class="stringliteral">"percentile"</span>,<span class="stringliteral">"Percentile value used for rule percentile"</span>,95);</div>
 <div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value to put in image"</span>, 0);</div>
 <div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
 <div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
@@ -626,8 +626,8 @@
 <div class="line"><a name="l00625"></a><span class="lineno">  625</span>     std::cout << <span class="stringliteral">"closing lasReader"</span> << std::endl;</div>
 <div class="line"><a name="l00626"></a><span class="lineno">  626</span>   outputWriter.close();</div>
 <div class="line"><a name="l00627"></a><span class="lineno">  627</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
 <div class="ttc" id="classFileReaderLas_html"><div class="ttname"><a href="classFileReaderLas.html">FileReaderLas</a></div><div class="ttdef"><b>Definition:</b> <a href="FileReaderLas_8h_source.html#l00039">FileReaderLas.h:39</a></div></div>
@@ -636,7 +636,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pklas2img_8py_source.html b/doc/html/pklas2img_8py_source.html
index 01247b8..f209fa7 100644
--- a/doc/html/pklas2img_8py_source.html
+++ b/doc/html/pklas2img_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -115,7 +115,7 @@
 <div class="line"><a name="l00061"></a><span class="lineno">   61</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pklas2img"</span></div>
 <div class="line"><a name="l00062"></a><span class="lineno">   62</span> </div>
 <div class="line"><a name="l00063"></a><span class="lineno">   63</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#aa41f6aa59efd28521fd49a8f2740917d">name</a> = <span class="stringliteral">"(Linux only) Create raster dataset from LAS(Z) data point cloud(s)"</span></div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#aa41f6aa59efd28521fd49a8f2740917d">name</a> = <span class="stringliteral">"Create raster dataset from LAS(Z) data point cloud(s)"</span></div>
 <div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a5504eac2d342bdae408e9ce3d51a6a6a">group</a> = <span class="stringliteral">"[pktools] LiDAR"</span></div>
 <div class="line"><a name="l00066"></a><span class="lineno">   66</span> </div>
 <div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterFile(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a7b57ce9958d387ac60e2564b468c9121">INPUT</a>, <span class="stringliteral">"Input LAS(Z) data set(s)"</span>, <span class="keyword">False</span>, <span class="keyword">False</span>))</div>
@@ -206,7 +206,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkndvi_8cc_source.html b/doc/html/pkndvi_8cc_source.html
index 88fd527..8647320 100644
--- a/doc/html/pkndvi_8cc_source.html
+++ b/doc/html/pkndvi_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -381,14 +381,14 @@
 <div class="line"><a name="l00327"></a><span class="lineno">  327</span>     inputReader[ifile].close();</div>
 <div class="line"><a name="l00328"></a><span class="lineno">  328</span>   outputWriter.close();</div>
 <div class="line"><a name="l00329"></a><span class="lineno">  329</span> }</div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkoptsvm.html b/doc/html/pkoptsvm.html
index 80a538f..e140d1c 100644
--- a/doc/html/pkoptsvm.html
+++ b/doc/html/pkoptsvm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -131,7 +131,7 @@ Usage: pkoptsvm -t training </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkoptsvm_8cc_source.html b/doc/html/pkoptsvm_8cc_source.html
index 15b3e36..add2e8b 100644
--- a/doc/html/pkoptsvm_8cc_source.html
+++ b/doc/html/pkoptsvm_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,606 +78,605 @@
 <div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="preprocessor">#include <math.h></span></div>
 <div class="line"><a name="l00025"></a><span class="lineno">   25</span> <span class="preprocessor">#include <nlopt.hpp></span></div>
 <div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="preprocessor">#include "base/Optionpk.h"</span></div>
-<div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="preprocessor">#include "base/Optionpk.h"</span></div>
-<div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="preprocessor">#include "algorithms/ConfusionMatrix.h"</span></div>
-<div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="preprocessor">#include "algorithms/FeatureSelector.h"</span></div>
-<div class="line"><a name="l00030"></a><span class="lineno">   30</span> <span class="preprocessor">#include "algorithms/OptFactory.h"</span></div>
-<div class="line"><a name="l00031"></a><span class="lineno">   31</span> <span class="preprocessor">#include "algorithms/CostFactorySVM.h"</span></div>
-<div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="preprocessor">#include "algorithms/svm.h"</span></div>
-<div class="line"><a name="l00033"></a><span class="lineno">   33</span> <span class="preprocessor">#include "imageclasses/ImgReaderOgr.h"</span></div>
-<div class="line"><a name="l00034"></a><span class="lineno">   34</span> </div>
-<div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="preprocessor">#ifdef HAVE_CONFIG_H</span></div>
-<div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="preprocessor"></span><span class="preprocessor">#include <config.h></span></div>
-<div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l00038"></a><span class="lineno">   38</span> <span class="preprocessor"></span></div>
-<div class="line"><a name="l00039"></a><span class="lineno">   39</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span> </div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span> <span class="preprocessor">#define Malloc(type,n) (type *)malloc((n)*sizeof(type))</span></div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span> <span class="preprocessor"></span>                                    <span class="comment">//declare objective function</span></div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span> <span class="keywordtype">double</span> objFunction(<span class="keyword">const</span> std::vector<double> &x, std::vector<double> &grad, <span class="keywordtype">void</span> *my_func_data);</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span> </div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span> <span class="comment">//global parameters used in objective function</span></div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span> map<string,short> classValueMap;</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span> vector<std::string> nameVector;</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span> vector<unsigned int> nctraining;</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span> vector<unsigned int> nctest;</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span> <a class="code" href="classOptionpk.html">Optionpk<std::string></a> svm_type_opt(<span class="stringliteral">"svmt"</span>, <span class="stringliteral">"svmtype"</span>, <span class="stringliteral">"type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR)"</span>,<span class="stringliteral">"C_SVC"</span>);</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span> <a class="code" href="classOptionpk.html">Optionpk<std::string></a> kernel_type_opt(<span class="stringliteral">"kt"</span>, <span class="stringliteral">"kerneltype"</span>, <span class="stringliteral">"type of kernel function (linear,polynomial,radial,sigmoid) "</span>,<span class="stringliteral">"radial"</span>);</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span> <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> kernel_degree_opt(<span class="stringliteral">"kd"</span>, <span class="stringliteral">"kd"</span>, <span class="stringliteral">"degree in kernel function"</span>,3);</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span> <a class="code" href="classOptionpk.html">Optionpk<float></a> coef0_opt(<span class="stringliteral">"c0"</span>, <span class="stringliteral">"coef0"</span>, <span class="stringliteral">"coef0 in kernel function"</span>,0);</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span> <a class="code" href="classOptionpk.html">Optionpk<float></a> nu_opt(<span class="stringliteral">"nu"</span>, <span class="stringliteral">"nu"</span>, <span class="stringliteral">"the parameter nu of nu-SVC, one-class SVM, and nu-SVR"</span>,0.5);</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span> <a class="code" href="classOptionpk.html">Optionpk<float></a> epsilon_loss_opt(<span class="stringliteral">"eloss"</span>, <span class="stringliteral">"eloss"</span>, <span class="stringliteral">"the epsilon in loss function of epsilon-SVR"</span>,0.1);</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span> <a class="code" href="classOptionpk.html">Optionpk<int></a> cache_opt(<span class="stringliteral">"cache"</span>, <span class="stringliteral">"cache"</span>, <span class="stringliteral">"cache memory size in MB"</span>,100);</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span> <a class="code" href="classOptionpk.html">Optionpk<float></a> epsilon_tol_opt(<span class="stringliteral">"etol"</span>, <span class="stringliteral">"etol"</span>, <span class="stringliteral">"the tolerance of termination criterion"</span>,0.001);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span> <a class="code" href="classOptionpk.html">Optionpk<bool></a> shrinking_opt(<span class="stringliteral">"shrink"</span>, <span class="stringliteral">"shrink"</span>, <span class="stringliteral">"whether to use the shrinking heuristics"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span> <a class="code" href="classOptionpk.html">Optionpk<bool></a> prob_est_opt(<span class="stringliteral">"pe"</span>, <span class="stringliteral">"probest"</span>, <span class="stringliteral">"whether to train a SVC or SVR model for probability estimates"</span>,<span class="keyword">true</span>,2);</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span> <a class="code" href="classOptionpk.html">Optionpk<bool></a> costfunction_opt(<span class="stringliteral">"cf"</span>, <span class="stringliteral">"cf"</span>, <span class="stringliteral">"use Overall Accuracy instead of kappa"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span> <span class="comment">// Optionpk<bool> weight_opt("wi", "wi", "set the parameter C of class i to weight*C, for C-SVC",true);</span></div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span> <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> cv_opt(<span class="stringliteral">"cv"</span>, <span class="stringliteral">"cv"</span>, <span class="stringliteral">"n-fold cross validation mode"</span>,2);</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span> <a class="code" href="classOptionpk.html">Optionpk<string></a> classname_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"list of class names."</span>); </div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span> <a class="code" href="classOptionpk.html">Optionpk<short></a> classvalue_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"reclass"</span>, <span class="stringliteral">"list of class values (use same order as in class opt)."</span>); </div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span> <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"use 1 to output intermediate results for plotting"</span>,0,2);</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span> </div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span> <span class="keywordtype">double</span> objFunction(<span class="keyword">const</span> std::vector<double> &x, std::vector<double> &grad, <span class="keywordtype">void</span> *my_func_data){</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span> </div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   assert(grad.empty());</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   vector<Vector2d<float> > *tf=<span class="keyword">reinterpret_cast<</span>vector<Vector2d<float> <span class="keyword">></span>*> (my_func_data);</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <span class="keywordtype">float</span> ccost=x[0];</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <span class="keywordtype">float</span> gamma=x[1];</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <span class="keywordtype">double</span> error=1.0/epsilon_tol_opt[0];</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <span class="keywordtype">double</span> kappa=1.0;</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <span class="keywordtype">double</span> oa=1.0;</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span> </div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <a class="code" href="classCostFactorySVM.html">CostFactorySVM</a> costfactory(svm_type_opt[0], kernel_type_opt[0], kernel_degree_opt[0], gamma, coef0_opt[0], ccost, nu_opt[0],  epsilon_loss_opt[0], cache_opt[0], epsilon_tol_opt[0], shrinking_opt[0], prob_est_opt[0], cv_opt[0], verbose_opt[0]);</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span> </div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   assert(tf->size());</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <span class="comment">// if(nctest>0)</span></div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <span class="comment">//   costfactory.setCv(0);</span></div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span> </div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   costfactory.setCv(cv_opt[0]);</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span> </div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>       costfactory.setClassValueMap(classname_opt[iclass],classvalue_opt[iclass]);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   }</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <span class="comment">//set names in confusion matrix using nameVector</span></div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   costfactory.setNameVector(nameVector);</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <span class="comment">// vector<string> nameVector=costfactory.getNameVector();</span></div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iname=0;iname<nameVector.size();++iname){</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     <span class="keywordflow">if</span>(costfactory.getClassValueMap().empty()){</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>       costfactory.pushBackClassName(nameVector[iname]);</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>       <span class="comment">// cm.pushBackClassName(nameVector[iname]);</span></div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     }</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(costfactory.getClassIndex(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]))<0)</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>       costfactory.pushBackClassName(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]));</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   }</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span> </div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   costfactory.setNcTraining(nctraining);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   costfactory.setNcTest(nctest);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span> </div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   kappa=costfactory.getCost(*tf);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <span class="keywordflow">return</span>(kappa);</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span> }</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span> </div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span> {</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   map<short,int> reclassMap;</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   vector<int> vreclass;</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> training_opt(<span class="stringliteral">"t"</span>, <span class="stringliteral">"training"</span>, <span class="stringliteral">"training vector file. A single vector file contains all training features (must be set as: b0, b1, b2,...) for all classes (class numbers identified by label option)."</span>); </div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> ccost_opt(<span class="stringliteral">"cc"</span>, <span class="stringliteral">"ccost"</span>, <span class="stringliteral">"min and max boundaries the parameter C of C-SVC, epsilon-SVR, and nu-SVR (optional: initial value)"</span>,1);</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> gamma_opt(<span class="stringliteral">"g"</span>, <span class="stringliteral">"gamma"</span>, <span class="stringliteral">"min max boundaries for gamma in kernel function (optional: initial value)"</span>,0);</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> stepcc_opt(<span class="stringliteral">"stepcc"</span>,<span class="stringliteral">"stepcc"</span>,<span class="stringliteral">"multiplicative step for ccost in GRID search"</span>,2);</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> stepg_opt(<span class="stringliteral">"stepg"</span>,<span class="stringliteral">"stepg"</span>,<span class="stringliteral">"multiplicative step for gamma in GRID search"</span>,2);</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"input test vector file"</span>); </div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> tlayer_opt(<span class="stringliteral">"tln"</span>, <span class="stringliteral">"tln"</span>, <span class="stringliteral">"training layer name(s)"</span>);</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> label_opt(<span class="stringliteral">"label"</span>, <span class="stringliteral">"label"</span>, <span class="stringliteral">"identifier for class label in training vector file."</span>,<span class="stringliteral">"label"</span>); </div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   <span class="comment">// Optionpk<unsigned short> reclass_opt("\0", "rc", "reclass code (e.g. --rc=12 --rc=23 to reclass first two classes to 12 and 23 resp.).", 0);</span></div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> balance_opt(<span class="stringliteral">"bal"</span>, <span class="stringliteral">"balance"</span>, <span class="stringliteral">"balance the input data to this number of samples for each class"</span>, 0);</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> random_opt(<span class="stringliteral">"random"</span>,<span class="stringliteral">"random"</span>, <span class="stringliteral">"in case of balance, randomize input data"</span>, <span class="keyword">true</span>);</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> minSize_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"if number of training pixels is less then min, do not take this class into account"</span>, 0);</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index (starting from 0, either use band option or use start to end)"</span>);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bstart_opt(<span class="stringliteral">"sband"</span>, <span class="stringliteral">"startband"</span>, <span class="stringliteral">"Start band sequence number"</span>); </div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bend_opt(<span class="stringliteral">"eband"</span>, <span class="stringliteral">"endband"</span>, <span class="stringliteral">"End band sequence number"</span>); </div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]"</span>, 0.0);</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)"</span>, 0.0);</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> maxit_opt(<span class="stringliteral">"maxit"</span>,<span class="stringliteral">"maxit"</span>,<span class="stringliteral">"maximum number of iterations"</span>,500);</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span> <span class="comment">//Optionpk<string> algorithm_opt("a", "algorithm", "GRID, or any optimization algorithm from http://ab-initio.mit.edu/wiki/index.php/NLopt_Algorithms","GRID"); </span></div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> tolerance_opt(<span class="stringliteral">"tol"</span>,<span class="stringliteral">"tolerance"</span>,<span class="stringliteral">"relative tolerance for stopping criterion"</span>,0.0001);</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span> </div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   input_opt.setHide(1);</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   tlayer_opt.setHide(1);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   label_opt.setHide(1);</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   balance_opt.setHide(1);</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   random_opt.setHide(1);</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   minSize_opt.setHide(1);</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   band_opt.setHide(1);</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   bstart_opt.setHide(1);</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   bend_opt.setHide(1);</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   offset_opt.setHide(1);</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   scale_opt.setHide(1);</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   svm_type_opt.setHide(1);</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   kernel_type_opt.setHide(1);</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   kernel_degree_opt.setHide(1);</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   coef0_opt.setHide(1);</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   nu_opt.setHide(1);</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   epsilon_loss_opt.setHide(1);</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   cache_opt.setHide(1);</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   epsilon_tol_opt.setHide(1);</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   shrinking_opt.setHide(1);</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   prob_est_opt.setHide(1);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   cv_opt.setHide(1);</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   costfunction_opt.setHide(1);</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   maxit_opt.setHide(1);</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   tolerance_opt.setHide(1);</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span> <span class="comment">//  algorithm_opt.setHide(1);</span></div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   classname_opt.setHide(1);</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   classvalue_opt.setHide(1);</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   </div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     doProcess=training_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     ccost_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     gamma_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     stepcc_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     stepg_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     tlayer_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     label_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     balance_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     random_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     minSize_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     bstart_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     bend_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     offset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     scale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     svm_type_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     kernel_type_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     kernel_degree_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     coef0_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     nu_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     epsilon_loss_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     cache_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     epsilon_tol_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     shrinking_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     prob_est_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     cv_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     costfunction_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     maxit_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     tolerance_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span> <span class="comment">//    algorithm_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     classname_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     classvalue_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   }</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     exit(0);</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   }</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     cout << endl;</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     cout << <span class="stringliteral">"Usage: pkoptsvm -t training"</span> << endl;</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     cout << endl;</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   }</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span> </div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   assert(training_opt.size());</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordflow">if</span>(input_opt.size())</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     cv_opt[0]=0;</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span> </div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordflow">if</span>(input_opt.size())</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       std::cout << <span class="stringliteral">"input filename: "</span> << input_opt[0] << std::endl;</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     std::cout << <span class="stringliteral">"training vector file: "</span> << std::endl;</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<training_opt.size();++ifile)</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       std::cout << training_opt[ifile] << std::endl;</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     std::cout << <span class="stringliteral">"verbose: "</span> << verbose_opt[0] << std::endl;</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   }</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span> </div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSamples=0;</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalTestSamples=0;</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span> </div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nclass=0;</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="keywordtype">int</span> startBand=2;<span class="comment">//first two bands represent X and Y pos</span></div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span> </div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   vector<double> offset;</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   vector<double> scale;</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   vector< Vector2d<float> > testPixels;<span class="comment">//[class][sample][band]</span></div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span> </div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="comment">// if(priors_opt.size()>1){//priors from argument list</span></div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="comment">//   priors.resize(priors_opt.size());</span></div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="comment">//   double normPrior=0;</span></div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>   <span class="comment">//   for(int iclass=0;iclass<priors_opt.size();++iclass){</span></div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   <span class="comment">//     priors[iclass]=priors_opt[iclass];</span></div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   <span class="comment">//     normPrior+=priors[iclass];</span></div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   <span class="comment">//   //normalize</span></div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="comment">//   for(int iclass=0;iclass<priors_opt.size();++iclass)</span></div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   <span class="comment">//     priors[iclass]/=normPrior;</span></div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span> </div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       }</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>       band_opt.clear();</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     }</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       band_opt.push_back(iband);</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       }</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     }</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   }</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     cerr << error << std::endl;</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     exit(1);</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   }</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <span class="comment">//sort bands</span></div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     std::sort(band_opt.begin(),band_opt.end());</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span> </div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   <span class="comment">// map<string,short> classValueMap;//global variable for now (due to getCost)</span></div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>   }</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span> </div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keyword">struct </span><a class="code" href="structsvm__problem.html">svm_problem</a> prob;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   vector<string> fields;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   <span class="comment">//organize training data</span></div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   trainingPixels.clear();</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   testPixels.clear();</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   map<string,Vector2d<float> > trainingMap;</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   map<string,Vector2d<float> > testMap;</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     std::cout << <span class="stringliteral">"reading training file "</span> << training_opt[0] << std::endl;</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     <span class="keywordflow">if</span>(band_opt.size()){</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     inputReader.close();</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       }</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     }</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     inputReader.close();</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       }</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       trainingReader.close();</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     }</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       <span class="comment">// map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</span></div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="comment">// while(mapit!=trainingMap.end())</span></div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       <span class="comment">//    cerr << mapit->first << " -> " << classValueMap[mapit->first] << std::endl;</span></div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training input file"</span>;</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     }</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     <span class="keywordflow">if</span>(input_opt.size()&&testMap.size()<2){</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from test input file"</span>;</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     }</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   }</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     cerr << error << std::endl;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     exit(1);</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   }</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     exit(1);</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   }</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   <span class="comment">//todo delete class 0 ?</span></div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>   <span class="comment">// if(verbose_opt[0]>=1)</span></div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>   <span class="comment">// trainingMap.erase(0);</span></div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span> </div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   map<string,Vector2d<float> >::iterator mapit;</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>   mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>   <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       std::cout << mapit->first << <span class="stringliteral">" -> "</span> << classValueMap[mapit->first] << std::endl;</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       }</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     exit(1);</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       }</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     }    </div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     <span class="comment">//delete small classes</span></div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       trainingMap.erase(mapit);</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     }</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     nameVector.push_back(mapit->first);</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     trainingPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     <span class="comment">// trainingPixels.push_back(mapit->second); ??</span></div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     <span class="comment">// ++iclass;</span></div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     ++mapit;</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   }</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   nclass=trainingPixels.size();</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="keywordflow">if</span>(classname_opt.size())</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     assert(nclass==classname_opt.size());</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span> </div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   mapit=testMap.begin();</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>   <span class="keywordflow">while</span>(mapit!=testMap.end()){</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       <span class="comment">//check if name in test is covered by classname_opt (values can not be 0)</span></div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     ;<span class="comment">//ok, no need to print to std::cout </span></div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       }</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in test vector and make sure classvalue is > 0"</span> << std::endl;</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>     exit(1);</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       }</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     }    </div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     <span class="comment">//no need to delete small classes for test sample</span></div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     testPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>     ++mapit;</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>   }</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>   <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     assert(nclass==testPixels.size());</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     assert(nband=testPixels[0][0].size()-2);<span class="comment">//X and Y//testPixels[0][0].size();</span></div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     assert(!cv_opt[0]);</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>   }</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span> </div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>   <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>   <span class="comment">//balance training data</span></div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>   <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       srand(time(NULL));</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     totalSamples=0;</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>         }</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       }</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>         <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[0];++isample){</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>           <span class="keywordtype">int</span> index = rand()%oldsize;</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>           trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>         }</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       }</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       totalSamples+=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     }</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     assert(totalSamples==nclass*balance_opt[0]);</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>   }</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span> </div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>   <span class="comment">//no need to balance test sample    </span></div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   <span class="comment">//set scale and offset</span></div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   offset.resize(nband);</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>   scale.resize(nband);</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>   <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     assert(offset_opt.size()==nband);</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>   <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     assert(scale_opt.size()==nband);</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     offset[iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     scale[iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     <span class="comment">//search for min and maximum</span></div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     <span class="keywordflow">if</span>(scale[iband]<=0){</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>           <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>             theMin=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>             theMax=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>         }</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       }</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       offset[iband]=theMin+(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       scale[iband]=(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>         std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[iband] << <span class="stringliteral">", "</span> << scale[iband] << std::endl;</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>         std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[iband])/scale[iband] << <span class="stringliteral">","</span> << (theMax-offset[iband])/scale[iband] << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       }</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     }</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   }</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span> </div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="comment">// if(priors_opt.size()==1){//default: equal priors for each class</span></div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="comment">//   priors.resize(nclass);</span></div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <span class="comment">//   for(int iclass=0;iclass<nclass;++iclass)</span></div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   <span class="comment">//     priors[iclass]=1.0/nclass;</span></div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   <span class="comment">// assert(priors_opt.size()==1||priors_opt.size()==nclass);</span></div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     </div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     <span class="comment">// std::cout << "priors:";</span></div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     <span class="comment">// for(int iclass=0;iclass<nclass;++iclass)</span></div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     <span class="comment">//   std::cout << " " << priors[iclass];</span></div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     <span class="comment">// std::cout << std::endl;</span></div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>   }</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span> </div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>   <span class="comment">//Calculate features of training (and test) set</span></div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>   nctraining.resize(nclass);</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>   nctest.resize(nclass);</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>   vector< Vector2d<float> > trainingFeatures(nclass);</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     nctraining[iclass]=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       std::cout << <span class="stringliteral">"nctraining["</span> << iclass << <span class="stringliteral">"]: "</span> << nctraining[iclass] << std::endl;</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     <span class="keywordflow">if</span>(testPixels.size()>iclass){</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       nctest[iclass]=testPixels[iclass].size();</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     std::cout << <span class="stringliteral">"nctest["</span> << iclass << <span class="stringliteral">"]: "</span> << nctest[iclass] << std::endl;</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       }</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     }</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       nctest[iclass]=0;</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     <span class="comment">// trainingFeatures[iclass].resize(nctraining[iclass]);</span></div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     trainingFeatures[iclass].resize(nctraining[iclass]+nctest[iclass]);</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining[iclass];++isample){</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>         assert(trainingPixels[iclass].size()>isample);</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         assert(trainingPixels[iclass][isample].size()>iband+startBand);</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>         assert(offset.size()>iband);</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         assert(scale.size()>iband);</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         trainingFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       }</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     }</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     <span class="comment">// assert(trainingFeatures[iclass].size()==nctraining[iclass]);</span></div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctest[iclass];++isample){</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>         assert(testPixels[iclass].size()>isample);</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>         assert(testPixels[iclass][isample].size()>iband+startBand);</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>         assert(offset.size()>iband);</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>         assert(scale.size()>iband);</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>         <span class="keywordtype">float</span> value=testPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>         <span class="comment">// testFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</span></div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>         trainingFeatures[iclass][nctraining[iclass]+isample].push_back((value-offset[iband])/scale[iband]);</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       }</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     }</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     assert(trainingFeatures[iclass].size()==nctraining[iclass]+nctest[iclass]);</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   }</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span> </div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   assert(ccost_opt.size()>1);<span class="comment">//must have boundaries at least (initial value is optional)</span></div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   <span class="keywordflow">if</span>(ccost_opt.size()<3)<span class="comment">//create initial value</span></div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     ccost_opt.push_back(sqrt(ccost_opt[0]*ccost_opt[1]));</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   assert(gamma_opt.size()>1);<span class="comment">//must have boundaries at least (initial value is optional)</span></div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   <span class="keywordflow">if</span>(gamma_opt.size()<3)<span class="comment">//create initial value</span></div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     gamma_opt.push_back(sqrt(gamma_opt[0]*gamma_opt[1]));<span class="comment">//will be translated to 1.0/nFeatures</span></div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>   assert(ccost_opt.size()==3);<span class="comment">//min, init, max</span></div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>   assert(gamma_opt.size()==3);<span class="comment">//min, init, max</span></div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   assert(gamma_opt[0]<gamma_opt[1]);</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   assert(gamma_opt[0]<gamma_opt[2]);</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>   assert(gamma_opt[2]<gamma_opt[1]);</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   assert(ccost_opt[0]<ccost_opt[1]);</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   assert(ccost_opt[0]<ccost_opt[2]);</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   assert(ccost_opt[2]<ccost_opt[1]);</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span> </div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>   std::vector<double> x(2);</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span> <span class="comment">//  if(algorithm_opt[0]=="GRID"){</span></div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>   <span class="keywordflow">if</span> (1){</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>     <span class="comment">// double minError=1000;</span></div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="comment">// double minCost=0;</span></div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     <span class="comment">// double minGamma=0;</span></div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     <span class="keywordtype">double</span> maxKappa=0;</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     <span class="keywordtype">double</span> maxCost=0;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keywordtype">double</span> maxGamma=0;</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordtype">double</span> ncost=log(ccost_opt[1])/log(stepcc_opt[0])-log(ccost_opt[0])/log(stepcc_opt[0]);</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     <span class="keywordtype">double</span> ngamma=log(gamma_opt[1])/log(stepg_opt[0])-log(gamma_opt[0])/log(stepg_opt[0]);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     <span class="keywordflow">for</span>(<span class="keywordtype">double</span> ccost=ccost_opt[0];ccost<=ccost_opt[1];ccost*=stepcc_opt[0]){</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="keywordflow">for</span>(<span class="keywordtype">double</span> gamma=gamma_opt[0];gamma<=gamma_opt[1];gamma*=stepg_opt[0]){</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     x[0]=ccost;</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     x[1]=gamma;</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     std::vector<double> theGrad;</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordtype">double</span> kappa=0;</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     kappa=objFunction(x,theGrad,&trainingFeatures);</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     <span class="keywordflow">if</span>(kappa>maxKappa){</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       maxKappa=kappa;</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       maxCost=ccost;</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       maxGamma=gamma;</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     }</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       std::cout << ccost << <span class="stringliteral">" "</span> << gamma << <span class="stringliteral">" "</span> << kappa<< std::endl;</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     progress+=1.0/ncost/ngamma;</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       }</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     }</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     progress=1.0;</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     x[0]=maxCost;</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     x[1]=maxGamma;</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   }</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>   <span class="comment">//else{</span></div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   <span class="comment">//  nlopt::opt optimizer=OptFactory::getOptimizer(algorithm_opt[0],2);</span></div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   <span class="comment">//  if(verbose_opt[0]>1)</span></div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>   <span class="comment">//    std::cout << "optimization algorithm: " << optimizer.get_algorithm_name() << "..." << std::endl;</span></div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>   <span class="comment">//  std::vector<double> lb(2);</span></div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>   <span class="comment">//  std::vector<double> init(2);</span></div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>   <span class="comment">//  std::vector<double> ub(2);</span></div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span> </div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>   <span class="comment">//  lb[0]=ccost_opt[0];</span></div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   <span class="comment">//  lb[1]=(gamma_opt[0]>0)? gamma_opt[0] : 1.0/trainingFeatures[0][0].size();</span></div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>   <span class="comment">//  init[0]=ccost_opt[2];</span></div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>   <span class="comment">//  init[1]=(gamma_opt[2]>0)? gamma_opt[1] : 1.0/trainingFeatures[0][0].size();</span></div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>   <span class="comment">//  ub[0]=ccost_opt[1];</span></div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>   <span class="comment">//  ub[1]=(gamma_opt[1]>0)? gamma_opt[1] : 1.0/trainingFeatures[0][0].size();</span></div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>   <span class="comment">//  // optimizer.set_min_objective(objFunction, &trainingFeatures);</span></div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   <span class="comment">//  optimizer.set_max_objective(objFunction, &trainingFeatures);</span></div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>   <span class="comment">//  optimizer.set_lower_bounds(lb);</span></div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>   <span class="comment">//  optimizer.set_upper_bounds(ub);</span></div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>   <span class="comment">//  if(verbose_opt[0]>1)</span></div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>   <span class="comment">//    std::cout << "set stopping criteria" << std::endl;</span></div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   <span class="comment">//  //set stopping criteria</span></div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   <span class="comment">//  if(maxit_opt[0])</span></div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   <span class="comment">//    optimizer.set_maxeval(maxit_opt[0]);</span></div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>   <span class="comment">//  else</span></div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   <span class="comment">//    optimizer.set_xtol_rel(tolerance_opt[0]);</span></div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   <span class="comment">//  double minf=0;</span></div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   <span class="comment">//  x=init;</span></div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   <span class="comment">//  try{</span></div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   <span class="comment">//    optimizer.optimize(x, minf);</span></div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <span class="comment">//  }</span></div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   <span class="comment">//  catch(string error){</span></div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   <span class="comment">//    cerr << error << std::endl;</span></div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>   <span class="comment">//    exit(1);</span></div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>   <span class="comment">//  }</span></div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   <span class="comment">//  catch (exception& e){</span></div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   <span class="comment">//    cout << e.what() << endl;</span></div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>   <span class="comment">//  }</span></div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   <span class="comment">//  catch(...){</span></div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>   <span class="comment">//    cerr << "error catched" << std::endl;</span></div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   <span class="comment">//    exit(1);</span></div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="comment">//  }</span></div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span> </div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   <span class="comment">//  double ccost=x[0];</span></div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   <span class="comment">//  double gamma=x[1];</span></div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>   <span class="comment">//  if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>   <span class="comment">//    std::cout << "optimized with " << optimizer.get_algorithm_name() << "..." << std::endl;</span></div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>   <span class="comment">//}</span></div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>   std::cout << <span class="stringliteral">" --ccost "</span> << x[0];</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   std::cout << <span class="stringliteral">" --gamma "</span> << x[1];</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   std::cout << std::endl;</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span> }</div>
+<div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="preprocessor">#include "algorithms/ConfusionMatrix.h"</span></div>
+<div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="preprocessor">#include "algorithms/FeatureSelector.h"</span></div>
+<div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="preprocessor">#include "algorithms/OptFactory.h"</span></div>
+<div class="line"><a name="l00030"></a><span class="lineno">   30</span> <span class="preprocessor">#include "algorithms/CostFactorySVM.h"</span></div>
+<div class="line"><a name="l00031"></a><span class="lineno">   31</span> <span class="preprocessor">#include "algorithms/svm.h"</span></div>
+<div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="preprocessor">#include "imageclasses/ImgReaderOgr.h"</span></div>
+<div class="line"><a name="l00033"></a><span class="lineno">   33</span> </div>
+<div class="line"><a name="l00034"></a><span class="lineno">   34</span> <span class="preprocessor">#ifdef HAVE_CONFIG_H</span></div>
+<div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="preprocessor"></span><span class="preprocessor">#include <config.h></span></div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="preprocessor"></span></div>
+<div class="line"><a name="l00038"></a><span class="lineno">   38</span> <span class="comment">/******************************************************************************/</span></div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span> </div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span> <span class="preprocessor">#define Malloc(type,n) (type *)malloc((n)*sizeof(type))</span></div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span> <span class="preprocessor"></span>                                    <span class="comment">//declare objective function</span></div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span> <span class="keywordtype">double</span> objFunction(<span class="keyword">const</span> std::vector<double> &x, std::vector<double> &grad, <span class="keywordtype">void</span> *my_func_data);</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span> </div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span> <span class="comment">//global parameters used in objective function</span></div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span> map<string,short> classValueMap;</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span> vector<std::string> nameVector;</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span> vector<unsigned int> nctraining;</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span> vector<unsigned int> nctest;</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span> <a class="code" href="classOptionpk.html">Optionpk<std::string></a> svm_type_opt(<span class="stringliteral">"svmt"</span>, <span class="stringliteral">"svmtype"</span>, <span class="stringliteral">"type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR)"</span>,<span class="stringliteral">"C_SVC"</span>);</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span> <a class="code" href="classOptionpk.html">Optionpk<std::string></a> kernel_type_opt(<span class="stringliteral">"kt"</span>, <span class="stringliteral">"kerneltype"</span>, <span class="stringliteral">"type of kernel function (linear,polynomial,radial,sigmoid) "</span>,<span class="stringliteral">"radial"</span>);</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span> <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> kernel_degree_opt(<span class="stringliteral">"kd"</span>, <span class="stringliteral">"kd"</span>, <span class="stringliteral">"degree in kernel function"</span>,3);</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span> <a class="code" href="classOptionpk.html">Optionpk<float></a> coef0_opt(<span class="stringliteral">"c0"</span>, <span class="stringliteral">"coef0"</span>, <span class="stringliteral">"coef0 in kernel function"</span>,0);</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span> <a class="code" href="classOptionpk.html">Optionpk<float></a> nu_opt(<span class="stringliteral">"nu"</span>, <span class="stringliteral">"nu"</span>, <span class="stringliteral">"the parameter nu of nu-SVC, one-class SVM, and nu-SVR"</span>,0.5);</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span> <a class="code" href="classOptionpk.html">Optionpk<float></a> epsilon_loss_opt(<span class="stringliteral">"eloss"</span>, <span class="stringliteral">"eloss"</span>, <span class="stringliteral">"the epsilon in loss function of epsilon-SVR"</span>,0.1);</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span> <a class="code" href="classOptionpk.html">Optionpk<int></a> cache_opt(<span class="stringliteral">"cache"</span>, <span class="stringliteral">"cache"</span>, <span class="stringliteral">"cache memory size in MB"</span>,100);</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span> <a class="code" href="classOptionpk.html">Optionpk<float></a> epsilon_tol_opt(<span class="stringliteral">"etol"</span>, <span class="stringliteral">"etol"</span>, <span class="stringliteral">"the tolerance of termination criterion"</span>,0.001);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span> <a class="code" href="classOptionpk.html">Optionpk<bool></a> shrinking_opt(<span class="stringliteral">"shrink"</span>, <span class="stringliteral">"shrink"</span>, <span class="stringliteral">"whether to use the shrinking heuristics"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span> <a class="code" href="classOptionpk.html">Optionpk<bool></a> prob_est_opt(<span class="stringliteral">"pe"</span>, <span class="stringliteral">"probest"</span>, <span class="stringliteral">"whether to train a SVC or SVR model for probability estimates"</span>,<span class="keyword">true</span>,2);</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span> <a class="code" href="classOptionpk.html">Optionpk<bool></a> costfunction_opt(<span class="stringliteral">"cf"</span>, <span class="stringliteral">"cf"</span>, <span class="stringliteral">"use Overall Accuracy instead of kappa"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span> <span class="comment">// Optionpk<bool> weight_opt("wi", "wi", "set the parameter C of class i to weight*C, for C-SVC",true);</span></div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span> <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> cv_opt(<span class="stringliteral">"cv"</span>, <span class="stringliteral">"cv"</span>, <span class="stringliteral">"n-fold cross validation mode"</span>,2);</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span> <a class="code" href="classOptionpk.html">Optionpk<string></a> classname_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"list of class names."</span>); </div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span> <a class="code" href="classOptionpk.html">Optionpk<short></a> classvalue_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"reclass"</span>, <span class="stringliteral">"list of class values (use same order as in class opt)."</span>); </div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span> <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"use 1 to output intermediate results for plotting"</span>,0,2);</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span> </div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span> <span class="keywordtype">double</span> objFunction(<span class="keyword">const</span> std::vector<double> &x, std::vector<double> &grad, <span class="keywordtype">void</span> *my_func_data){</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span> </div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   assert(grad.empty());</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   vector<Vector2d<float> > *tf=<span class="keyword">reinterpret_cast<</span>vector<Vector2d<float> <span class="keyword">></span>*> (my_func_data);</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <span class="keywordtype">float</span> ccost=x[0];</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <span class="keywordtype">float</span> gamma=x[1];</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <span class="keywordtype">double</span> error=1.0/epsilon_tol_opt[0];</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <span class="keywordtype">double</span> kappa=1.0;</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <span class="keywordtype">double</span> oa=1.0;</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span> </div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <a class="code" href="classCostFactorySVM.html">CostFactorySVM</a> costfactory(svm_type_opt[0], kernel_type_opt[0], kernel_degree_opt[0], gamma, coef0_opt[0], ccost, nu_opt[0],  epsilon_loss_opt[0], cache_opt[0], epsilon_tol_opt[0], shrinking_opt[0], prob_est_opt[0], cv_opt[0], verbose_opt[0]);</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span> </div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   assert(tf->size());</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <span class="comment">// if(nctest>0)</span></div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <span class="comment">//   costfactory.setCv(0);</span></div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span> </div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   costfactory.setCv(cv_opt[0]);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span> </div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>       costfactory.setClassValueMap(classname_opt[iclass],classvalue_opt[iclass]);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   }</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <span class="comment">//set names in confusion matrix using nameVector</span></div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   costfactory.setNameVector(nameVector);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="comment">// vector<string> nameVector=costfactory.getNameVector();</span></div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iname=0;iname<nameVector.size();++iname){</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     <span class="keywordflow">if</span>(costfactory.getClassValueMap().empty()){</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>       costfactory.pushBackClassName(nameVector[iname]);</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>       <span class="comment">// cm.pushBackClassName(nameVector[iname]);</span></div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     }</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(costfactory.getClassIndex(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]))<0)</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>       costfactory.pushBackClassName(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]));</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   }</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span> </div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   costfactory.setNcTraining(nctraining);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   costfactory.setNcTest(nctest);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span> </div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   kappa=costfactory.getCost(*tf);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <span class="keywordflow">return</span>(kappa);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span> }</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span> </div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span> {</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   map<short,int> reclassMap;</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   vector<int> vreclass;</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> training_opt(<span class="stringliteral">"t"</span>, <span class="stringliteral">"training"</span>, <span class="stringliteral">"training vector file. A single vector file contains all training features (must be set as: b0, b1, b2,...) for all classes (class numbers identified by label option)."</span>); </div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> ccost_opt(<span class="stringliteral">"cc"</span>, <span class="stringliteral">"ccost"</span>, <span class="stringliteral">"min and max boundaries the parameter C of C-SVC, epsilon-SVR, and nu-SVR (optional: initial value)"</span>,1);</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> gamma_opt(<span class="stringliteral">"g"</span>, <span class="stringliteral">"gamma"</span>, <span class="stringliteral">"min max boundaries for gamma in kernel function (optional: initial value)"</span>,0);</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> stepcc_opt(<span class="stringliteral">"stepcc"</span>,<span class="stringliteral">"stepcc"</span>,<span class="stringliteral">"multiplicative step for ccost in GRID search"</span>,2);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> stepg_opt(<span class="stringliteral">"stepg"</span>,<span class="stringliteral">"stepg"</span>,<span class="stringliteral">"multiplicative step for gamma in GRID search"</span>,2);</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"input test vector file"</span>); </div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> tlayer_opt(<span class="stringliteral">"tln"</span>, <span class="stringliteral">"tln"</span>, <span class="stringliteral">"training layer name(s)"</span>);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> label_opt(<span class="stringliteral">"label"</span>, <span class="stringliteral">"label"</span>, <span class="stringliteral">"identifier for class label in training vector file."</span>,<span class="stringliteral">"label"</span>); </div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   <span class="comment">// Optionpk<unsigned short> reclass_opt("\0", "rc", "reclass code (e.g. --rc=12 --rc=23 to reclass first two classes to 12 and 23 resp.).", 0);</span></div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> balance_opt(<span class="stringliteral">"bal"</span>, <span class="stringliteral">"balance"</span>, <span class="stringliteral">"balance the input data to this number of samples for each class"</span>, 0);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> random_opt(<span class="stringliteral">"random"</span>,<span class="stringliteral">"random"</span>, <span class="stringliteral">"in case of balance, randomize input data"</span>, <span class="keyword">true</span>);</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> minSize_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"if number of training pixels is less then min, do not take this class into account"</span>, 0);</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index (starting from 0, either use band option or use start to end)"</span>);</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bstart_opt(<span class="stringliteral">"sband"</span>, <span class="stringliteral">"startband"</span>, <span class="stringliteral">"Start band sequence number"</span>); </div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bend_opt(<span class="stringliteral">"eband"</span>, <span class="stringliteral">"endband"</span>, <span class="stringliteral">"End band sequence number"</span>); </div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]"</span>, 0.0);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)"</span>, 0.0);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> maxit_opt(<span class="stringliteral">"maxit"</span>,<span class="stringliteral">"maxit"</span>,<span class="stringliteral">"maximum number of iterations"</span>,500);</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span> <span class="comment">//Optionpk<string> algorithm_opt("a", "algorithm", "GRID, or any optimization algorithm from http://ab-initio.mit.edu/wiki/index.php/NLopt_Algorithms","GRID"); </span></div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> tolerance_opt(<span class="stringliteral">"tol"</span>,<span class="stringliteral">"tolerance"</span>,<span class="stringliteral">"relative tolerance for stopping criterion"</span>,0.0001);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span> </div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   input_opt.setHide(1);</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   tlayer_opt.setHide(1);</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   label_opt.setHide(1);</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   balance_opt.setHide(1);</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   random_opt.setHide(1);</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   minSize_opt.setHide(1);</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   band_opt.setHide(1);</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   bstart_opt.setHide(1);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   bend_opt.setHide(1);</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   offset_opt.setHide(1);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   scale_opt.setHide(1);</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   svm_type_opt.setHide(1);</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   kernel_type_opt.setHide(1);</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   kernel_degree_opt.setHide(1);</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   coef0_opt.setHide(1);</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   nu_opt.setHide(1);</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   epsilon_loss_opt.setHide(1);</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   cache_opt.setHide(1);</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   epsilon_tol_opt.setHide(1);</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   shrinking_opt.setHide(1);</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   prob_est_opt.setHide(1);</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   cv_opt.setHide(1);</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   costfunction_opt.setHide(1);</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   maxit_opt.setHide(1);</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   tolerance_opt.setHide(1);</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span> <span class="comment">//  algorithm_opt.setHide(1);</span></div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   classname_opt.setHide(1);</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   classvalue_opt.setHide(1);</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   </div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     doProcess=training_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     ccost_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     gamma_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     stepcc_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     stepg_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     tlayer_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     label_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     balance_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     random_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     minSize_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     bstart_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     bend_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     offset_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     scale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     svm_type_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     kernel_type_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     kernel_degree_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     coef0_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     nu_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     epsilon_loss_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     cache_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     epsilon_tol_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     shrinking_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     prob_est_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     cv_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     costfunction_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     maxit_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     tolerance_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span> <span class="comment">//    algorithm_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     classname_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     classvalue_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   }</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     exit(0);</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   }</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     cout << endl;</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     cout << <span class="stringliteral">"Usage: pkoptsvm -t training"</span> << endl;</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     cout << endl;</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   }</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span> </div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   assert(training_opt.size());</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="keywordflow">if</span>(input_opt.size())</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     cv_opt[0]=0;</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span> </div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     <span class="keywordflow">if</span>(input_opt.size())</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>       std::cout << <span class="stringliteral">"input filename: "</span> << input_opt[0] << std::endl;</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     std::cout << <span class="stringliteral">"training vector file: "</span> << std::endl;</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<training_opt.size();++ifile)</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       std::cout << training_opt[ifile] << std::endl;</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     std::cout << <span class="stringliteral">"verbose: "</span> << verbose_opt[0] << std::endl;</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   }</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span> </div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSamples=0;</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalTestSamples=0;</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span> </div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nclass=0;</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="keywordtype">int</span> startBand=2;<span class="comment">//first two bands represent X and Y pos</span></div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span> </div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   vector<double> offset;</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   vector<double> scale;</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   vector< Vector2d<float> > testPixels;<span class="comment">//[class][sample][band]</span></div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span> </div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="comment">// if(priors_opt.size()>1){//priors from argument list</span></div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="comment">//   priors.resize(priors_opt.size());</span></div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="comment">//   double normPrior=0;</span></div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="comment">//   for(int iclass=0;iclass<priors_opt.size();++iclass){</span></div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>   <span class="comment">//     priors[iclass]=priors_opt[iclass];</span></div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   <span class="comment">//     normPrior+=priors[iclass];</span></div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   <span class="comment">//   //normalize</span></div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   <span class="comment">//   for(int iclass=0;iclass<priors_opt.size();++iclass)</span></div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="comment">//     priors[iclass]/=normPrior;</span></div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span> </div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>       }</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       band_opt.clear();</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     }</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       band_opt.push_back(iband);</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       }</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     }</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   }</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     exit(1);</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>   }</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   <span class="comment">//sort bands</span></div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     std::sort(band_opt.begin(),band_opt.end());</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span> </div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   <span class="comment">// map<string,short> classValueMap;//global variable for now (due to getCost)</span></div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   }</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span> </div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   <span class="keyword">struct </span><a class="code" href="structsvm__problem.html">svm_problem</a> prob;</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   vector<string> fields;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   <span class="comment">//organize training data</span></div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   trainingPixels.clear();</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   testPixels.clear();</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   map<string,Vector2d<float> > trainingMap;</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   map<string,Vector2d<float> > testMap;</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>     std::cout << <span class="stringliteral">"reading training file "</span> << training_opt[0] << std::endl;</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     <span class="keywordflow">if</span>(band_opt.size()){</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     inputReader.close();</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       }</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     }</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     inputReader.close();</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>       }</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       trainingReader.close();</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     }</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       <span class="comment">// map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</span></div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       <span class="comment">// while(mapit!=trainingMap.end())</span></div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="comment">//    cerr << mapit->first << " -> " << classValueMap[mapit->first] << std::endl;</span></div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training input file"</span>;</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     }</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordflow">if</span>(input_opt.size()&&testMap.size()<2){</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from test input file"</span>;</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     }</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   }</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     exit(1);</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   }</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     exit(1);</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>   }</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   <span class="comment">//todo delete class 0 ?</span></div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   <span class="comment">// if(verbose_opt[0]>=1)</span></div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>   <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   <span class="comment">// trainingMap.erase(0);</span></div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span> </div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>   map<string,Vector2d<float> >::iterator mapit;</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>   <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       std::cout << mapit->first << <span class="stringliteral">" -> "</span> << classValueMap[mapit->first] << std::endl;</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       }</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     exit(1);</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       }</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     }    </div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     <span class="comment">//delete small classes</span></div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       trainingMap.erase(mapit);</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     }</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     nameVector.push_back(mapit->first);</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     trainingPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     <span class="comment">// trainingPixels.push_back(mapit->second); ??</span></div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     <span class="comment">// ++iclass;</span></div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     ++mapit;</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>   }</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   nclass=trainingPixels.size();</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   <span class="keywordflow">if</span>(classname_opt.size())</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>     assert(nclass==classname_opt.size());</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span> </div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   mapit=testMap.begin();</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   <span class="keywordflow">while</span>(mapit!=testMap.end()){</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       <span class="comment">//check if name in test is covered by classname_opt (values can not be 0)</span></div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     ;<span class="comment">//ok, no need to print to std::cout </span></div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       }</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in test vector and make sure classvalue is > 0"</span> << std::endl;</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     exit(1);</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       }</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     }    </div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     <span class="comment">//no need to delete small classes for test sample</span></div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     testPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     ++mapit;</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>   }</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>   <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>     assert(nclass==testPixels.size());</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     assert(nband=testPixels[0][0].size()-2);<span class="comment">//X and Y//testPixels[0][0].size();</span></div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     assert(!cv_opt[0]);</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>   }</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span> </div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>   <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>   <span class="comment">//balance training data</span></div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>   <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       srand(time(NULL));</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     totalSamples=0;</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>         <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>           <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>         }</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       }</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>         <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[0];++isample){</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>           <span class="keywordtype">int</span> index = rand()%oldsize;</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>           trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         }</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       }</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       totalSamples+=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     }</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     assert(totalSamples==nclass*balance_opt[0]);</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>   }</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span> </div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>   <span class="comment">//no need to balance test sample    </span></div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>   <span class="comment">//set scale and offset</span></div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   offset.resize(nband);</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   scale.resize(nband);</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>   <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     assert(offset_opt.size()==nband);</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>   <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     assert(scale_opt.size()==nband);</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     offset[iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     scale[iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     <span class="comment">//search for min and maximum</span></div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     <span class="keywordflow">if</span>(scale[iband]<=0){</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>             theMin=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>           <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>             theMax=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>         }</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       }</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       offset[iband]=theMin+(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       scale[iband]=(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>         std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[iband] << <span class="stringliteral">", "</span> << scale[iband] << std::endl;</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>         std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[iband])/scale[iband] << <span class="stringliteral">","</span> << (theMax-offset[iband])/scale[iband] << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       }</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     }</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>   }</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span> </div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   <span class="comment">// if(priors_opt.size()==1){//default: equal priors for each class</span></div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="comment">//   priors.resize(nclass);</span></div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="comment">//   for(int iclass=0;iclass<nclass;++iclass)</span></div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <span class="comment">//     priors[iclass]=1.0/nclass;</span></div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   <span class="comment">// assert(priors_opt.size()==1||priors_opt.size()==nclass);</span></div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     </div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     <span class="comment">// std::cout << "priors:";</span></div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     <span class="comment">// for(int iclass=0;iclass<nclass;++iclass)</span></div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     <span class="comment">//   std::cout << " " << priors[iclass];</span></div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     <span class="comment">// std::cout << std::endl;</span></div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>   }</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span> </div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>   <span class="comment">//Calculate features of training (and test) set</span></div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>   nctraining.resize(nclass);</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>   nctest.resize(nclass);</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>   vector< Vector2d<float> > trainingFeatures(nclass);</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     nctraining[iclass]=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       std::cout << <span class="stringliteral">"nctraining["</span> << iclass << <span class="stringliteral">"]: "</span> << nctraining[iclass] << std::endl;</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="keywordflow">if</span>(testPixels.size()>iclass){</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       nctest[iclass]=testPixels[iclass].size();</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     std::cout << <span class="stringliteral">"nctest["</span> << iclass << <span class="stringliteral">"]: "</span> << nctest[iclass] << std::endl;</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       }</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     }</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       nctest[iclass]=0;</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     <span class="comment">// trainingFeatures[iclass].resize(nctraining[iclass]);</span></div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     trainingFeatures[iclass].resize(nctraining[iclass]+nctest[iclass]);</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining[iclass];++isample){</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>         assert(trainingPixels[iclass].size()>isample);</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>         assert(trainingPixels[iclass][isample].size()>iband+startBand);</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         assert(offset.size()>iband);</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>         assert(scale.size()>iband);</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         trainingFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       }</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     }</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     <span class="comment">// assert(trainingFeatures[iclass].size()==nctraining[iclass]);</span></div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctest[iclass];++isample){</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>         assert(testPixels[iclass].size()>isample);</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>         assert(testPixels[iclass][isample].size()>iband+startBand);</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>         assert(offset.size()>iband);</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>         assert(scale.size()>iband);</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>         <span class="keywordtype">float</span> value=testPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>         <span class="comment">// testFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</span></div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>         trainingFeatures[iclass][nctraining[iclass]+isample].push_back((value-offset[iband])/scale[iband]);</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       }</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     }</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     assert(trainingFeatures[iclass].size()==nctraining[iclass]+nctest[iclass]);</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   }</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span> </div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   assert(ccost_opt.size()>1);<span class="comment">//must have boundaries at least (initial value is optional)</span></div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   <span class="keywordflow">if</span>(ccost_opt.size()<3)<span class="comment">//create initial value</span></div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     ccost_opt.push_back(sqrt(ccost_opt[0]*ccost_opt[1]));</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>   assert(gamma_opt.size()>1);<span class="comment">//must have boundaries at least (initial value is optional)</span></div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   <span class="keywordflow">if</span>(gamma_opt.size()<3)<span class="comment">//create initial value</span></div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     gamma_opt.push_back(sqrt(gamma_opt[0]*gamma_opt[1]));<span class="comment">//will be translated to 1.0/nFeatures</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>   assert(ccost_opt.size()==3);<span class="comment">//min, init, max</span></div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>   assert(gamma_opt.size()==3);<span class="comment">//min, init, max</span></div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>   assert(gamma_opt[0]<gamma_opt[1]);</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   assert(gamma_opt[0]<gamma_opt[2]);</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   assert(gamma_opt[2]<gamma_opt[1]);</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>   assert(ccost_opt[0]<ccost_opt[1]);</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   assert(ccost_opt[0]<ccost_opt[2]);</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   assert(ccost_opt[2]<ccost_opt[1]);</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span> </div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>   std::vector<double> x(2);</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span> <span class="comment">//  if(algorithm_opt[0]=="GRID"){</span></div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>   <span class="keywordflow">if</span> (1){</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="comment">// double minError=1000;</span></div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>     <span class="comment">// double minCost=0;</span></div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="comment">// double minGamma=0;</span></div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     <span class="keywordtype">double</span> maxKappa=0;</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     <span class="keywordtype">double</span> maxCost=0;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     <span class="keywordtype">double</span> maxGamma=0;</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     <span class="keywordtype">double</span> ncost=log(ccost_opt[1])/log(stepcc_opt[0])-log(ccost_opt[0])/log(stepcc_opt[0]);</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordtype">double</span> ngamma=log(gamma_opt[1])/log(stepg_opt[0])-log(gamma_opt[0])/log(stepg_opt[0]);</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     <span class="keywordflow">for</span>(<span class="keywordtype">double</span> ccost=ccost_opt[0];ccost<=ccost_opt[1];ccost*=stepcc_opt[0]){</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       <span class="keywordflow">for</span>(<span class="keywordtype">double</span> gamma=gamma_opt[0];gamma<=gamma_opt[1];gamma*=stepg_opt[0]){</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     x[0]=ccost;</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     x[1]=gamma;</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     std::vector<double> theGrad;</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     <span class="keywordtype">double</span> kappa=0;</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     kappa=objFunction(x,theGrad,&trainingFeatures);</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     <span class="keywordflow">if</span>(kappa>maxKappa){</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       maxKappa=kappa;</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       maxCost=ccost;</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       maxGamma=gamma;</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     }</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       std::cout << ccost << <span class="stringliteral">" "</span> << gamma << <span class="stringliteral">" "</span> << kappa<< std::endl;</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     progress+=1.0/ncost/ngamma;</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       }</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     }</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     progress=1.0;</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     x[0]=maxCost;</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     x[1]=maxGamma;</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>   }</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   <span class="comment">//else{</span></div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>   <span class="comment">//  nlopt::opt optimizer=OptFactory::getOptimizer(algorithm_opt[0],2);</span></div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   <span class="comment">//  if(verbose_opt[0]>1)</span></div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   <span class="comment">//    std::cout << "optimization algorithm: " << optimizer.get_algorithm_name() << "..." << std::endl;</span></div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>   <span class="comment">//  std::vector<double> lb(2);</span></div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>   <span class="comment">//  std::vector<double> init(2);</span></div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>   <span class="comment">//  std::vector<double> ub(2);</span></div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span> </div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>   <span class="comment">//  lb[0]=ccost_opt[0];</span></div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>   <span class="comment">//  lb[1]=(gamma_opt[0]>0)? gamma_opt[0] : 1.0/trainingFeatures[0][0].size();</span></div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   <span class="comment">//  init[0]=ccost_opt[2];</span></div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>   <span class="comment">//  init[1]=(gamma_opt[2]>0)? gamma_opt[1] : 1.0/trainingFeatures[0][0].size();</span></div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>   <span class="comment">//  ub[0]=ccost_opt[1];</span></div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>   <span class="comment">//  ub[1]=(gamma_opt[1]>0)? gamma_opt[1] : 1.0/trainingFeatures[0][0].size();</span></div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>   <span class="comment">//  // optimizer.set_min_objective(objFunction, &trainingFeatures);</span></div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>   <span class="comment">//  optimizer.set_max_objective(objFunction, &trainingFeatures);</span></div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   <span class="comment">//  optimizer.set_lower_bounds(lb);</span></div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>   <span class="comment">//  optimizer.set_upper_bounds(ub);</span></div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>   <span class="comment">//  if(verbose_opt[0]>1)</span></div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>   <span class="comment">//    std::cout << "set stopping criteria" << std::endl;</span></div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>   <span class="comment">//  //set stopping criteria</span></div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   <span class="comment">//  if(maxit_opt[0])</span></div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   <span class="comment">//    optimizer.set_maxeval(maxit_opt[0]);</span></div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   <span class="comment">//  else</span></div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>   <span class="comment">//    optimizer.set_xtol_rel(tolerance_opt[0]);</span></div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   <span class="comment">//  double minf=0;</span></div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   <span class="comment">//  x=init;</span></div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   <span class="comment">//  try{</span></div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   <span class="comment">//    optimizer.optimize(x, minf);</span></div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   <span class="comment">//  }</span></div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <span class="comment">//  catch(string error){</span></div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   <span class="comment">//    cerr << error << std::endl;</span></div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   <span class="comment">//    exit(1);</span></div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>   <span class="comment">//  }</span></div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>   <span class="comment">//  catch (exception& e){</span></div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   <span class="comment">//    cout << e.what() << endl;</span></div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   <span class="comment">//  }</span></div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>   <span class="comment">//  catch(...){</span></div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   <span class="comment">//    cerr << "error caught" << std::endl;</span></div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>   <span class="comment">//    exit(1);</span></div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   <span class="comment">//  }</span></div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span> </div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>   <span class="comment">//  double ccost=x[0];</span></div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   <span class="comment">//  double gamma=x[1];</span></div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   <span class="comment">//  if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>   <span class="comment">//    std::cout << "optimized with " << optimizer.get_algorithm_name() << "..." << std::endl;</span></div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>   <span class="comment">//}</span></div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>   std::cout << <span class="stringliteral">" --ccost "</span> << x[0];</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>   std::cout << <span class="stringliteral">" --gamma "</span> << x[1];</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   std::cout << std::endl;</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span> }</div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 <div class="ttc" id="classCostFactorySVM_html"><div class="ttname"><a href="classCostFactorySVM.html">CostFactorySVM</a></div><div class="ttdef"><b>Definition:</b> <a href="CostFactorySVM_8h_source.html#l00034">CostFactorySVM.h:34</a></div></div>
@@ -686,7 +685,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkpolygonize.html b/doc/html/pkpolygonize.html
index 274cfe6..97fc8c5 100644
--- a/doc/html/pkpolygonize.html
+++ b/doc/html/pkpolygonize.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -82,7 +82,7 @@ Usage: pkpolygonize -i input [-m mask] -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkpolygonize_8cc_source.html b/doc/html/pkpolygonize_8cc_source.html
index 992487f..fa21d87 100644
--- a/doc/html/pkpolygonize_8cc_source.html
+++ b/doc/html/pkpolygonize_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -180,14 +180,14 @@
 <div class="line"><a name="l00164"></a><span class="lineno">  164</span>   ogrWriter.close();</div>
 <div class="line"><a name="l00165"></a><span class="lineno">  165</span> }</div>
 <div class="line"><a name="l00166"></a><span class="lineno">  166</span> </div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 <div class="ttc" id="classImgWriterOgr_html"><div class="ttname"><a href="classImgWriterOgr.html">ImgWriterOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterOgr_8h_source.html#l00035">ImgWriterOgr.h:35</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkreclass.html b/doc/html/pkreclass.html
index e3ccb38..5cb488b 100644
--- a/doc/html/pkreclass.html
+++ b/doc/html/pkreclass.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,6 +74,8 @@ Options</h1>
 <tr>
 <td>ot </td><td>otype </td><td>std::string </td><td></td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
 <tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate) </td></tr>
+<tr>
 <td>b </td><td>band </td><td>unsigned short </td><td>0 </td><td>band index(es) to replace (other bands are copied to output) </td></tr>
 <tr>
 <td>n </td><td>fname </td><td>std::string </td><td>label </td><td>field name of the shape file to be replaced </td></tr>
@@ -92,7 +94,7 @@ Usage: pkreclass -i input [-c from -r to]* -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkreclass_8cc_source.html b/doc/html/pkreclass_8cc_source.html
index bac431b..33b8e78 100644
--- a/doc/html/pkreclass_8cc_source.html
+++ b/doc/html/pkreclass_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -80,336 +80,338 @@
 <div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="preprocessor">#include "imageclasses/ImgWriterGdal.h"</span></div>
 <div class="line"><a name="l00027"></a><span class="lineno">   27</span> </div>
 <div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span> </div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span> {</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input image"</span>);</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Mask image(s)"</span>);</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output mask file"</span>);</div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> masknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value(s) where image has nodata. Use one value for each mask, or multiple values for a single mask."</span>, 1);</div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value to put in image if not valid (0)"</span>, 0);</div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a>  band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index(es) to replace (other bands are copied to output)"</span>, 0);</div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> type_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringliteral [...]
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> code_opt(<span class="stringliteral">"code"</span>, <span class="stringliteral">"code"</span>, <span class="stringliteral">"Recode text file (2 colums: from to)"</span>);</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> class_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"list of classes to reclass (in combination with reclass option)"</span>);</div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> reclass_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"reclass"</span>, <span class="stringliteral">"list of recoded classes (in combination with class option)"</span>);</div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> fieldname_opt(<span class="stringliteral">"n"</span>, <span class="stringliteral">"fname"</span>, <span class="stringliteral">"field name of the shape file to be replaced"</span>, <span class="stringliteral">"label"</span>);</div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> description_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"description"</span>, <span class="stringliteral">"Set image description"</span>);</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0);</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span> </div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>     mask_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>     masknodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>     code_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>     class_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>     reclass_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>     type_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>     fieldname_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>     description_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   }</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>     exit(0);</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   }</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>     cout << endl;</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>     cout << <span class="stringliteral">"Usage: pkreclass -i input [-c from -r to]* -o output"</span> << endl;</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>     cout << endl;</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   }</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span> </div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     exit(0);</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   }</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     std::cerr << <span class="stringliteral">"No output file provided (use option -o). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     exit(0);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   }</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>     </div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <span class="comment">// vector<short> bandVector;</span></div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <span class="comment">// for(int iband=0;iband<band_opt.size();++iband)</span></div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   <span class="comment">//   bandVector.push_back(band_opt[iband]);</span></div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   map<string,string> codemapString;<span class="comment">//map with codes: codemapString[theKey(from)]=theValue(to)</span></div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   map<double,double> codemap;<span class="comment">//map with codes: codemap[theKey(from)]=theValue(to)</span></div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <span class="keywordflow">if</span>(code_opt.size()){</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>       cout << <span class="stringliteral">"opening code text file "</span> << code_opt[0] << endl;</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>     ifstream codefile;</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     codefile.open(code_opt[0].c_str());</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     <span class="keywordtype">string</span> theKey;</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     <span class="keywordtype">string</span> theValue;</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     <span class="keywordflow">while</span>(codefile>>theKey){</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>       codefile >> theValue;</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>       codemapString[theKey]=theValue;</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>       codemap[string2type<double>(theKey)]=string2type<double>(theValue);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     }</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     codefile.close();</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   }</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <span class="keywordflow">else</span>{<span class="comment">//use combination of class_opt and reclass_opt</span></div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     assert(class_opt.size()==reclass_opt.size());</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>       codemapString[class_opt[iclass]]=reclass_opt[iclass];</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>       codemap[string2type<double>(class_opt[iclass])]=string2type<double>(reclass_opt[iclass]);</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     }</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   }</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   assert(codemapString.size());</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   assert(codemap.size());</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <span class="comment">//if verbose true, print the codes to screen</span></div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     map<string,string>::iterator mit;</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     cout << codemapString.size() << <span class="stringliteral">" codes used: "</span> << endl;</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     <span class="keywordflow">for</span>(mit=codemapString.begin();mit!=codemapString.end();++mit)</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>       cout << (*mit).first << <span class="stringliteral">" "</span> << (*mit).second << endl;</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   }</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="keywordtype">bool</span> refIsRaster=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> ogrReader;</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     ogrReader.open(input_opt[0]);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   }</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     refIsRaster=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span> </div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span> {</div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input image"</span>);</div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Mask image(s)"</span>);</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output mask file"</span>);</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> masknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value(s) where image has nodata. Use one value for each mask, or multiple values for a single mask."</span>, 1);</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value to put in image if not valid (0)"</span>, 0);</div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a>  band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index(es) to replace (other bands are copied to output)"</span>, 0);</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> type_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringliteral [...]
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>,<span class="stringliteral">"GTiff"</span>);</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> code_opt(<span class="stringliteral">"code"</span>, <span class="stringliteral">"code"</span>, <span class="stringliteral">"Recode text file (2 colums: from to)"</span>);</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> class_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"list of classes to reclass (in combination with reclass option)"</span>);</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> reclass_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"reclass"</span>, <span class="stringliteral">"list of recoded classes (in combination with class option)"</span>);</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> fieldname_opt(<span class="stringliteral">"n"</span>, <span class="stringliteral">"fname"</span>, <span class="stringliteral">"field name of the shape file to be replaced"</span>, <span class="stringliteral">"label"</span>);</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> description_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"description"</span>, <span class="stringliteral">"Set image description"</span>);</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0);</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span> </div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>     mask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>     masknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>     code_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>     class_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>     reclass_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>     type_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>     fieldname_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     description_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   }</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>     exit(0);</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   }</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>     cout << endl;</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>     cout << <span class="stringliteral">"Usage: pkreclass -i input [-c from -r to]* -o output"</span> << endl;</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>     cout << endl;</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   }</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span> </div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     exit(0);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   }</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>     std::cerr << <span class="stringliteral">"No output file provided (use option -o). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     exit(0);</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   }</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     </div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <span class="comment">// vector<short> bandVector;</span></div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <span class="comment">// for(int iband=0;iband<band_opt.size();++iband)</span></div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <span class="comment">//   bandVector.push_back(band_opt[iband]);</span></div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   map<string,string> codemapString;<span class="comment">//map with codes: codemapString[theKey(from)]=theValue(to)</span></div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   map<double,double> codemap;<span class="comment">//map with codes: codemap[theKey(from)]=theValue(to)</span></div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <span class="keywordflow">if</span>(code_opt.size()){</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>       cout << <span class="stringliteral">"opening code text file "</span> << code_opt[0] << endl;</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     ifstream codefile;</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     codefile.open(code_opt[0].c_str());</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     <span class="keywordtype">string</span> theKey;</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     <span class="keywordtype">string</span> theValue;</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     <span class="keywordflow">while</span>(codefile>>theKey){</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>       codefile >> theValue;</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>       codemapString[theKey]=theValue;</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>       codemap[string2type<double>(theKey)]=string2type<double>(theValue);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     }</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     codefile.close();</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   }</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <span class="keywordflow">else</span>{<span class="comment">//use combination of class_opt and reclass_opt</span></div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     assert(class_opt.size()==reclass_opt.size());</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>       codemapString[class_opt[iclass]]=reclass_opt[iclass];</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>       codemap[string2type<double>(class_opt[iclass])]=string2type<double>(reclass_opt[iclass]);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     }</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   }</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   assert(codemapString.size());</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   assert(codemap.size());</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="comment">//if verbose true, print the codes to screen</span></div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     map<string,string>::iterator mit;</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     cout << codemapString.size() << <span class="stringliteral">" codes used: "</span> << endl;</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     <span class="keywordflow">for</span>(mit=codemapString.begin();mit!=codemapString.end();++mit)</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>       cout << (*mit).first << <span class="stringliteral">" "</span> << (*mit).second << endl;</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   }</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <span class="keywordtype">bool</span> refIsRaster=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> ogrReader;</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     ogrReader.open(input_opt[0]);</div>
 <div class="line"><a name="l00167"></a><span class="lineno">  167</span>   }</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <span class="comment">// if(input_opt[0].find(".shp")!=string::npos){//shape file</span></div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <span class="keywordflow">if</span>(!refIsRaster){</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>       cout << <span class="stringliteral">"opening "</span> << input_opt[0] << <span class="stringliteral">" for reading "</span> << endl;</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     <span class="comment">// ImgReaderOgr ogrReader(input_opt[0]);</span></div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     refIsRaster=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   }</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <span class="comment">// if(input_opt[0].find(".shp")!=string::npos){//shape file</span></div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <span class="keywordflow">if</span>(!refIsRaster){</div>
 <div class="line"><a name="l00173"></a><span class="lineno">  173</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>       cout << <span class="stringliteral">"opening "</span> << output_opt[0] << <span class="stringliteral">" for writing "</span> << endl;</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrWriter(output_opt[0],ogrReader);</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>       cout << <span class="stringliteral">"opening "</span> << input_opt[0] << <span class="stringliteral">" for reading "</span> << endl;</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     <span class="comment">// ImgReaderOgr ogrReader(input_opt[0]);</span></div>
 <div class="line"><a name="l00176"></a><span class="lineno">  176</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>       cout << <span class="stringliteral">"copied layer from "</span> << input_opt[0] << endl << flush;</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     <span class="comment">//start reading features from the layer</span></div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>       cout << <span class="stringliteral">"reset reading"</span> << endl;</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     ogrReader.getLayer()->ResetReading();</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>       cout << <span class="stringliteral">"going through features"</span> << endl << flush;</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     <span class="keywordflow">while</span>(<span class="keyword">true</span>){</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span> <span class="comment">//     while( (poFeature = ogrWriter.getLayer()->GetNextFeature()) != NULL ){</span></div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>       OGRFeature *poFeature;</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>       poFeature=ogrReader.getLayer()->GetNextFeature();</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>       <span class="keywordflow">if</span>(poFeature== NULL)</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>       OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>       <span class="keywordtype">string</span> featurename;</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>         OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>         <span class="keywordtype">string</span> fieldname=poFieldDefn->GetNameRef();</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>         <span class="keywordflow">if</span>(fieldname==fieldname_opt[0]){</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>           <span class="keywordtype">string</span> fromClass=poFeature->GetFieldAsString(iField);</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>           <span class="keywordtype">string</span> toClass=fromClass;</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>           <span class="keywordflow">if</span>(codemapString.find(fromClass)!=codemapString.end())</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>             toClass=codemapString[fromClass];</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>           poFeature->SetField(iField,toClass.c_str());</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>             cout << <span class="stringliteral">"feature "</span> << ifeature << <span class="stringliteral">": "</span> << fromClass << <span class="stringliteral">"->"</span> << poFeature->GetFieldAsInteger(iField) << endl << flush;</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span> <span class="comment">//             cout << "feature " << ifeature << ": " << fromClass << "->" << toClass << endl << flush;</span></div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>         }</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>       }</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>       <span class="comment">//do not forget to actually write feature to file!!!</span></div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>       ogrWriter.createFeature(poFeature);</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>       OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       ++ifeature;</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     }</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>        cout << <span class="stringliteral">"replaced "</span> << ifeature << <span class="stringliteral">" features"</span> << endl;</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     ogrReader.close();</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     ogrWriter.close();</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   }</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keywordflow">else</span>{<span class="comment">//image file</span></div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> inputReader;</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     vector<ImgReaderGdal> maskReader(mask_opt.size()); </div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> outputWriter;</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       cout << <span class="stringliteral">"opening input image file "</span> << input_opt[0] << endl;</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     inputReader.open(input_opt[0]);</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask){</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>         cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[imask] << endl;</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       maskReader[imask].open(mask_opt[imask]);</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     }</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>       cout << <span class="stringliteral">"opening output image file "</span> << output_opt[0] << endl;</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       cout << <span class="stringliteral">"data type: "</span> << type_opt[0] << endl;</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     }</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     <span class="comment">//create output image with user defined data type </span></div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     GDALDataType theType=GDT_Unknown;</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>       cout << <span class="stringliteral">"possible output data types: "</span>;</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>         cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>       <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>           && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>                    type_opt[0].c_str()))</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>         theType=(GDALDataType) iType;</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     }</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>       theType=inputReader.getDataType();</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>       cout << endl << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       theInterleave+=inputReader.getInterleave();</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     }</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     outputWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),inputReader.nrOfBand(),theType,inputReader.getImageType(),option_opt);</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband)</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>       outputWriter.GDALSetNoDataValue(nodata_opt[0],iband);</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     <span class="keywordflow">if</span>(description_opt.size())</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       outputWriter.setImageDescription(description_opt[0]);</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span> </div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>       <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>         outputWriter.setColorTable(colorTable_opt[0]);</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     }</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (inputReader.getColorTable()!=NULL)<span class="comment">//copy colorTable from input image</span></div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>       outputWriter.setColorTable(inputReader.getColorTable());</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     </div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     <span class="comment">//if input image is georeferenced, copy projection info to output image</span></div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     <span class="keywordflow">if</span>(inputReader.isGeoRef()){</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask)</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>         assert(maskReader[imask].isGeoRef());</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     }</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     outputWriter.copyGeoTransform(inputReader);</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>     outputWriter.setProjection(inputReader.getProjection());</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     inputReader.getBoundingBox(ulx,uly,lrx,lry);</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     outputWriter.copyGeoTransform(inputReader);</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     assert(nodata_opt.size()==masknodata_opt.size());</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     <span class="keywordflow">if</span>(verbose_opt[0]&&mask_opt.size()){</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iv=0;iv<masknodata_opt.size();++iv)</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>         cout << masknodata_opt[iv] << <span class="stringliteral">"->"</span> << nodata_opt[iv] << endl;</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     }</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span> </div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     assert(outputWriter.nrOfCol()==inputReader.nrOfCol());</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="comment">// Vector2d<int> lineInput(inputReader.nrOfBand(),inputReader.nrOfCol());</span></div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(inputReader.nrOfBand(),inputReader.nrOfCol());</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     <a class="code" href="classVector2d.html">Vector2d<short></a> lineMask(mask_opt.size());</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask)</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       lineMask[imask].resize(maskReader[imask].nrOfCol());</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(outputWriter.nrOfBand(),outputWriter.nrOfCol());</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     <span class="keywordtype">int</span> irow=0;</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     <span class="keywordtype">int</span> icol=0;</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     <span class="keywordtype">double</span> oldRowMask=-1;</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     <span class="keywordflow">for</span>(irow=0;irow<inputReader.nrOfRow();++irow){</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       <span class="comment">//read line in lineInput buffer</span></div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband){</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>           <span class="comment">// inputReader.readData(lineInput[iband],GDT_Int32,irow,iband);</span></div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>           inputReader.readData(lineInput[iband],GDT_Float64,irow,iband);</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>         }</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>           cerr << errorstring << endl;</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>           exit(1);</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         }</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       }</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>       <span class="keywordtype">double</span> x,y;<span class="comment">//geo coordinates</span></div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       <span class="keywordtype">double</span> colMask,rowMask;<span class="comment">//image coordinates in mask image</span></div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       <span class="keywordflow">for</span>(icol=0;icol<inputReader.nrOfCol();++icol){</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>         <span class="keywordflow">if</span>(mask_opt.size()>1){<span class="comment">//multiple masks</span></div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask){</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>         inputReader.image2geo(icol,irow,x,y);</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>         maskReader[imask].geo2image(x,y,colMask,rowMask);</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>             <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>               assert(rowMask>=0&&rowMask<maskReader[imask].nrOfRow());</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>               <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>                 maskReader[imask].readData(lineMask[imask],GDT_Int16,static_cast<int>(rowMask));</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>               }</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>               <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>                 cerr << errorstring << endl;</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>                 exit(1);</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>               }</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>               oldRowMask=rowMask;</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>             }</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>             <span class="keywordtype">short</span> ivalue=0;</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>             <span class="keywordflow">if</span>(mask_opt.size()==masknodata_opt.size())<span class="comment">//one invalid value for each mask</span></div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>               ivalue=masknodata_opt[imask];</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>             <span class="keywordflow">else</span><span class="comment">//use same invalid value for each mask</span></div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>               ivalue=masknodata_opt[0];</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>             <span class="keywordflow">if</span>(lineMask[imask][colMask]==ivalue){</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband)</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>                 lineInput[iband][icol]=nodata_opt[imask];</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>               masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>             }</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>           }</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>         }</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(mask_opt.size()){<span class="comment">//potentially more invalid values for single mask</span></div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       inputReader.image2geo(icol,irow,x,y);</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       maskReader[0].geo2image(x,y,colMask,rowMask);</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>           <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>             assert(rowMask>=0&&rowMask<maskReader[0].nrOfRow());</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>               maskReader[0].readData(lineMask[0],GDT_Int16,static_cast<int>(rowMask));</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>             }</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>             <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>               cerr << errorstring << endl;</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>               exit(1);</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>             }</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>             oldRowMask=rowMask;</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>           }</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalue=0;ivalue<masknodata_opt.size();++ivalue){</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>             assert(masknodata_opt.size()==nodata_opt.size());</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>             <span class="keywordflow">if</span>(lineMask[0][colMask]==masknodata_opt[ivalue]){</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband)</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>                 lineInput[iband][icol]=nodata_opt[ivalue];</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>               masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>             }</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>           }</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>         }</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<lineOutput.size();++iband){</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>           lineOutput[iband][icol]=lineInput[iband][icol];</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>           <span class="keywordflow">if</span>(find(band_opt.begin(),band_opt.end(),iband)!=band_opt.end()){</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>             <span class="keywordflow">if</span>(!masked && codemap.find(lineInput[iband][icol])!=codemap.end()){</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>               <span class="keywordtype">double</span> toValue=codemap[lineInput[iband][icol]];</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           lineOutput[iband][icol]=toValue;</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         }</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       }</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>         }</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       }</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       <span class="comment">//write buffer lineOutput to output file</span></div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<outputWriter.nrOfBand();++iband)</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>           outputWriter.writeData(lineOutput[iband],GDT_Float64,irow,iband);</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       }</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>         cerr << errorstring << endl;</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>         exit(1);</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       }</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       <span class="comment">//progress bar</span></div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/outputWriter.nrOfRow());</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     }</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     inputReader.close();</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     outputWriter.close();</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   }</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>       cout << <span class="stringliteral">"opening "</span> << output_opt[0] << <span class="stringliteral">" for writing "</span> << endl;</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrWriter(output_opt[0],ogrReader);</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>       cout << <span class="stringliteral">"copied layer from "</span> << input_opt[0] << endl << flush;</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     <span class="comment">//start reading features from the layer</span></div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>       cout << <span class="stringliteral">"reset reading"</span> << endl;</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     ogrReader.getLayer()->ResetReading();</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>       cout << <span class="stringliteral">"going through features"</span> << endl << flush;</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     <span class="keywordflow">while</span>(<span class="keyword">true</span>){</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span> <span class="comment">//     while( (poFeature = ogrWriter.getLayer()->GetNextFeature()) != NULL ){</span></div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>       OGRFeature *poFeature;</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>       poFeature=ogrReader.getLayer()->GetNextFeature();</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>       <span class="keywordflow">if</span>(poFeature== NULL)</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>       OGRFeatureDefn *poFDefn = ogrWriter.getLayer()->GetLayerDefn();</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>       <span class="keywordtype">string</span> featurename;</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iField=0;iField<poFDefn->GetFieldCount();++iField){</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>         OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn(iField);</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>         <span class="keywordtype">string</span> fieldname=poFieldDefn->GetNameRef();</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>         <span class="keywordflow">if</span>(fieldname==fieldname_opt[0]){</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>           <span class="keywordtype">string</span> fromClass=poFeature->GetFieldAsString(iField);</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>           <span class="keywordtype">string</span> toClass=fromClass;</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>           <span class="keywordflow">if</span>(codemapString.find(fromClass)!=codemapString.end())</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>             toClass=codemapString[fromClass];</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>           poFeature->SetField(iField,toClass.c_str());</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>             cout << <span class="stringliteral">"feature "</span> << ifeature << <span class="stringliteral">": "</span> << fromClass << <span class="stringliteral">"->"</span> << poFeature->GetFieldAsInteger(iField) << endl << flush;</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span> <span class="comment">//             cout << "feature " << ifeature << ": " << fromClass << "->" << toClass << endl << flush;</span></div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>         }</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>       }</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       <span class="comment">//do not forget to actually write feature to file!!!</span></div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>       ogrWriter.createFeature(poFeature);</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>       OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>       ++ifeature;</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     }</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>        cout << <span class="stringliteral">"replaced "</span> << ifeature << <span class="stringliteral">" features"</span> << endl;</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     ogrReader.close();</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     ogrWriter.close();</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   }</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <span class="keywordflow">else</span>{<span class="comment">//image file</span></div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> inputReader;</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     vector<ImgReaderGdal> maskReader(mask_opt.size()); </div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> outputWriter;</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>       cout << <span class="stringliteral">"opening input image file "</span> << input_opt[0] << endl;</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     inputReader.open(input_opt[0]);</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask){</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>         cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[imask] << endl;</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>       maskReader[imask].open(mask_opt[imask]);</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     }</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>       cout << <span class="stringliteral">"opening output image file "</span> << output_opt[0] << endl;</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>       cout << <span class="stringliteral">"data type: "</span> << type_opt[0] << endl;</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     }</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     <span class="comment">//create output image with user defined data type </span></div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     GDALDataType theType=GDT_Unknown;</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>       cout << <span class="stringliteral">"possible output data types: "</span>;</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>         cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>       <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>           && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>                    type_opt[0].c_str()))</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>         theType=(GDALDataType) iType;</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     }</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>       theType=inputReader.getDataType();</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       cout << endl << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>       theInterleave+=inputReader.getInterleave();</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>       option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     }</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     outputWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),inputReader.nrOfBand(),theType,oformat_opt[0],option_opt);</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband)</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>       outputWriter.GDALSetNoDataValue(nodata_opt[0],iband);</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     <span class="keywordflow">if</span>(description_opt.size())</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>       outputWriter.setImageDescription(description_opt[0]);</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span> </div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>       <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>         outputWriter.setColorTable(colorTable_opt[0]);</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     }</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (inputReader.getColorTable()!=NULL)<span class="comment">//copy colorTable from input image</span></div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>       outputWriter.setColorTable(inputReader.getColorTable());</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     </div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     <span class="comment">//if input image is georeferenced, copy projection info to output image</span></div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     <span class="keywordflow">if</span>(inputReader.isGeoRef()){</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask)</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>         assert(maskReader[imask].isGeoRef());</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     }</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     outputWriter.copyGeoTransform(inputReader);</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     outputWriter.setProjection(inputReader.getProjection());</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     inputReader.getBoundingBox(ulx,uly,lrx,lry);</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     outputWriter.copyGeoTransform(inputReader);</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     assert(nodata_opt.size()==masknodata_opt.size());</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordflow">if</span>(verbose_opt[0]&&mask_opt.size()){</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iv=0;iv<masknodata_opt.size();++iv)</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>         cout << masknodata_opt[iv] << <span class="stringliteral">"->"</span> << nodata_opt[iv] << endl;</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     }</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span> </div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     assert(outputWriter.nrOfCol()==inputReader.nrOfCol());</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     <span class="comment">// Vector2d<int> lineInput(inputReader.nrOfBand(),inputReader.nrOfCol());</span></div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(inputReader.nrOfBand(),inputReader.nrOfCol());</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     <a class="code" href="classVector2d.html">Vector2d<short></a> lineMask(mask_opt.size());</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask)</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>       lineMask[imask].resize(maskReader[imask].nrOfCol());</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(outputWriter.nrOfBand(),outputWriter.nrOfCol());</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     <span class="keywordtype">int</span> irow=0;</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     <span class="keywordtype">int</span> icol=0;</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     <span class="keywordtype">double</span> oldRowMask=-1;</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="keywordflow">for</span>(irow=0;irow<inputReader.nrOfRow();++irow){</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       <span class="comment">//read line in lineInput buffer</span></div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband){</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>           <span class="comment">// inputReader.readData(lineInput[iband],GDT_Int32,irow,iband);</span></div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>           inputReader.readData(lineInput[iband],GDT_Float64,irow,iband);</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>         }</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>           cerr << errorstring << endl;</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>           exit(1);</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>         }</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       }</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>       <span class="keywordtype">double</span> x,y;<span class="comment">//geo coordinates</span></div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       <span class="keywordtype">double</span> colMask,rowMask;<span class="comment">//image coordinates in mask image</span></div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       <span class="keywordflow">for</span>(icol=0;icol<inputReader.nrOfCol();++icol){</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>         <span class="keywordflow">if</span>(mask_opt.size()>1){<span class="comment">//multiple masks</span></div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask){</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>         inputReader.image2geo(icol,irow,x,y);</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>         maskReader[imask].geo2image(x,y,colMask,rowMask);</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>             <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>               assert(rowMask>=0&&rowMask<maskReader[imask].nrOfRow());</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>               <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>                 maskReader[imask].readData(lineMask[imask],GDT_Int16,static_cast<int>(rowMask));</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>               }</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>               <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>                 cerr << errorstring << endl;</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>                 exit(1);</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>               }</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>               oldRowMask=rowMask;</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>             }</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>             <span class="keywordtype">short</span> ivalue=0;</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>             <span class="keywordflow">if</span>(mask_opt.size()==masknodata_opt.size())<span class="comment">//one invalid value for each mask</span></div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>               ivalue=masknodata_opt[imask];</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>             <span class="keywordflow">else</span><span class="comment">//use same invalid value for each mask</span></div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>               ivalue=masknodata_opt[0];</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>             <span class="keywordflow">if</span>(lineMask[imask][colMask]==ivalue){</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband)</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>                 lineInput[iband][icol]=nodata_opt[imask];</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>               masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>             }</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>           }</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>         }</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(mask_opt.size()){<span class="comment">//potentially more invalid values for single mask</span></div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       inputReader.image2geo(icol,irow,x,y);</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       maskReader[0].geo2image(x,y,colMask,rowMask);</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>           <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>             assert(rowMask>=0&&rowMask<maskReader[0].nrOfRow());</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>               maskReader[0].readData(lineMask[0],GDT_Int16,static_cast<int>(rowMask));</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>             }</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>             <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>               cerr << errorstring << endl;</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>               exit(1);</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>             }</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>             oldRowMask=rowMask;</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>           }</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalue=0;ivalue<masknodata_opt.size();++ivalue){</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>             assert(masknodata_opt.size()==nodata_opt.size());</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>             <span class="keywordflow">if</span>(lineMask[0][colMask]==masknodata_opt[ivalue]){</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband)</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>                 lineInput[iband][icol]=nodata_opt[ivalue];</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>               masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>             }</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>           }</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>         }</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<lineOutput.size();++iband){</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>           lineOutput[iband][icol]=lineInput[iband][icol];</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           <span class="keywordflow">if</span>(find(band_opt.begin(),band_opt.end(),iband)!=band_opt.end()){</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>             <span class="keywordflow">if</span>(!masked && codemap.find(lineInput[iband][icol])!=codemap.end()){</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>               <span class="keywordtype">double</span> toValue=codemap[lineInput[iband][icol]];</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>           lineOutput[iband][icol]=toValue;</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>         }</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       }</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>         }</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       }</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       <span class="comment">//write buffer lineOutput to output file</span></div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<outputWriter.nrOfBand();++iband)</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>           outputWriter.writeData(lineOutput[iband],GDT_Float64,irow,iband);</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       }</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>         exit(1);</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       }</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="comment">//progress bar</span></div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/outputWriter.nrOfRow());</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     }</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     inputReader.close();</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     outputWriter.close();</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   }</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span> }</div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
@@ -418,7 +420,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkreclass_8py_source.html b/doc/html/pkreclass_8py_source.html
index b178c87..1ee19ca 100644
--- a/doc/html/pkreclass_8py_source.html
+++ b/doc/html/pkreclass_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -195,7 +195,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkregann.html b/doc/html/pkregann.html
index d4d0fe2..d3d1e62 100644
--- a/doc/html/pkregann.html
+++ b/doc/html/pkregann.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -94,7 +94,7 @@ Usage: pkregann -i input -t training [-ic col]* [-oc col]* -o output </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkregann_8cc_source.html b/doc/html/pkregann_8cc_source.html
index 9372a65..67eb80d 100644
--- a/doc/html/pkregann_8cc_source.html
+++ b/doc/html/pkregann_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -428,7 +428,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksensormodel_8h_source.html b/doc/html/pksensormodel_8h_source.html
index 7cb95a9..9b837a2 100644
--- a/doc/html/pksensormodel_8h_source.html
+++ b/doc/html/pksensormodel_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -139,7 +139,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksetmask.html b/doc/html/pksetmask.html
index 469a854..77fdbd0 100644
--- a/doc/html/pksetmask.html
+++ b/doc/html/pksetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,7 +77,7 @@ Options</h1>
 <tr>
 <td>ot </td><td>otype </td><td>std::string </td><td></td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td></td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate) </td></tr>
 <tr>
 <td>co </td><td>co </td><td>std::string </td><td></td><td>Creation option for output file. Multiple options can be specified. </td></tr>
 <tr>
@@ -93,7 +93,7 @@ Usage: pksetmask -i input -m mask [-m mask]* [-msknodata value -nodata value]* -
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksetmask_8cc_source.html b/doc/html/pksetmask_8cc_source.html
index ea6c802..3645add 100644
--- a/doc/html/pksetmask_8cc_source.html
+++ b/doc/html/pksetmask_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -86,7 +86,7 @@
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Mask image(s)"</span>);</div>
 <div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output mask file"</span>);</div>
 <div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringlitera [...]
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)"</span>,<span class="stringliteral">"GTiff"</span>);</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
 <div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value(s) where image has nodata. Use one value for each mask, or multiple values for a single mask."</span>, 1);</div>
 <div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> mskband_opt(<span class="stringliteral">"mskband"</span>, <span class="stringliteral">"mskband"</span>, <span class="stringliteral">"Mask band to read (0 indexed). Provide band for each mask."</span>, 0);</div>
@@ -146,7 +146,7 @@
 <div class="line"><a name="l00137"></a><span class="lineno">  137</span>     cout << <span class="stringliteral">"opening input image file "</span> << input_opt[0] << endl;</div>
 <div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> inputReader;</div>
 <div class="line"><a name="l00139"></a><span class="lineno">  139</span>   inputReader.open(input_opt[0]);</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <span class="keywordtype">string</span> imageType=inputReader.getImageType();</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <span class="keywordtype">string</span> imageType;<span class="comment">//=inputReader.getImageType();</span></div>
 <div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
 <div class="line"><a name="l00142"></a><span class="lineno">  142</span>     imageType=oformat_opt[0];</div>
 <div class="line"><a name="l00143"></a><span class="lineno">  143</span>   GDALDataType theType=GDT_Unknown;</div>
@@ -381,15 +381,15 @@
 <div class="line"><a name="l00372"></a><span class="lineno">  372</span>     maskReader[imask].close();</div>
 <div class="line"><a name="l00373"></a><span class="lineno">  373</span>   outputWriter.close();</div>
 <div class="line"><a name="l00374"></a><span class="lineno">  374</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksetmask_8py_source.html b/doc/html/pksetmask_8py_source.html
index 96f6064..494b69c 100644
--- a/doc/html/pksetmask_8py_source.html
+++ b/doc/html/pksetmask_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -184,7 +184,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksieve.html b/doc/html/pksieve.html
index 854c190..49e1bbd 100644
--- a/doc/html/pksieve.html
+++ b/doc/html/pksieve.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -86,7 +86,7 @@ Usage: pksieve -i input [-s size] -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksieve_8cc_source.html b/doc/html/pksieve_8cc_source.html
index b6b2367..77c9fd4 100644
--- a/doc/html/pksieve_8cc_source.html
+++ b/doc/html/pksieve_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -173,14 +173,14 @@
 <div class="line"><a name="l00158"></a><span class="lineno">  158</span>   outputWriter.close();</div>
 <div class="line"><a name="l00159"></a><span class="lineno">  159</span> }</div>
 <div class="line"><a name="l00160"></a><span class="lineno">  160</span> </div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstat.html b/doc/html/pkstat.html
index 1f80e22..6a7c9b1 100644
--- a/doc/html/pkstat.html
+++ b/doc/html/pkstat.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -124,7 +124,7 @@ Usage: pkstat -i input </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstat_8cc_source.html b/doc/html/pkstat_8cc_source.html
index 3fa3df7..fc61132 100644
--- a/doc/html/pkstat_8cc_source.html
+++ b/doc/html/pkstat_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -204,859 +204,954 @@
 <div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keywordtype">double</span> minY=0;</div>
 <div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <span class="keywordtype">double</span> maxX=0;</div>
 <div class="line"><a name="l00203"></a><span class="lineno">  203</span>   <span class="keywordtype">double</span> maxY=0;</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   <span class="keywordtype">double</span> minValue=0;</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   <span class="keywordtype">double</span> maxValue=0;</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   <span class="keywordtype">double</span> minValue=(src_min_opt.size())? src_min_opt[0] : 0;</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   <span class="keywordtype">double</span> maxValue=(src_max_opt.size())? src_max_opt[0] : 0;</div>
 <div class="line"><a name="l00206"></a><span class="lineno">  206</span>   <span class="keywordtype">double</span> meanValue=0;</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   <span class="keywordtype">double</span> stdDev=0;</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span> </div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   srand(time(NULL));</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span> </div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   <a class="code" href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a> imgreg;</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   std::vector<double> histogramOutput;</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keywordtype">double</span> nsample=0;</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span> </div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader;</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span> </div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   <span class="keywordflow">if</span>(scale_opt.size()){</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     <span class="keywordflow">while</span>(scale_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       scale_opt.push_back(scale_opt[0]);</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   }</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   <span class="keywordflow">if</span>(offset_opt.size()){</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="keywordflow">while</span>(offset_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       offset_opt.push_back(offset_opt[0]);</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   }</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     std::cerr << <span class="stringliteral">"No image dataset provided (use option -i). Use --help for help information"</span>;</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       exit(0);</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   }</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>       imgReader.open(input_opt[ifile]);</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     }</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>       std::cout << errorstring << std::endl;</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>       exit(0);</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     }</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span> </div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     <span class="keywordflow">if</span>(filename_opt[0])</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>       std::cout << <span class="stringliteral">" --input "</span> << input_opt[ifile] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span> </div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata)</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>       imgReader.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span> </div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordtype">int</span> nband=band_opt.size();</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span> </div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     <span class="keywordflow">if</span>(!inodata)</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>       imgReader.GDALSetNoDataValue(nodata_opt[0],band_opt[iband]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>       }</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span> </div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>       <span class="keywordflow">if</span>(offset_opt.size()>ifile)</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>         imgReader.setOffset(offset_opt[ifile],band_opt[iband]);</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       <span class="keywordflow">if</span>(scale_opt.size()>ifile)</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>         imgReader.setScale(scale_opt[ifile],band_opt[iband]);</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span> </div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>       <span class="keywordflow">if</span>(stat_opt[0]||mean_opt[0]||var_opt[0]||stdev_opt[0]){<span class="comment">//the hard way (in memory)</span></div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     vector<double> readBuffer;</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     <span class="keywordtype">double</span> varValue;</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     imgReader.readDataBlock(readBuffer, GDT_Float64, 0, imgReader.nrOfCol()-1, 0, imgReader.nrOfRow()-1, band_opt[0]);</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     stat.setNoDataValues(nodata_opt);</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     stat.meanVar(readBuffer,meanValue,varValue);</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     stat.minmax(readBuffer,readBuffer.begin(),readBuffer.end(),minValue,maxValue);</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>         <span class="keywordflow">if</span>(mean_opt[0])</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>           std::cout << <span class="stringliteral">"--mean "</span> << meanValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>         <span class="keywordflow">if</span>(stdev_opt[0])</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>           std::cout << <span class="stringliteral">"--stdDev "</span> << sqrt(varValue) << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>         <span class="keywordflow">if</span>(var_opt[0])</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>           std::cout << <span class="stringliteral">"--var "</span> << varValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>         <span class="keywordflow">if</span>(stat_opt[0])</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>           std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" -max "</span> << maxValue << <span class="stringliteral">" --mean "</span> << meanValue << <span class="stringliteral">" --stdDev "</span> << sqrt(varValue) << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>       }</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span> </div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       <span class="keywordflow">if</span>(fstat_opt[0]){<span class="comment">//the fast way</span></div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>         assert(band_opt[iband]<imgReader.nrOfBand());</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     GDALProgressFunc pfnProgress;</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>         rasterBand=imgReader.getRasterBand(band_opt[iband]);</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>         rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span> </div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" -max "</span> << maxValue << <span class="stringliteral">" --mean "</span> << meanValue << <span class="stringliteral">" --stdDev "</span> << stdDev << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       }</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span> </div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>       <span class="keywordflow">if</span>(minmax_opt[0]||min_opt[0]||max_opt[0]){</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     assert(band_opt[iband]<imgReader.nrOfBand());</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span> </div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     <span class="keywordflow">if</span>((ulx_opt.size()||uly_opt.size()||lrx_opt.size()||lry_opt.size())&&(imgReader.covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>       <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>       imgReader.geo2image(ulx_opt[0],uly_opt[0],uli,ulj);</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>       imgReader.geo2image(lrx_opt[0],lry_opt[0],lri,lrj);</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>       imgReader.getMinMax(static_cast<int>(uli),static_cast<int>(lri),static_cast<int>(ulj),static_cast<int>(lrj),band_opt[iband],minValue,maxValue);</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     }</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       imgReader.getMinMax(minValue,maxValue,band_opt[iband],<span class="keyword">true</span>);</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     }</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     <span class="keywordflow">if</span>(minmax_opt[0])</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" -max "</span> << maxValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       <span class="keywordflow">if</span>(min_opt[0])</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>         std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       <span class="keywordflow">if</span>(max_opt[0])</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         std::cout << <span class="stringliteral">"-max "</span> << maxValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     }</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>       }</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     }</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     <span class="keywordflow">if</span>(histogram_opt[0]){<span class="comment">//aggregate results from multiple inputs, but only calculate for first selected band</span></div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>       assert(band_opt[0]<imgReader.nrOfBand());</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       </div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       imgReader.getMinMax(minValue,maxValue,band_opt[0]);</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>       <span class="keywordflow">if</span>(src_min_opt.size())</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>         minValue=src_min_opt[0];</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       <span class="keywordflow">if</span>(src_max_opt.size())</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>         maxValue=src_max_opt[0];</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>       <span class="keywordflow">if</span>(minValue>=maxValue)</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     imgReader.getMinMax(minValue,maxValue,band_opt[0]);</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span> </div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     cout << <span class="stringliteral">"number of valid pixels in image: "</span> << imgReader.getNvalid(band_opt[0]) << endl;</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span> </div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       nsample+=imgReader.getHistogram(histogramOutput,minValue,maxValue,nbin,band_opt[0],kde_opt[0]);</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span> </div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       <span class="comment">//only output for last input file</span></div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       <span class="keywordflow">if</span>(ifile==input_opt.size()-1){</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     std::cout.precision(10);</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> bin=0;bin<nbin;++bin){</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       <span class="keywordtype">double</span> binValue=0;</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       <span class="keywordflow">if</span>(nbin==maxValue-minValue+1)</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>         binValue=minValue+bin;</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>         binValue=minValue+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxValue-minValue)*(bin+0.5)/nbin;</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       std::cout << binValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       <span class="keywordflow">if</span>(relative_opt[0]||kde_opt[0])</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>         std::cout << 100.0*<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(histogramOutput[bin])/static_cast<double>(nsample) << std::endl;</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>         std::cout << static_cast<double>(histogramOutput[bin]) << std::endl;</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     }</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       }</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     }</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     <span class="keywordflow">if</span>(histogram2d_opt[0]&&input_opt.size()<2){</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       assert(band_opt.size()>1);</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     minX=src_min_opt[0];</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     minY=src_min_opt[1];</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       }</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     maxX=src_max_opt[0];</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     maxY=src_max_opt[1];</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   <span class="keywordtype">double</span> medianValue=0;</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   <span class="keywordtype">double</span> stdDev=0;</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span> </div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   srand(time(NULL));</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span> </div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   <a class="code" href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a> imgreg;</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   std::vector<double> histogramOutput;</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   <span class="keywordtype">double</span> nsample=0;</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span> </div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader;</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span> </div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   <span class="keywordflow">if</span>(scale_opt.size()){</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <span class="keywordflow">while</span>(scale_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>       scale_opt.push_back(scale_opt[0]);</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   }</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   <span class="keywordflow">if</span>(offset_opt.size()){</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     <span class="keywordflow">while</span>(offset_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>       offset_opt.push_back(offset_opt[0]);</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   }</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     std::cerr << <span class="stringliteral">"No image dataset provided (use option -i). Use --help for help information"</span>;</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>       exit(0);</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   }</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>       imgReader.open(input_opt[ifile]);</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     }</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>       std::cout << errorstring << std::endl;</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>       exit(0);</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     }</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span> </div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     <span class="keywordflow">if</span>(filename_opt[0])</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>       std::cout << <span class="stringliteral">" --input "</span> << input_opt[ifile] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span> </div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata)</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>       imgReader.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span> </div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     <span class="keywordtype">int</span> nband=band_opt.size();</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span> </div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     <span class="keywordflow">if</span>(!inodata)</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>       imgReader.GDALSetNoDataValue(nodata_opt[0],band_opt[iband]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>       }</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span> </div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>       <span class="keywordflow">if</span>(offset_opt.size()>ifile)</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>         imgReader.setOffset(offset_opt[ifile],band_opt[iband]);</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>       <span class="keywordflow">if</span>(scale_opt.size()>ifile)</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>         imgReader.setScale(scale_opt[ifile],band_opt[iband]);</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span> </div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>       <span class="keywordflow">if</span>(stat_opt[0]||mean_opt[0]||median_opt[0]||var_opt[0]||stdev_opt[0]){<span class="comment">//the hard way (in memory)</span></div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     vector<double> readBuffer;</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     <span class="keywordtype">double</span> varValue;</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     imgReader.readDataBlock(readBuffer, GDT_Float64, 0, imgReader.nrOfCol()-1, 0, imgReader.nrOfRow()-1, band_opt[0]);</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     stat.setNoDataValues(nodata_opt);</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     stat.meanVar(readBuffer,meanValue,varValue);</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     medianValue=stat.median(readBuffer);</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     stat.minmax(readBuffer,readBuffer.begin(),readBuffer.end(),minValue,maxValue);</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>         <span class="keywordflow">if</span>(mean_opt[0])</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>           std::cout << <span class="stringliteral">"--mean "</span> << meanValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>         <span class="keywordflow">if</span>(median_opt[0])</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>           std::cout << <span class="stringliteral">"--median "</span> << medianValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>         <span class="keywordflow">if</span>(stdev_opt[0])</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>           std::cout << <span class="stringliteral">"--stdDev "</span> << sqrt(varValue) << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>         <span class="keywordflow">if</span>(var_opt[0])</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>           std::cout << <span class="stringliteral">"--var "</span> << varValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>         <span class="keywordflow">if</span>(stat_opt[0])</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>           std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" -max "</span> << maxValue << <span class="stringliteral">" --mean "</span> << meanValue << <span class="stringliteral">" --stdDev "</span> << sqrt(varValue) << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>       }</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span> </div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>       <span class="keywordflow">if</span>(fstat_opt[0]){<span class="comment">//the fast way</span></div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>         assert(band_opt[iband]<imgReader.nrOfBand());</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     GDALProgressFunc pfnProgress;</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     <span class="keywordtype">void</span>* pProgressData;</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     GDALRasterBand* rasterBand;</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>         rasterBand=imgReader.getRasterBand(band_opt[iband]);</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>         rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span> </div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" -max "</span> << maxValue << <span class="stringliteral">" --mean "</span> << meanValue << <span class="stringliteral">" --stdDev "</span> << stdDev << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>       }</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span> </div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>       <span class="keywordflow">if</span>(minmax_opt[0]||min_opt[0]||max_opt[0]){</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     assert(band_opt[iband]<imgReader.nrOfBand());</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span> </div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     <span class="keywordflow">if</span>((ulx_opt.size()||uly_opt.size()||lrx_opt.size()||lry_opt.size())&&(imgReader.covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>       <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       imgReader.geo2image(ulx_opt[0],uly_opt[0],uli,ulj);</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       imgReader.geo2image(lrx_opt[0],lry_opt[0],lri,lrj);</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       imgReader.getMinMax(static_cast<int>(uli),static_cast<int>(lri),static_cast<int>(ulj),static_cast<int>(lrj),band_opt[iband],minValue,maxValue);</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     }</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       imgReader.getMinMax(minValue,maxValue,band_opt[iband]);</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     }</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     <span class="keywordflow">if</span>(minmax_opt[0])</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" -max "</span> << maxValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       <span class="keywordflow">if</span>(min_opt[0])</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>         std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       <span class="keywordflow">if</span>(max_opt[0])</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>         std::cout << <span class="stringliteral">"-max "</span> << maxValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     }</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       }</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     }</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     <span class="keywordflow">if</span>(histogram_opt[0]){<span class="comment">//aggregate results from multiple inputs, but only calculate for first selected band</span></div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>       assert(band_opt[0]<imgReader.nrOfBand());</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>       nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       </div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>       imgReader.getMinMax(minValue,maxValue,band_opt[0]);</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>       <span class="keywordflow">if</span>(src_min_opt.size())</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>         minValue=src_min_opt[0];</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>       <span class="keywordflow">if</span>(src_max_opt.size())</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>         maxValue=src_max_opt[0];</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>       <span class="keywordflow">if</span>(minValue>=maxValue)</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     imgReader.getMinMax(minValue,maxValue,band_opt[0]);</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span> </div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     cout << <span class="stringliteral">"number of valid pixels in image: "</span> << imgReader.getNvalid(band_opt[0]) << endl;</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span> </div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>       nsample+=imgReader.getHistogram(histogramOutput,minValue,maxValue,nbin,band_opt[0],kde_opt[0]);</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span> </div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       <span class="comment">//only output for last input file</span></div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       <span class="keywordflow">if</span>(ifile==input_opt.size()-1){</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     std::cout.precision(10);</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> bin=0;bin<nbin;++bin){</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>       <span class="keywordtype">double</span> binValue=0;</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       <span class="keywordflow">if</span>(nbin==maxValue-minValue+1)</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>         binValue=minValue+bin;</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>         binValue=minValue+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxValue-minValue)*(bin+0.5)/nbin;</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       std::cout << binValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       <span class="keywordflow">if</span>(relative_opt[0]||kde_opt[0])</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>         std::cout << 100.0*<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(histogramOutput[bin])/static_cast<double>(nsample) << std::endl;</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>         std::cout << static_cast<double>(histogramOutput[bin]) << std::endl;</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     }</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       }</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     }</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     <span class="keywordflow">if</span>(histogram2d_opt[0]&&input_opt.size()<2){</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       assert(band_opt.size()>1);</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     minX=src_min_opt[0];</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     minY=src_min_opt[1];</div>
 <div class="line"><a name="l00358"></a><span class="lineno">  358</span>       }</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       <span class="keywordflow">if</span>(nbin<=1){</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     std::cerr << <span class="stringliteral">"Warning: number of bins not defined, calculating bins from min and max value"</span> << std::endl;</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="keywordflow">if</span>(minX>=maxX)</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="keywordflow">if</span>(minY>=maxY)</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span> </div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     minValue=(minX<minY)? minX:minY;</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     maxValue=(maxX>maxY)? maxX:maxY;</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       std::cout << <span class="stringliteral">"min and max values: "</span> << minValue << <span class="stringliteral">", "</span> << maxValue << std::endl;</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     nbin=maxValue-minValue+1;</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>       }</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       assert(nbin>1);</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       <span class="keywordtype">double</span> sigma=0;</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       <span class="comment">//kernel density estimation as in http://en.wikipedia.org/wiki/Kernel_density_estimation</span></div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       <span class="keywordflow">if</span>(kde_opt[0]){</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     assert(band_opt[0]<imgReader.nrOfBand());</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     assert(band_opt[1]<imgReader.nrOfBand());</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     GDALProgressFunc pfnProgress;</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordtype">double</span> stdDev1=0;</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     <span class="keywordtype">double</span> stdDev2=0;</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     rasterBand=imgReader.getRasterBand(band_opt[0]);</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev1,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     rasterBand=imgReader.getRasterBand(band_opt[1]);</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev2,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span> </div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     <span class="keywordtype">double</span> estimatedSize=1.0*imgReader.getNvalid(band_opt[0])/down_opt[0]/down_opt[0];</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     <span class="keywordflow">if</span>(random_opt[0]>0)</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       estimatedSize*=random_opt[0]/100.0;</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>         sigma=1.06*sqrt(stdDev1*stdDev2)*pow(estimatedSize,-0.2);</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       }</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       assert(nbin);</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">if</span>(sigma>0)</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       std::cout << <span class="stringliteral">"calculating 2d kernel density estimate with sigma "</span> << sigma << <span class="stringliteral">" for bands "</span> << band_opt[0] << <span class="stringliteral">" and "</span> << band_opt[1] << std::endl;</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       std::cout << <span class="stringliteral">"calculating 2d histogram for bands "</span> << band_opt[0] << <span class="stringliteral">" and "</span> << band_opt[1] << std::endl;</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     std::cout << <span class="stringliteral">"nbin: "</span> << nbin << std::endl;</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       }</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span> </div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span> </div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       vector< vector<double> > output;</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span> </div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">if</span>(maxX<=minX)</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       <span class="keywordflow">if</span>(maxY<=minY)</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span> </div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       <span class="keywordflow">if</span>(maxX<=minX){</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       }</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="keywordflow">if</span>(maxY<=minY){</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       }</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       output.resize(nbin);</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     output[i].resize(nbin);</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       output[i][j]=0;</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       }</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       <span class="keywordtype">int</span> binX=0;</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       <span class="keywordtype">int</span> binY=0;</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       vector<double> inputX(imgReader.nrOfCol());</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       vector<double> inputY(imgReader.nrOfCol());</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nvalid=0;</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgReader.nrOfRow();++irow){</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>         <span class="keywordflow">if</span>(irow%down_opt[0])</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>     imgReader.readData(inputX,GDT_Float64,irow,band_opt[0]);</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     imgReader.readData(inputY,GDT_Float64,irow,band_opt[1]);</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgReader.nrOfCol();++icol){</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>           <span class="keywordflow">if</span>(icol%down_opt[0])</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       <span class="keywordflow">if</span>(random_opt[0]>0){</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>         <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         p*=100.0;</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         <span class="keywordflow">if</span>(p>random_opt[0])</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       }</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       <span class="keywordflow">if</span>(imgReader.isNoData(inputX[icol]))</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="keywordflow">if</span>(imgReader.isNoData(inputY[icol]))</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       ++nvalid;</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">if</span>(inputX[icol]>=maxX)</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         binX=nbin-1;</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputX[icol]<=minX)</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>         binX=0;</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[icol]-minX)/(maxX-minX)*nbin);</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       <span class="keywordflow">if</span>(inputY[icol]>=maxY)</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>         binY=nbin-1;</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputY[icol]<=minX)</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>         binY=0;</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>         binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[icol]-minY)/(maxY-minY)*nbin);</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       assert(binX>=0);</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       assert(binX<output.size());</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       assert(binY>=0);</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       assert(binY<output[binX].size());</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="keywordflow">if</span>(sigma>0){</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         <span class="comment">//create kde for Gaussian basis function</span></div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>         <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>           <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>           <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[icol]-centerX, sigma);</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>         <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>         <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[icol]-centerY, sigma);</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         output[ibinX][binY]+=pdfX*pdfY;</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>           }</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>         }</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       }</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         ++output[binX][binY];</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     }</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     maxX=src_max_opt[0];</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     maxY=src_max_opt[1];</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       }</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       <span class="keywordflow">if</span>(nbin<=1){</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     std::cerr << <span class="stringliteral">"Warning: number of bins not defined, calculating bins from min and max value"</span> << std::endl;</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="keywordflow">if</span>(minX>=maxX)</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     <span class="keywordflow">if</span>(minY>=maxY)</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span> </div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     minValue=(minX<minY)? minX:minY;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     maxValue=(maxX>maxY)? maxX:maxY;</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       std::cout << <span class="stringliteral">"min and max values: "</span> << minValue << <span class="stringliteral">", "</span> << maxValue << std::endl;</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     nbin=maxValue-minValue+1;</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       }</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       assert(nbin>1);</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="keywordtype">double</span> sigma=0;</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       <span class="comment">//kernel density estimation as in http://en.wikipedia.org/wiki/Kernel_density_estimation</span></div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       <span class="keywordflow">if</span>(kde_opt[0]){</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     assert(band_opt[0]<imgReader.nrOfBand());</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     assert(band_opt[1]<imgReader.nrOfBand());</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     GDALProgressFunc pfnProgress;</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     <span class="keywordtype">void</span>* pProgressData;</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     GDALRasterBand* rasterBand;</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     <span class="keywordtype">double</span> stdDev1=0;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     <span class="keywordtype">double</span> stdDev2=0;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     rasterBand=imgReader.getRasterBand(band_opt[0]);</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev1,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     rasterBand=imgReader.getRasterBand(band_opt[1]);</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev2,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span> </div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     <span class="keywordtype">double</span> estimatedSize=1.0*imgReader.getNvalid(band_opt[0])/down_opt[0]/down_opt[0];</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordflow">if</span>(random_opt[0]>0)</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       estimatedSize*=random_opt[0]/100.0;</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>         sigma=1.06*sqrt(stdDev1*stdDev2)*pow(estimatedSize,-0.2);</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       }</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       assert(nbin);</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="keywordflow">if</span>(sigma>0)</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       std::cout << <span class="stringliteral">"calculating 2d kernel density estimate with sigma "</span> << sigma << <span class="stringliteral">" for bands "</span> << band_opt[0] << <span class="stringliteral">" and "</span> << band_opt[1] << std::endl;</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       std::cout << <span class="stringliteral">"calculating 2d histogram for bands "</span> << band_opt[0] << <span class="stringliteral">" and "</span> << band_opt[1] << std::endl;</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     std::cout << <span class="stringliteral">"nbin: "</span> << nbin << std::endl;</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       }</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span> </div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span> </div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       vector< vector<double> > output;</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span> </div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">if</span>(maxX<=minX)</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       <span class="keywordflow">if</span>(maxY<=minY)</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span> </div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       <span class="keywordflow">if</span>(maxX<=minX){</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       }</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="keywordflow">if</span>(maxY<=minY){</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       }</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       output.resize(nbin);</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     output[i].resize(nbin);</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       output[i][j]=0;</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       }</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       <span class="keywordtype">int</span> binX=0;</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       <span class="keywordtype">int</span> binY=0;</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>       vector<double> inputX(imgReader.nrOfCol());</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       vector<double> inputY(imgReader.nrOfCol());</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nvalid=0;</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgReader.nrOfRow();++irow){</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>         <span class="keywordflow">if</span>(irow%down_opt[0])</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     imgReader.readData(inputX,GDT_Float64,irow,band_opt[0]);</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     imgReader.readData(inputY,GDT_Float64,irow,band_opt[1]);</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgReader.nrOfCol();++icol){</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>           <span class="keywordflow">if</span>(icol%down_opt[0])</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       <span class="keywordflow">if</span>(random_opt[0]>0){</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>         <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>         p*=100.0;</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         <span class="keywordflow">if</span>(p>random_opt[0])</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       }</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       <span class="keywordflow">if</span>(imgReader.isNoData(inputX[icol]))</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       <span class="keywordflow">if</span>(imgReader.isNoData(inputY[icol]))</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       ++nvalid;</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">if</span>(inputX[icol]>=maxX)</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         binX=nbin-1;</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputX[icol]<=minX)</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>         binX=0;</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>         binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[icol]-minX)/(maxX-minX)*nbin);</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       <span class="keywordflow">if</span>(inputY[icol]>=maxY)</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>         binY=nbin-1;</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputY[icol]<=minX)</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         binY=0;</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>         binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[icol]-minY)/(maxY-minY)*nbin);</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       assert(binX>=0);</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       assert(binX<output.size());</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       assert(binY>=0);</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       assert(binY<output[binX].size());</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       <span class="keywordflow">if</span>(sigma>0){</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>         <span class="comment">//create kde for Gaussian basis function</span></div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>         <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>           <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>           <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[icol]-centerX, sigma);</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>         <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>         <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>         <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[icol]-centerY, sigma);</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         output[ibinX][binY]+=pdfX*pdfY;</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>           }</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         }</div>
 <div class="line"><a name="l00484"></a><span class="lineno">  484</span>       }</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     cout << <span class="stringliteral">"number of valid pixels: "</span> << nvalid << endl;</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span> </div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     cout << endl;</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       <span class="keywordtype">double</span> binValueX=0;</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         binValueX=minX+binX;</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>         binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="keywordtype">double</span> binValueY=0;</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         binValueY=minY+binY;</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>         binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span> </div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       <span class="keywordtype">double</span> value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY]);</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       </div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>       <span class="keywordflow">if</span>(relative_opt[0])</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>         value*=100.0/nvalid;</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span> </div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       cout << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       <span class="comment">// double value=static_cast<double>(output[binX][binY])/nvalid;</span></div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       <span class="comment">// cout << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl;</span></div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>     }</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       }</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     }</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     <span class="keywordflow">if</span>(reg_opt[0]&&input_opt.size()<2){</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       <span class="keywordtype">double</span> r2=imgreg.getR2(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     }</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     <span class="keywordflow">if</span>(regerr_opt[0]&&input_opt.size()<2){</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>       imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -rmse "</span> << err << std::endl;</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     }</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     <span class="keywordflow">if</span>(rmse_opt[0]&&input_opt.size()<2){</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       std::cout << <span class="stringliteral">" -rmse "</span> << err << std::endl;</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     }</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">if</span>(preg_opt[0]&&input_opt.size()<2){</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordtype">double</span> r2=imgreg.pgetR2(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     }</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     imgReader.close();</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   }</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>   <span class="keywordflow">if</span>(reg_opt[0]&&(input_opt.size()>1)){</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       band_opt.push_back(band_opt[0]);</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     src_min_opt.push_back(src_min_opt[0]);</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     }</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     src_max_opt.push_back(src_max_opt[0]);</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     }</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span> </div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span> </div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       <span class="keywordflow">if</span>(!inodata){</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       }</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     }</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span> </div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     <span class="keywordtype">double</span> r2=imgreg.getR2(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     imgReader1.close();</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     imgReader2.close();</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   }</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   <span class="keywordflow">if</span>(preg_opt[0]&&(input_opt.size()>1)){</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>     imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       band_opt.push_back(band_opt[0]);</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     src_min_opt.push_back(src_min_opt[0]);</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     }</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     src_max_opt.push_back(src_max_opt[0]);</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     }</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span> </div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span> </div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       <span class="keywordflow">if</span>(!inodata){</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       }</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     }</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span> </div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="keywordtype">double</span> r2=imgreg.pgetR2(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     imgReader1.close();</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     imgReader2.close();</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>   }</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>   <span class="keywordflow">if</span>(regerr_opt[0]&&(input_opt.size()>1)){</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       band_opt.push_back(band_opt[0]);</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     src_min_opt.push_back(src_min_opt[0]);</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     }</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     src_max_opt.push_back(src_max_opt[0]);</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     }</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span> </div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span> </div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       <span class="keywordflow">if</span>(!inodata){</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       }</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     }</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span> </div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -rmse "</span> << err << std::endl;</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     imgReader1.close();</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     imgReader2.close();</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   }</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>   <span class="keywordflow">if</span>(rmse_opt[0]&&(input_opt.size()>1)){</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       band_opt.push_back(band_opt[0]);</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     src_min_opt.push_back(src_min_opt[0]);</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     }</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     src_max_opt.push_back(src_max_opt[0]);</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     }</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span> </div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span> </div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       <span class="keywordflow">if</span>(!inodata){</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       }</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     }</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span> </div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     std::cout << <span class="stringliteral">"-rmse "</span> << err << std::endl;</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     imgReader1.close();</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     imgReader2.close();</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>   }</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>   <span class="keywordflow">if</span>(histogram2d_opt[0]&&(input_opt.size()>1)){</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       band_opt.push_back(band_opt[0]);</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         ++output[binX][binY];</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     }</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       }</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     cout << <span class="stringliteral">"number of valid pixels: "</span> << nvalid << endl;</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span> </div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     cout << endl;</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       <span class="keywordtype">double</span> binValueX=0;</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         binValueX=minX+binX;</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>         binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       <span class="keywordtype">double</span> binValueY=0;</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>         binValueY=minY+binY;</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>         binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span> </div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       <span class="keywordtype">double</span> value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY]);</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       </div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       <span class="keywordflow">if</span>(relative_opt[0])</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>         value*=100.0/nvalid;</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span> </div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       cout << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       <span class="comment">// double value=static_cast<double>(output[binX][binY])/nvalid;</span></div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       <span class="comment">// cout << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl;</span></div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     }</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       }</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     }</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     <span class="keywordflow">if</span>(reg_opt[0]&&input_opt.size()<2){</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>       imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       <span class="keywordtype">double</span> r2=imgreg.getR2(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     }</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     <span class="keywordflow">if</span>(regerr_opt[0]&&input_opt.size()<2){</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -rmse "</span> << err << std::endl;</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>     }</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     <span class="keywordflow">if</span>(rmse_opt[0]&&input_opt.size()<2){</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       vector<double> xBuffer(imgReader.nrOfCol());</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       vector<double> yBuffer(imgReader.nrOfCol());</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       <span class="keywordtype">double</span> mse=0;</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>       <span class="keywordtype">double</span> nValid=0;</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       <span class="keywordtype">double</span> nPixel=imgReader.nrOfCol()/down_opt[0]*imgReader.nrOfRow()/down_opt[0];</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow;irow<imgReader.nrOfRow();irow+=down_opt[0]){</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     imgReader.readData(xBuffer,GDT_Float64,irow,band_opt[0]);</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     imgReader.readData(yBuffer,GDT_Float64,irow,band_opt[1]);</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol;icol<imgReader.nrOfCol();icol+=down_opt[0]){</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordtype">double</span> xValue=xBuffer[icol];</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordtype">double</span> yValue=yBuffer[icol];</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       <span class="keywordflow">if</span>(imgReader.isNoData(xValue)||imgReader.isNoData(yValue)){</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       }</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       <span class="keywordflow">if</span>(imgReader.isNoData(xValue)||imgReader.isNoData(yValue)){</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       }</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="keywordflow">if</span>(xValue<src_min_opt[0]||xValue>src_max_opt[0]||yValue<src_min_opt[0]||yValue>src_max_opt[0])</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       ++nValid;</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="keywordtype">double</span> e=xValue-yValue;</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="keywordflow">if</span>(relative_opt[0])</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         e/=yValue;</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       mse+=e*e/nPixel;</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     }</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       }</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       <span class="keywordtype">double</span> correctNorm=nValid;</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       correctNorm/=nPixel;</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       mse/=correctNorm;</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       std::cout << <span class="stringliteral">" -rmse "</span> << sqrt(mse) << std::endl;</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     }</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     <span class="keywordflow">if</span>(preg_opt[0]&&input_opt.size()<2){</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       <span class="keywordtype">double</span> r2=imgreg.pgetR2(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     }</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     imgReader.close();</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   }</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   <span class="comment">// if(rmse_opt[0]&&(input_opt.size()>1)){</span></div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   <span class="comment">//   while(band_opt.size()<input_opt.size())</span></div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>   <span class="comment">//     band_opt.push_back(band_opt[0]);</span></div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   <span class="comment">//   if(src_min_opt.size()){</span></div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   <span class="comment">//     while(src_min_opt.size()<input_opt.size())</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>   <span class="comment">//    src_min_opt.push_back(src_min_opt[0]);</span></div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>   <span class="comment">//   if(src_max_opt.size()){</span></div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   <span class="comment">//     while(src_max_opt.size()<input_opt.size())</span></div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   <span class="comment">//    src_max_opt.push_back(src_max_opt[0]);</span></div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   <span class="comment">//   ImgReaderGdal imgReader1(input_opt[0]);</span></div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   <span class="comment">//   ImgReaderGdal imgReader2(input_opt[1]);</span></div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span> </div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>   <span class="comment">//   if(offset_opt.size())</span></div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>   <span class="comment">//     imgReader1.setOffset(offset_opt[0],band_opt[0]);</span></div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>   <span class="comment">//   if(scale_opt.size())</span></div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>   <span class="comment">//     imgReader1.setScale(scale_opt[0],band_opt[0]);</span></div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>   <span class="comment">//   if(offset_opt.size()>1)</span></div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>   <span class="comment">//     imgReader2.setOffset(offset_opt[1],band_opt[1]);</span></div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>   <span class="comment">//   if(scale_opt.size()>1)</span></div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>   <span class="comment">//     imgReader2.setScale(scale_opt[1],band_opt[1]);</span></div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span> </div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>   <span class="comment">//   for(int inodata=0;inodata<nodata_opt.size();++inodata){</span></div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>   <span class="comment">//     imgReader1.pushNoDataValue(nodata_opt[inodata]);</span></div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>   <span class="comment">//     imgReader2.pushNoDataValue(nodata_opt[inodata]);</span></div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>   <span class="comment">//   vector<double> xBuffer(imgReader1.nrOfCol());</span></div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>   <span class="comment">//   vector<double> yBuffer(imgReader2.nrOfCol());</span></div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>   <span class="comment">//   double mse=0;</span></div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>   <span class="comment">//   double nValid=0;</span></div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>   <span class="comment">//   double nPixel=imgReader.nrOfCol()/imgReader.nrOfRow()/down_opt[0]/down_opt[0];</span></div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>   <span class="comment">//   for(int irow;irow<imgReader1.nrOfRow();irow+=down_opt[0]){</span></div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>   <span class="comment">//     double irow1=irow;</span></div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>   <span class="comment">//     double irow2=0;</span></div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>   <span class="comment">//     double icol1=0;</span></div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>   <span class="comment">//     double icol2=0;</span></div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>   <span class="comment">//     double geoX=0;</span></div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>   <span class="comment">//     double geoY=0;</span></div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>   <span class="comment">//     imgReader1.image2geo(icol1,irow1,geoX,geoY);</span></div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>   <span class="comment">//     imgReader2.geo2image(geoX,geoY,icol2,irow2);</span></div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>   <span class="comment">//     irow2=static_cast<int>(irow2);</span></div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>   <span class="comment">//     imgReader1.readData(xBuffer,GDT_Float64,irow1,band_opt[0]);</span></div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>   <span class="comment">//     imgReader2.readData(yBuffer,GDT_Float64,irow2,band_opt[1]);</span></div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   <span class="comment">//     for(int icol;icol<imgReader.nrOfCol();icol+=down_opt[0]){</span></div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   <span class="comment">//    icol1=icol;</span></div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>   <span class="comment">//    imgReader1.image2geo(icol1,irow1,geoX,geoY);</span></div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>   <span class="comment">//    imgReader2.geo2image(geoX,geoY,icol2,irow2);</span></div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>   <span class="comment">//    double xValue=xBuffer[icol1];</span></div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>   <span class="comment">//    double yValue=yBuffer[icol2];</span></div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>   <span class="comment">//    if(imgReader.isNoData(xValue)||imgReader.isNoData(yValue)){</span></div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>   <span class="comment">//      continue;</span></div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>   <span class="comment">//    }</span></div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>   <span class="comment">//    if(xValue<src_min_opt[0]||xValue>src_max_opt[0]||yValue<src_min_opt[1]||yValue>src_max_opt[1])</span></div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>   <span class="comment">//      continue;</span></div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>   <span class="comment">//    ++nValid;</span></div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   <span class="comment">//    double e=xValue-yValue;</span></div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>   <span class="comment">//    if(relative_opt[0])</span></div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   <span class="comment">//      e/=yValue;</span></div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   <span class="comment">//    mse+=e*e/nPixel;</span></div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>   <span class="comment">//     }</span></div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>   <span class="comment">//   double correctNorm=nValid;</span></div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>   <span class="comment">//   correctNorm/=nPixel;</span></div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>   <span class="comment">//   mse/=correctNorm;</span></div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>   <span class="comment">//   std::cout << " -rmse " << sqrt(mse) << std::endl;</span></div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>   <span class="keywordflow">if</span>(reg_opt[0]&&(input_opt.size()>1)){</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       band_opt.push_back(band_opt[0]);</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>     }</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     src_max_opt.push_back(src_max_opt[0]);</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     }</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span> </div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span> </div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       <span class="keywordflow">if</span>(!inodata){</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       }</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     }</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span> </div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     <span class="keywordtype">double</span> r2=imgreg.getR2(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     imgReader1.close();</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     imgReader2.close();</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   }</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>   <span class="keywordflow">if</span>(preg_opt[0]&&(input_opt.size()>1)){</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       band_opt.push_back(band_opt[0]);</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>     }</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     src_max_opt.push_back(src_max_opt[0]);</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     }</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span> </div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span> </div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>       <span class="keywordflow">if</span>(!inodata){</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>       }</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
 <div class="line"><a name="l00725"></a><span class="lineno">  725</span>     }</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     src_max_opt.push_back(src_max_opt[0]);</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     }</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span> </div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span> </div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>       <span class="keywordflow">if</span>(!inodata){</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>       }</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     }</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span> </div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>     imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span> </div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       cout << <span class="stringliteral">"minX: "</span> << minX << endl;</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       cout << <span class="stringliteral">"maxX: "</span> << maxX << endl;</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       cout << <span class="stringliteral">"minY: "</span> << minY << endl;</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>       cout << <span class="stringliteral">"maxY: "</span> << maxY << endl;</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>     }</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       </div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>       minX=src_min_opt[0];</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       minY=src_min_opt[1];</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>     }</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       maxX=src_max_opt[0];</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>       maxY=src_max_opt[1];</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     }</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span> </div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>     <span class="keywordflow">if</span>(nbin<=1){</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       std::cerr << <span class="stringliteral">"Warning: number of bins not defined, calculating bins from min and max value"</span> << std::endl;</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       <span class="comment">// imgReader1.getMinMax(minX,maxX,band_opt[0]);</span></div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       <span class="comment">// imgReader2.getMinMax(minY,maxY,band_opt[0]);</span></div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>       <span class="keywordflow">if</span>(minX>=maxX)</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>       <span class="keywordflow">if</span>(minY>=maxY)</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       </div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       minValue=(minX<minY)? minX:minY;</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       maxValue=(maxX>maxY)? maxX:maxY;</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>         std::cout << <span class="stringliteral">"min and max values: "</span> << minValue << <span class="stringliteral">", "</span> << maxValue << std::endl;</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       nbin=maxValue-minValue+1;</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>     }</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     assert(nbin>1);</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     <span class="keywordtype">double</span> sigma=0;</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     <span class="comment">//kernel density estimation as in http://en.wikipedia.org/wiki/Kernel_density_estimation</span></div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     <span class="keywordflow">if</span>(kde_opt[0]){</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       GDALProgressFunc pfnProgress;</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>       <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       <span class="keywordtype">double</span> stdDev1=0;</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       <span class="keywordtype">double</span> stdDev2=0;</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       rasterBand=imgReader1.getRasterBand(band_opt[0]);</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev1,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       rasterBand=imgReader2.getRasterBand(band_opt[0]);</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev2,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       </div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       <span class="comment">//todo: think of smarter way how to estimate size (nodata!)</span></div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       <span class="keywordtype">double</span> estimatedSize=1.0*imgReader.getNvalid(band_opt[0])/down_opt[0]/down_opt[0];</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       <span class="keywordflow">if</span>(random_opt[0]>0)</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     estimatedSize*=random_opt[0]/100.0;</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       sigma=1.06*sqrt(stdDev1*stdDev2)*pow(estimatedSize,-0.2);</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     }</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     assert(nbin);</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       <span class="keywordflow">if</span>(sigma>0)</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>     std::cout << <span class="stringliteral">"calculating 2d kernel density estimate with sigma "</span> << sigma << <span class="stringliteral">" for datasets "</span> << input_opt[0] << <span class="stringliteral">" and "</span> << input_opt[1] << std::endl;</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>     std::cout << <span class="stringliteral">"calculating 2d histogram for datasets "</span> << input_opt[0] << <span class="stringliteral">" and "</span> << input_opt[1] << std::endl;</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       std::cout << <span class="stringliteral">"nbin: "</span> << nbin << std::endl;</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     }</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span> </div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     vector< vector<double> > output;</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span> </div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     <span class="keywordflow">if</span>(maxX<=minX)</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     <span class="keywordflow">if</span>(maxY<=minY)</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span> </div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>     <span class="keywordflow">if</span>(maxX<=minX){</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     }</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     <span class="keywordflow">if</span>(maxY<=minY){</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>     }</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       cout << <span class="stringliteral">"minX: "</span> << minX << endl;</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       cout << <span class="stringliteral">"maxX: "</span> << maxX << endl;</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       cout << <span class="stringliteral">"minY: "</span> << minY << endl;</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>       cout << <span class="stringliteral">"maxY: "</span> << maxY << endl;</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     }</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     output.resize(nbin);</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>       output[i].resize(nbin);</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     output[i][j]=0;</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     }</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     <span class="keywordtype">int</span> binX=0;</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     <span class="keywordtype">int</span> binY=0;</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     vector<double> inputX(imgReader1.nrOfCol());</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     vector<double> inputY(imgReader2.nrOfCol());</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     <span class="keywordtype">double</span> nvalid=0;</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     <span class="keywordtype">double</span> geoX=0;</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     <span class="keywordtype">double</span> geoY=0;</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     <span class="keywordtype">double</span> icol1=0;</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <span class="keywordtype">double</span> irow1=0;</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     <span class="keywordtype">double</span> icol2=0;</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     <span class="keywordtype">double</span> irow2=0;</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgReader1.nrOfRow();++irow){</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>       <span class="keywordflow">if</span>(irow%down_opt[0])</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       irow1=irow;</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       imgReader1.image2geo(icol1,irow1,geoX,geoY);</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>       imgReader2.geo2image(geoX,geoY,icol2,irow2);</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       irow2=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(irow2);</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       imgReader1.readData(inputX,GDT_Float64,irow1,band_opt[0]);</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       imgReader2.readData(inputY,GDT_Float64,irow2,band_opt[1]);</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgReader.nrOfCol();++icol){</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     <span class="keywordflow">if</span>(icol%down_opt[0])</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>     icol1=icol;</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>     <span class="keywordflow">if</span>(random_opt[0]>0){</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       p*=100.0;</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       <span class="keywordflow">if</span>(p>random_opt[0])</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>         <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>     }</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     <span class="keywordflow">if</span>(imgReader1.isNoData(inputX[icol]))</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>     imgReader1.image2geo(icol1,irow1,geoX,geoY);</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>     imgReader2.geo2image(geoX,geoY,icol2,irow2);</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     icol2=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(icol2);</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>     <span class="keywordflow">if</span>(imgReader2.isNoData(inputY[icol2]))</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>     <span class="comment">// ++nvalid;</span></div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     <span class="keywordflow">if</span>(inputX[icol1]>=maxX)</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       binX=nbin-1;</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputX[icol]<=minX)</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       binX=0;</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[icol1]-minX)/(maxX-minX)*nbin);</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>     <span class="keywordflow">if</span>(inputY[icol2]>=maxY)</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       binY=nbin-1;</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputY[icol2]<=minY)</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       binY=0;</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[icol2]-minY)/(maxY-minY)*nbin);</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>     assert(binX>=0);</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>     assert(binX<output.size());</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>     assert(binY>=0);</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>     assert(binY<output[binX].size());</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>     <span class="keywordflow">if</span>(sigma>0){</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>         <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>         <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[icol1]-centerX, sigma);</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>           <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>           <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>           <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[icol2]-centerY, sigma);</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>           output[ibinX][binY]+=pdfX*pdfY;</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>           nvalid+=pdfX*pdfY;</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>         }</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       }</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>     }</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       ++output[binX][binY];</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       ++nvalid;</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>     }</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       }</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>     }</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       cout << <span class="stringliteral">"number of valid pixels: "</span> << nvalid << endl;</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       cout << endl;</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>     <span class="keywordtype">double</span> binValueX=0;</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       binValueX=minX+binX;</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>     <span class="keywordtype">double</span> binValueY=0;</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>     <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       binValueY=minY+binY;</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     <span class="keywordtype">double</span> value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY]);</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       </div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     <span class="keywordflow">if</span>(relative_opt[0]||kde_opt[0])</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       value*=100.0/nvalid;</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span> </div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>     cout << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     <span class="comment">// double value=static_cast<double>(output[binX][binY])/nvalid;</span></div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     <span class="comment">// cout << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl;</span></div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       }</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>     }</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     imgReader1.close();</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     imgReader2.close();</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>   }</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span> </div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>   <span class="keywordflow">if</span>(!histogram_opt[0]||histogram2d_opt[0])</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>     std::cout << std::endl;</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span> }</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>   </div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span> <span class="comment">// int nband=(band_opt.size()) ? band_opt.size() : imgReader.nrOfBand();</span></div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span> </div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span> <span class="comment">// const char* pszMessage;</span></div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span> <span class="comment">// void* pProgressArg=NULL;</span></div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span> <span class="comment">// GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span> <span class="comment">// double progress=0;</span></div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span> <span class="comment">// srand(time(NULL));</span></div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span> </div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span> </div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span> <span class="comment">// statfactory::StatFactory stat;</span></div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span> <span class="comment">// imgregression::ImgRegression imgreg;</span></div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span> </div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span> <span class="comment">// pfnProgress(progress,pszMessage,pProgressArg);</span></div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span> <span class="comment">// for(irow=0;irow<classReader.nrOfRow();++irow){</span></div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span> <span class="comment">//   if(irow%down_opt[0])</span></div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span> <span class="comment">//     continue;</span></div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span> <span class="comment">//   // classReader.readData(classBuffer,GDT_Int32,irow);</span></div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span> <span class="comment">//   classReader.readData(classBuffer,GDT_Float64,irow);</span></div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span> <span class="comment">//   double x,y;//geo coordinates</span></div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span> <span class="comment">//   double iimg,jimg;//image coordinates in img image</span></div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span> <span class="comment">//   for(icol=0;icol<classReader.nrOfCol();++icol){</span></div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span> <span class="comment">//     if(icol%down_opt[0])</span></div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>   <span class="comment">//    continue;</span></div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span> </div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span> </div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>   <span class="comment">// if(rand_opt[0]>0){</span></div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>   <span class="comment">//   gsl_rng* r=stat.getRandomGenerator(time(NULL));</span></div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>   <span class="comment">//   //todo: init random number generator using time...</span></div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>   <span class="comment">//   if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>   <span class="comment">//     std::cout << "generating " << rand_opt[0] << " random numbers: " << std::endl;</span></div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>   <span class="comment">//   for(unsigned int i=0;i<rand_opt[0];++i)</span></div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>   <span class="comment">//     std::cout << i << " " << stat.getRandomValue(r,randdist_opt[0],randa_opt[0],randb_opt[0]) << std::endl;</span></div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span> </div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>   <span class="comment">// imgreg.setDown(down_opt[0]);</span></div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>   <span class="comment">// imgreg.setThreshold(threshold_opt[0]);</span></div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>   <span class="comment">// double c0=0;//offset</span></div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>   <span class="comment">// double c1=1;//scale</span></div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>   <span class="comment">// double err=uncertNodata_opt[0];//start with high initial value in case we do not have first ob err=imgreg.getRMSE(imgReaderModel1,imgReader,c0,c1,verbose_opt[0]);</span></div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span> </div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>   <span class="comment">//   int nband=band_opt.size();</span></div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>   <span class="comment">//   if(band_opt[0]<0)</span></div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>   <span class="comment">//     nband=imgReader.nrOfBand();</span></div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>   <span class="comment">//   for(int iband=0;iband<nband;++iband){</span></div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>   <span class="comment">//     unsigned short band_opt[iband]=(band_opt[0]<0)? iband : band_opt[iband];</span></div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span> </div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>   <span class="comment">//     if(minmax_opt[0]||min_opt[0]||max_opt[0]){</span></div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>   <span class="comment">//    assert(band_opt[iband]<imgReader.nrOfBand());</span></div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>   <span class="comment">//    if((ulx_opt.size()||uly_opt.size()||lrx_opt.size()||lry_opt.size())&&(imgReader.covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</span></div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>   <span class="comment">//      double uli,ulj,lri,lrj;</span></div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>   <span class="comment">//      imgReader.geo2image(ulx_opt[0],uly_opt[0],uli,ulj);</span></div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>   <span class="comment">//      imgReader.geo2image(lrx_opt[0],lry_opt[0],lri,lrj);</span></div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>   <span class="comment">//      imgReader.getMinMax(static_cast<int>(uli),static_cast<int>(lri),static_cast<int>(ulj),static_cast<int>(lrj),band_opt[iband],minValue,maxValue);</span></div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>   <span class="comment">//    }</span></div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>   <span class="comment">//    else</span></div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>   <span class="comment">//      imgReader.getMinMax(minValue,maxValue,band_opt[iband],true);</span></div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>   <span class="comment">//    if(minmax_opt[0])</span></div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>   <span class="comment">//      std::cout << "-min " << minValue << " -max " << maxValue << " ";</span></div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>   <span class="comment">//    else{</span></div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>   <span class="comment">//      if(min_opt[0])</span></div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>   <span class="comment">//        std::cout << "-min " << minValue << " ";</span></div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>   <span class="comment">//      if(max_opt[0])</span></div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>   <span class="comment">//        std::cout << "-max " << maxValue << " ";</span></div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>   <span class="comment">//    }</span></div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>   <span class="comment">//     }</span></div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>   <span class="comment">//   if(relative_opt[0])</span></div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>   <span class="comment">//     hist_opt[0]=true;</span></div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>   <span class="comment">//   if(hist_opt[0]){</span></div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>   <span class="comment">//     assert(band_opt[0]<imgReader.nrOfBand());</span></div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>   <span class="comment">//     unsigned int nbin=(nbin_opt.size())? nbin_opt[0]:0;</span></div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>   <span class="comment">//     std::vector<unsigned long int> output;</span></div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>   <span class="comment">//     minValue=0;</span></div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>   <span class="comment">//     maxValue=0;</span></div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>   <span class="comment">//     //todo: optimize such that getMinMax is only called once...</span></div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>   <span class="comment">//     imgReader.getMinMax(minValue,maxValue,band_opt[0]);</span></div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>       </div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>   <span class="comment">//     if(src_min_opt.size())</span></div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>   <span class="comment">//       minValue=src_min_opt[0];</span></div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>   <span class="comment">//     if(src_max_opt.size())</span></div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>   <span class="comment">//       maxValue=src_max_opt[0];</span></div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>   <span class="comment">//     unsigned long int nsample=imgReader.getHistogram(output,minValue,maxValue,nbin,band_opt[0]);</span></div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>   <span class="comment">//     std::cout.precision(10);</span></div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>   <span class="comment">//     for(int bin=0;bin<nbin;++bin){</span></div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>   <span class="comment">//    double binValue=0;</span></div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>   <span class="comment">//    if(nbin==maxValue-minValue+1)</span></div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>   <span class="comment">//      binValue=minValue+bin;</span></div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>   <span class="comment">//    else</span></div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>   <span class="comment">//      binValue=minValue+static_cast<double>(maxValue-minValue)*(bin+0.5)/nbin;</span></div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>   <span class="comment">//    std::cout << binValue << " ";</span></div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>   <span class="comment">//    if(relative_opt[0])</span></div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>   <span class="comment">//      std::cout << 100.0*static_cast<double>(output[bin])/static_cast<double>(nsample) << std::endl;</span></div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>   <span class="comment">//    else</span></div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>   <span class="comment">//      std::cout << static_cast<double>(output[bin]) << std::endl;</span></div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>   <span class="comment">//     }</span></div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span> </div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>     <span class="keywordtype">double</span> r2=imgreg.pgetR2(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     imgReader1.close();</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     imgReader2.close();</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>   }</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>   <span class="keywordflow">if</span>(regerr_opt[0]&&(input_opt.size()>1)){</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       band_opt.push_back(band_opt[0]);</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     }</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>     src_max_opt.push_back(src_max_opt[0]);</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     }</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span> </div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span> </div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       <span class="keywordflow">if</span>(!inodata){</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       }</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>     }</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span> </div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -rmse "</span> << err << std::endl;</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     imgReader1.close();</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>     imgReader2.close();</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>   }</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>   <span class="keywordflow">if</span>(rmse_opt[0]&&(input_opt.size()>1)){</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>     imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       band_opt.push_back(band_opt[0]);</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>     }</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     src_max_opt.push_back(src_max_opt[0]);</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     }</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span> </div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span> </div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       <span class="keywordflow">if</span>(!inodata){</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       }</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>     }</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span> </div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>     <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     std::cout << <span class="stringliteral">"-rmse "</span> << err << std::endl;</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>     imgReader1.close();</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     imgReader2.close();</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>   }</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>   <span class="keywordflow">if</span>(histogram2d_opt[0]&&(input_opt.size()>1)){</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       band_opt.push_back(band_opt[0]);</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     }</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     src_max_opt.push_back(src_max_opt[0]);</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     }</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span> </div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span> </div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>       <span class="keywordflow">if</span>(!inodata){</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       }</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     }</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span> </div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span> </div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       cout << <span class="stringliteral">"minX: "</span> << minX << endl;</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>       cout << <span class="stringliteral">"maxX: "</span> << maxX << endl;</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>       cout << <span class="stringliteral">"minY: "</span> << minY << endl;</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>       cout << <span class="stringliteral">"maxY: "</span> << maxY << endl;</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     }</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>       </div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       minX=src_min_opt[0];</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       minY=src_min_opt[1];</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     }</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       maxX=src_max_opt[0];</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       maxY=src_max_opt[1];</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>     }</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span> </div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>     <span class="keywordflow">if</span>(nbin<=1){</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       std::cerr << <span class="stringliteral">"Warning: number of bins not defined, calculating bins from min and max value"</span> << std::endl;</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <span class="comment">// imgReader1.getMinMax(minX,maxX,band_opt[0]);</span></div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       <span class="comment">// imgReader2.getMinMax(minY,maxY,band_opt[0]);</span></div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       <span class="keywordflow">if</span>(minX>=maxX)</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>     imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       <span class="keywordflow">if</span>(minY>=maxY)</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>     imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>       </div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       minValue=(minX<minY)? minX:minY;</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       maxValue=(maxX>maxY)? maxX:maxY;</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>         std::cout << <span class="stringliteral">"min and max values: "</span> << minValue << <span class="stringliteral">", "</span> << maxValue << std::endl;</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       nbin=maxValue-minValue+1;</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>     }</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>     assert(nbin>1);</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     <span class="keywordtype">double</span> sigma=0;</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>     <span class="comment">//kernel density estimation as in http://en.wikipedia.org/wiki/Kernel_density_estimation</span></div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>     <span class="keywordflow">if</span>(kde_opt[0]){</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       GDALProgressFunc pfnProgress;</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       <span class="keywordtype">void</span>* pProgressData;</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       GDALRasterBand* rasterBand;</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>       <span class="keywordtype">double</span> stdDev1=0;</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       <span class="keywordtype">double</span> stdDev2=0;</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>       rasterBand=imgReader1.getRasterBand(band_opt[0]);</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev1,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>       rasterBand=imgReader2.getRasterBand(band_opt[0]);</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev2,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       </div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>       <span class="comment">//todo: think of smarter way how to estimate size (nodata!)</span></div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>       <span class="keywordtype">double</span> estimatedSize=1.0*imgReader.getNvalid(band_opt[0])/down_opt[0]/down_opt[0];</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>       <span class="keywordflow">if</span>(random_opt[0]>0)</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>     estimatedSize*=random_opt[0]/100.0;</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       sigma=1.06*sqrt(stdDev1*stdDev2)*pow(estimatedSize,-0.2);</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>     }</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>     assert(nbin);</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       <span class="keywordflow">if</span>(sigma>0)</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>     std::cout << <span class="stringliteral">"calculating 2d kernel density estimate with sigma "</span> << sigma << <span class="stringliteral">" for datasets "</span> << input_opt[0] << <span class="stringliteral">" and "</span> << input_opt[1] << std::endl;</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>     std::cout << <span class="stringliteral">"calculating 2d histogram for datasets "</span> << input_opt[0] << <span class="stringliteral">" and "</span> << input_opt[1] << std::endl;</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       std::cout << <span class="stringliteral">"nbin: "</span> << nbin << std::endl;</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>     }</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span> </div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>     vector< vector<double> > output;</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span> </div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>     <span class="keywordflow">if</span>(maxX<=minX)</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>     <span class="keywordflow">if</span>(maxY<=minY)</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span> </div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>     <span class="keywordflow">if</span>(maxX<=minX){</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     }</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>     <span class="keywordflow">if</span>(maxY<=minY){</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>       s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>     }</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       cout << <span class="stringliteral">"minX: "</span> << minX << endl;</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       cout << <span class="stringliteral">"maxX: "</span> << maxX << endl;</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       cout << <span class="stringliteral">"minY: "</span> << minY << endl;</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       cout << <span class="stringliteral">"maxY: "</span> << maxY << endl;</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     }</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>     output.resize(nbin);</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       output[i].resize(nbin);</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>     output[i][j]=0;</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>     }</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>     <span class="keywordtype">int</span> binX=0;</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     <span class="keywordtype">int</span> binY=0;</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     vector<double> inputX(imgReader1.nrOfCol());</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     vector<double> inputY(imgReader2.nrOfCol());</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>     <span class="keywordtype">double</span> nvalid=0;</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     <span class="keywordtype">double</span> geoX=0;</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     <span class="keywordtype">double</span> geoY=0;</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>     <span class="keywordtype">double</span> icol1=0;</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>     <span class="keywordtype">double</span> irow1=0;</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>     <span class="keywordtype">double</span> icol2=0;</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>     <span class="keywordtype">double</span> irow2=0;</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgReader1.nrOfRow();++irow){</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       <span class="keywordflow">if</span>(irow%down_opt[0])</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>       irow1=irow;</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>       imgReader1.image2geo(icol1,irow1,geoX,geoY);</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       imgReader2.geo2image(geoX,geoY,icol2,irow2);</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       irow2=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(irow2);</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       imgReader1.readData(inputX,GDT_Float64,irow1,band_opt[0]);</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       imgReader2.readData(inputY,GDT_Float64,irow2,band_opt[1]);</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgReader.nrOfCol();++icol){</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>     <span class="keywordflow">if</span>(icol%down_opt[0])</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     icol1=icol;</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>     <span class="keywordflow">if</span>(random_opt[0]>0){</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>       p*=100.0;</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       <span class="keywordflow">if</span>(p>random_opt[0])</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>         <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     }</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>     <span class="keywordflow">if</span>(imgReader1.isNoData(inputX[icol]))</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>     imgReader1.image2geo(icol1,irow1,geoX,geoY);</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>     imgReader2.geo2image(geoX,geoY,icol2,irow2);</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>     icol2=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(icol2);</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>     <span class="keywordflow">if</span>(imgReader2.isNoData(inputY[icol2]))</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>     <span class="comment">// ++nvalid;</span></div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>     <span class="keywordflow">if</span>(inputX[icol1]>=maxX)</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>       binX=nbin-1;</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputX[icol]<=minX)</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>       binX=0;</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>       binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[icol1]-minX)/(maxX-minX)*nbin);</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>     <span class="keywordflow">if</span>(inputY[icol2]>=maxY)</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>       binY=nbin-1;</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputY[icol2]<=minY)</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>       binY=0;</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>       binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[icol2]-minY)/(maxY-minY)*nbin);</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>     assert(binX>=0);</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>     assert(binX<output.size());</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     assert(binY>=0);</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>     assert(binY<output[binX].size());</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     <span class="keywordflow">if</span>(sigma>0){</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>         <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>         <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[icol1]-centerX, sigma);</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>           <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>           <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>           <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[icol2]-centerY, sigma);</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>           output[ibinX][binY]+=pdfX*pdfY;</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>           nvalid+=pdfX*pdfY;</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>         }</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>       }</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>     }</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       ++output[binX][binY];</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>       ++nvalid;</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>     }</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>       }</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>     }</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       cout << <span class="stringliteral">"number of valid pixels: "</span> << nvalid << endl;</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       cout << endl;</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>     <span class="keywordtype">double</span> binValueX=0;</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>     <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>       binValueX=minX+binX;</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>     <span class="keywordtype">double</span> binValueY=0;</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>       binValueY=minY+binY;</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>       binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     <span class="keywordtype">double</span> value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY]);</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>       </div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     <span class="keywordflow">if</span>(relative_opt[0]||kde_opt[0])</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>       value*=100.0/nvalid;</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span> </div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>     cout << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>     <span class="comment">// double value=static_cast<double>(output[binX][binY])/nvalid;</span></div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     <span class="comment">// cout << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl;</span></div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       }</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>     }</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>     imgReader1.close();</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>     imgReader2.close();</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>   }</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span> </div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>   <span class="keywordflow">if</span>(!histogram_opt[0]||histogram2d_opt[0])</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>     std::cout << std::endl;</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span> }</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>   </div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span> <span class="comment">// int nband=(band_opt.size()) ? band_opt.size() : imgReader.nrOfBand();</span></div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span> </div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span> <span class="comment">// const char* pszMessage;</span></div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span> <span class="comment">// void* pProgressArg=NULL;</span></div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span> <span class="comment">// GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span> <span class="comment">// double progress=0;</span></div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span> <span class="comment">// srand(time(NULL));</span></div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span> </div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span> </div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span> <span class="comment">// statfactory::StatFactory stat;</span></div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span> <span class="comment">// imgregression::ImgRegression imgreg;</span></div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span> </div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span> <span class="comment">// pfnProgress(progress,pszMessage,pProgressArg);</span></div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span> <span class="comment">// for(irow=0;irow<classReader.nrOfRow();++irow){</span></div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span> <span class="comment">//   if(irow%down_opt[0])</span></div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span> <span class="comment">//     continue;</span></div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span> <span class="comment">//   // classReader.readData(classBuffer,GDT_Int32,irow);</span></div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span> <span class="comment">//   classReader.readData(classBuffer,GDT_Float64,irow);</span></div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span> <span class="comment">//   double x,y;//geo coordinates</span></div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span> <span class="comment">//   double iimg,jimg;//image coordinates in img image</span></div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span> <span class="comment">//   for(icol=0;icol<classReader.nrOfCol();++icol){</span></div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span> <span class="comment">//     if(icol%down_opt[0])</span></div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>   <span class="comment">//    continue;</span></div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span> </div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> </div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>   <span class="comment">// if(rand_opt[0]>0){</span></div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>   <span class="comment">//   gsl_rng* r=stat.getRandomGenerator(time(NULL));</span></div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>   <span class="comment">//   //todo: init random number generator using time...</span></div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>   <span class="comment">//   if(verbose_opt[0])</span></div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>   <span class="comment">//     std::cout << "generating " << rand_opt[0] << " random numbers: " << std::endl;</span></div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>   <span class="comment">//   for(unsigned int i=0;i<rand_opt[0];++i)</span></div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>   <span class="comment">//     std::cout << i << " " << stat.getRandomValue(r,randdist_opt[0],randa_opt[0],randb_opt[0]) << std::endl;</span></div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span> </div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>   <span class="comment">// imgreg.setDown(down_opt[0]);</span></div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>   <span class="comment">// imgreg.setThreshold(threshold_opt[0]);</span></div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>   <span class="comment">// double c0=0;//offset</span></div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>   <span class="comment">// double c1=1;//scale</span></div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>   <span class="comment">// double err=uncertNodata_opt[0];//start with high initial value in case we do not have first ob err=imgreg.getRMSE(imgReaderModel1,imgReader,c0,c1,verbose_opt[0]);</span></div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span> </div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>   <span class="comment">//   int nband=band_opt.size();</span></div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>   <span class="comment">//   if(band_opt[0]<0)</span></div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>   <span class="comment">//     nband=imgReader.nrOfBand();</span></div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>   <span class="comment">//   for(int iband=0;iband<nband;++iband){</span></div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>   <span class="comment">//     unsigned short band_opt[iband]=(band_opt[0]<0)? iband : band_opt[iband];</span></div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span> </div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>   <span class="comment">//     if(minmax_opt[0]||min_opt[0]||max_opt[0]){</span></div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>   <span class="comment">//    assert(band_opt[iband]<imgReader.nrOfBand());</span></div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>   <span class="comment">//    if((ulx_opt.size()||uly_opt.size()||lrx_opt.size()||lry_opt.size())&&(imgReader.covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</span></div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>   <span class="comment">//      double uli,ulj,lri,lrj;</span></div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>   <span class="comment">//      imgReader.geo2image(ulx_opt[0],uly_opt[0],uli,ulj);</span></div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>   <span class="comment">//      imgReader.geo2image(lrx_opt[0],lry_opt[0],lri,lrj);</span></div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>   <span class="comment">//      imgReader.getMinMax(static_cast<int>(uli),static_cast<int>(lri),static_cast<int>(ulj),static_cast<int>(lrj),band_opt[iband],minValue,maxValue);</span></div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>   <span class="comment">//    }</span></div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>   <span class="comment">//    else</span></div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>   <span class="comment">//      imgReader.getMinMax(minValue,maxValue,band_opt[iband],true);</span></div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>   <span class="comment">//    if(minmax_opt[0])</span></div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>   <span class="comment">//      std::cout << "-min " << minValue << " -max " << maxValue << " ";</span></div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>   <span class="comment">//    else{</span></div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>   <span class="comment">//      if(min_opt[0])</span></div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>   <span class="comment">//        std::cout << "-min " << minValue << " ";</span></div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>   <span class="comment">//      if(max_opt[0])</span></div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>   <span class="comment">//        std::cout << "-max " << maxValue << " ";</span></div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>   <span class="comment">//    }</span></div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>   <span class="comment">//     }</span></div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>   <span class="comment">//   if(relative_opt[0])</span></div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>   <span class="comment">//     hist_opt[0]=true;</span></div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>   <span class="comment">//   if(hist_opt[0]){</span></div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>   <span class="comment">//     assert(band_opt[0]<imgReader.nrOfBand());</span></div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>   <span class="comment">//     unsigned int nbin=(nbin_opt.size())? nbin_opt[0]:0;</span></div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>   <span class="comment">//     std::vector<unsigned long int> output;</span></div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>   <span class="comment">//     minValue=0;</span></div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>   <span class="comment">//     maxValue=0;</span></div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>   <span class="comment">//     //todo: optimize such that getMinMax is only called once...</span></div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>   <span class="comment">//     imgReader.getMinMax(minValue,maxValue,band_opt[0]);</span></div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>       </div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>   <span class="comment">//     if(src_min_opt.size())</span></div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>   <span class="comment">//       minValue=src_min_opt[0];</span></div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>   <span class="comment">//     if(src_max_opt.size())</span></div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>   <span class="comment">//       maxValue=src_max_opt[0];</span></div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>   <span class="comment">//     unsigned long int nsample=imgReader.getHistogram(output,minValue,maxValue,nbin,band_opt[0]);</span></div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>   <span class="comment">//     std::cout.precision(10);</span></div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>   <span class="comment">//     for(int bin=0;bin<nbin;++bin){</span></div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>   <span class="comment">//    double binValue=0;</span></div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>   <span class="comment">//    if(nbin==maxValue-minValue+1)</span></div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>   <span class="comment">//      binValue=minValue+bin;</span></div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>   <span class="comment">//    else</span></div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>   <span class="comment">//      binValue=minValue+static_cast<double>(maxValue-minValue)*(bin+0.5)/nbin;</span></div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>   <span class="comment">//    std::cout << binValue << " ";</span></div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>   <span class="comment">//    if(relative_opt[0])</span></div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>   <span class="comment">//      std::cout << 100.0*static_cast<double>(output[bin])/static_cast<double>(nsample) << std::endl;</span></div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>   <span class="comment">//    else</span></div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>   <span class="comment">//      std::cout << static_cast<double>(output[bin]) << std::endl;</span></div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>   <span class="comment">//     }</span></div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>   <span class="comment">//   }</span></div>
 <div class="ttc" id="classimgregression_1_1ImgRegression_html"><div class="ttname"><a href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgRegression_8h_source.html#l00030">ImgRegression.h:30</a></div></div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstatascii.html b/doc/html/pkstatascii.html
index 55d290d..482597b 100644
--- a/doc/html/pkstatascii.html
+++ b/doc/html/pkstatascii.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -133,7 +133,7 @@ Usage: pkstatascii -i input [-c column]* </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstatascii_8cc_source.html b/doc/html/pkstatascii_8cc_source.html
index e8386dd..c618b12 100644
--- a/doc/html/pkstatascii_8cc_source.html
+++ b/doc/html/pkstatascii_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -472,7 +472,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstatogr.html b/doc/html/pkstatogr.html
index e82a1b1..5273325 100644
--- a/doc/html/pkstatogr.html
+++ b/doc/html/pkstatogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -101,7 +101,7 @@ Usage: pkstatogr -i input [-n attribute]*</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstatogr_8cc_source.html b/doc/html/pkstatogr_8cc_source.html
index 25ae76b..1899faf 100644
--- a/doc/html/pkstatogr_8cc_source.html
+++ b/doc/html/pkstatogr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -267,7 +267,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdsm2shadow.html b/doc/html/pkstatprofile.html
similarity index 54%
copy from doc/html/pkdsm2shadow.html
copy to doc/html/pkstatprofile.html
index f5cafeb..318b86c 100644
--- a/doc/html/pkdsm2shadow.html
+++ b/doc/html/pkstatprofile.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: pkdsm2shadow</title>
+<title>pktools: pkstatprofile</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -40,19 +40,51 @@
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">pkdsm2shadow </div>  </div>
+<div class="title">pkstatprofile </div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="textblock"><p>program to calculate sun shadow based on digital surface model and sun angles </p>
+<div class="textblock"><p>program to calculate statistics in temporal or spectral profile </p>
 <h2>SYNOPSIS</h2>
-<p><code> Usage: pkdsm2shadow -i input.txt -o output [-sza angle] [-saa angle] </code></p>
-<p><code></code></p>
-<p><code> Options: [-f value] [-ot type] [-of GDALformat] [-ct filename] [-co option]*</code></p>
-<p><code> Advanced options: [–scale value] [–offset value] </code></p>
-<h1><a class="anchor" id="pkdsm2shadow_description"></a>
+<p><code> Usage: pkstatprofile -i input -o output [-f function]* </code></p>
+<p><code> Options: [-nodata value]</code></p>
+<p><code> Advanced options: check table </code></p>
+<h1><a class="anchor" id="pkstatprofile_description"></a>
 Description</h1>
-<p>Utility to create a binary shadow mask from a digital surface model, based on Sun zenith (-sza) and azimuth angles (-saa).</p>
-<h1><a class="anchor" id="pkdsm2shadow_options"></a>
+<p>This utility calculates statistics for a temporal (time series) or spectral profile</p>
+<p><a class="anchor" id="pkstatprofile_functions"></a> </p>
+<table class="doxtable">
+<tr>
+<th>function </th><th>description  </th></tr>
+<tr>
+<td>mean </td><td>calculate mean in window </td></tr>
+<tr>
+<td>median </td><td>perform a median filter in spatial (dx, dy) or spectral/temporal (dz) domain </td></tr>
+<tr>
+<td>var </td><td>calculate variance in window </td></tr>
+<tr>
+<td>stdev </td><td>calculate standard deviation in window </td></tr>
+<tr>
+<td>min </td><td>calculate minimum in window </td></tr>
+<tr>
+<td>max </td><td>calculate maximum in window </td></tr>
+<tr>
+<td>sum </td><td>calculate sum in window </td></tr>
+<tr>
+<td>mode </td><td>calculate mode of all values </td></tr>
+<tr>
+<td>ismin </td><td>1 if value is minimum, else 0 </td></tr>
+<tr>
+<td>ismax </td><td>1 if value is maximum, else 0 </td></tr>
+<tr>
+<td>per </td><td>calculate percentile in time series (provide percentage value as argument) </td></tr>
+<tr>
+<td>prop </td><td>calculate proportion </td></tr>
+<tr>
+<td>nvalid </td><td>report number of valid observations </td></tr>
+</table>
+<p>Example: Calculate min and max NDVI in time series</p>
+<div class="fragment"><div class="line">pkstatprofile -i modis_ndvi_2010.tif -o modis_stats_2010.tif -f min -f max</div>
+</div><!-- fragment --><h1><a class="anchor" id="pkfilter_options"></a>
 Options</h1>
 <ul>
 <li>use either <code>-short</code> or <code>--long</code> options (both <code>--long=value</code> and <code>--long value</code> are supported)</li>
@@ -64,33 +96,21 @@ Options</h1>
 <tr>
 <td>o </td><td>output </td><td>std::string </td><td></td><td>Output image file </td></tr>
 <tr>
-<td>sza </td><td>sza </td><td>double </td><td></td><td>Sun zenith angle. </td></tr>
-<tr>
-<td>saa </td><td>saa </td><td>double </td><td></td><td>Sun azimuth angle (N=0 E=90 S=180 W=270). </td></tr>
-<tr>
-<td>f </td><td>flag </td><td>int </td><td>0 </td><td>Flag to put in image if pixel shadow </td></tr>
-<tr>
-<td>s </td><td>scale </td><td>double </td><td></td><td>scale used for input dsm: height=scale*input+offset </td></tr>
-<tr>
-<td>off </td><td>offset </td><td>double </td><td></td><td>offset used for input dsm: height=scale*input+offset </td></tr>
-<tr>
-<td>co </td><td>co </td><td>std::string </td><td></td><td>Creation option for output file. Multiple options can be specified. </td></tr>
+<td>f </td><td>function </td><td>std::string </td><td></td><td>statistics function (see table) </td></tr>
 <tr>
-<td>ot </td><td>otype </td><td>std::string </td><td></td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
+<td>perc </td><td>percentile </td><td>double </td><td></td><td>percentile value(s) for percentile function </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td></td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>class </td><td>class </td><td>std::string </td><td></td><td>class value(s) to use for mode, proportion </td></tr>
 <tr>
-<td>ct </td><td>ct </td><td>std::string </td><td></td><td>color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) </td></tr>
+<td>nodata </td><td>nodata </td><td>double </td><td></td><td>nodata value(s) </td></tr>
 </table>
-Usage: pkdsm2shadow -i input.txt -o output [-sza angle] [-saa angle]</li>
+Usage: pkstatprofile -i input -o ouptut [-f function]* </li>
 </ul>
-<h1>Examples </h1>
-<p>Some examples how to use pkdsm2shadow can be found <a class="el" href="md_examples_pkdsm2shadow.html#examples_pkdsm2shadow">here</a> </p>
 </div></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdsm2shadow_8cc_source.html b/doc/html/pkstatprofile_8cc_source.html
similarity index 57%
copy from doc/html/pkdsm2shadow_8cc_source.html
copy to doc/html/pkstatprofile_8cc_source.html
index 604ec86..16d1a66 100644
--- a/doc/html/pkdsm2shadow_8cc_source.html
+++ b/doc/html/pkstatprofile_8cc_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/src/apps/pkdsm2shadow.cc Source File</title>
+<title>pktools: /home/kempenep/pktools/src/apps/pkstatprofile.cc Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -49,12 +49,12 @@
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">pkdsm2shadow.cc</div>  </div>
+<div class="title">pkstatprofile.cc</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span> <span class="comment">/**********************************************************************</span></div>
-<div class="line"><a name="l00002"></a><span class="lineno">    2</span> <span class="comment">pkdsm2shadow.cc: program to calculate sun shadow based on digital surface model and sun angles</span></div>
-<div class="line"><a name="l00003"></a><span class="lineno">    3</span> <span class="comment">Copyright (C) 2008-2014 Pieter Kempeneers</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno">    2</span> <span class="comment">pkstatprofile.cc: program to calculate statistics in temporal or spectral profile</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno">    3</span> <span class="comment">Copyright (C) 2008-2015 Pieter Kempeneers</span></div>
 <div class="line"><a name="l00004"></a><span class="lineno">    4</span> <span class="comment"></span></div>
 <div class="line"><a name="l00005"></a><span class="lineno">    5</span> <span class="comment">This file is part of pktools</span></div>
 <div class="line"><a name="l00006"></a><span class="lineno">    6</span> <span class="comment"></span></div>
@@ -81,130 +81,166 @@
 <div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="preprocessor">#include "base/Optionpk.h"</span></div>
 <div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="preprocessor">#include "base/Vector2d.h"</span></div>
 <div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="preprocessor">#include "algorithms/Filter2d.h"</span></div>
-<div class="line"><a name="l00030"></a><span class="lineno">   30</span> <span class="preprocessor">#include "imageclasses/ImgReaderGdal.h"</span></div>
-<div class="line"><a name="l00031"></a><span class="lineno">   31</span> <span class="preprocessor">#include "imageclasses/ImgWriterGdal.h"</span></div>
-<div class="line"><a name="l00032"></a><span class="lineno">   32</span> </div>
-<div class="line"><a name="l00033"></a><span class="lineno">   33</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span> </div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span> <span class="comment">/*------------------</span></div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span> <span class="comment">  Main procedure</span></div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span> <span class="comment">  ----------------*/</span></div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> input_opt(<span class="stringliteral">"i"</span>,<span class="stringliteral">"input"</span>,<span class="stringliteral">"input image file"</span>);</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> sza_opt(<span class="stringliteral">"sza"</span>, <span class="stringliteral">"sza"</span>, <span class="stringliteral">"Sun zenith angle."</span>);</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> saa_opt(<span class="stringliteral">"saa"</span>, <span class="stringliteral">"saa"</span>, <span class="stringliteral">"Sun azimuth angle (N=0 E=90 S=180 W=270)."</span>);</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> flag_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"flag"</span>, <span class="stringliteral">"Flag to put in image if pixel shadow"</span>, 0);</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="string [...]
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"s"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale used for input dsm: height=scale*input+offset"</span>);</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"off"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset used for input dsm: height=scale*input+offset"</span>);</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode if > 0"</span>, 0,2);</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span> </div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   scale_opt.setHide(1);</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   offset_opt.setHide(1);</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span> </div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>     sza_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>     saa_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>     flag_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>     scale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>     offset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>     otype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   }</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     exit(0);</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   }</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     cout << endl;</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     cout << <span class="stringliteral">"Usage: pkdsm2shadow -i input.txt -o output [-sza angle] [-saa angle]"</span> << endl;</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>     cout << endl;</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   }</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span> </div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> input;</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> output;</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   assert(input_opt.size());</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   assert(output_opt.size());</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   input.open(input_opt[0]);</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <span class="keywordflow">if</span>(scale_opt.size())</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     input.setScale(scale_opt[0]);</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <span class="keywordflow">if</span>(offset_opt.size())</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     input.setOffset(offset_opt[0]);</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   </div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <span class="comment">// output.open(output_opt[0],input);</span></div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   GDALDataType theType=GDT_Unknown;</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>                  otype_opt[0].c_str()))</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>       theType=(GDALDataType) iType;</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   }</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     theType=input.getDataType();</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span> </div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     std::cout << std::endl << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span> </div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="keywordtype">string</span> imageType=input.getImageType();</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <span class="keywordflow">if</span>(oformat_opt.size())</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span> </div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     theInterleave+=input.getInterleave();</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   }</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     output.open(output_opt[0],input.nrOfCol(),input.nrOfRow(),input.nrOfBand(),theType,imageType,option_opt);</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   }</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     cout << errorstring << endl;</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     exit(4);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   }</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   output.setProjection(input.getProjection());</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   input.getGeoTransform(gt);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   output.setGeoTransform(gt);</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span> </div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="keywordflow">if</span>(input.getColorTable()!=NULL)</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     output.setColorTable(input.getColorTable());</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span> </div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <a class="code" href="classfilter2d_1_1Filter2d.html">filter2d::Filter2d</a> filter2d;</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     std::cout<< <span class="stringliteral">"class values: "</span>;</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="keywordflow">if</span>(colorTable_opt.size())</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     output.setColorTable(colorTable_opt[0]);</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   filter2d.shadowDsm(input,output,sza_opt[0],saa_opt[0],input.getDeltaX(),flag_opt[0]);</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   input.close();</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   output.close();</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
-<div class="ttc" id="classfilter2d_1_1Filter2d_html"><div class="ttname"><a href="classfilter2d_1_1Filter2d.html">filter2d::Filter2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Filter2d_8h_source.html#l00065">Filter2d.h:65</a></div></div>
+<div class="line"><a name="l00030"></a><span class="lineno">   30</span> <span class="preprocessor">#include "algorithms/Filter.h"</span></div>
+<div class="line"><a name="l00031"></a><span class="lineno">   31</span> <span class="preprocessor">#include "imageclasses/ImgReaderGdal.h"</span></div>
+<div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="preprocessor">#include "imageclasses/ImgWriterGdal.h"</span></div>
+<div class="line"><a name="l00033"></a><span class="lineno">   33</span> <span class="preprocessor">#include "algorithms/StatFactory.h"</span></div>
+<div class="line"><a name="l00034"></a><span class="lineno">   34</span> </div>
+<div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="comment">/******************************************************************************/</span></div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span> <span class="comment">/*------------------</span></div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span> <span class="comment">  Main procedure</span></div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span> <span class="comment">  ----------------*/</span></div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> input_opt(<span class="stringliteral">"i"</span>,<span class="stringliteral">"input"</span>,<span class="stringliteral">"input image file"</span>);</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> function_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"function"</span>, <span class="stringliteral">"Statistics function (mean, median, var, stdev, min, max, sum, mode (provide classes), ismin, ismax, proportion (provide classes), percentile, nvalid"</span>);</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> percentile_opt(<span class="stringliteral">"perc"</span>,<span class="stringliteral">"perc"</span>,<span class="stringliteral">"Percentile value(s) used for rule percentile"</span>);</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> class_opt(<span class="stringliteral">"class"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"class value(s) to use for mode, proportion"</span>);</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value(s)"</span>);</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>,<span class="stringl [...]
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)"</span>,<span class="stringliteral">"GTiff"</span>);</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table"</span>);</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <span class="comment">// Optionpk<short> down_opt("d", "down", "down sampling factor. Use value 1 for no downsampling). Use value n>1 for downsampling (aggregation)", 1);</span></div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode if > 0"</span>, 0,2);</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span> </div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   percentile_opt.setHide(1);</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   class_opt.setHide(1);</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   otype_opt.setHide(1);</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   oformat_opt.setHide(1);</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   colorTable_opt.setHide(1);</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span> </div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     function_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>     percentile_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   }</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     exit(0);</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   }</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     cout << endl;</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     cout << <span class="stringliteral">"Usage: pkstatprofile -i input -o ouptut [-function]*"</span> << endl;</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     cout << endl;</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   }</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span> </div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <span class="keywordflow">if</span>(function_opt.empty()){</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     cerr << <span class="stringliteral">"Error: no function selected, use option -f"</span> << endl;</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     exit(1);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   }</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span> </div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <a class="code" href="classfilter_1_1Filter.html">filter::Filter</a> filter1d;</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   filter1d.setNoDataValues(nodata_opt);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     filter1d.pushClass(class_opt[iclass]);</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span> </div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   filter1d.setThresholds(percentile_opt);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span> </div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> input;</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> output;</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     cerr << <span class="stringliteral">"Error: no input file selected, use option -i"</span> << endl;</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     exit(1);</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   }</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     cerr << <span class="stringliteral">"Error: no output file selected, use option -o"</span> << endl;</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     exit(1);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   }</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     input.open(input_opt[0]);</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   }</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     cout << errorstring << endl;</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     exit(1);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   }</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span> </div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   GDALDataType theType=GDT_Unknown;</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>                  otype_opt[0].c_str()))</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>       theType=(GDALDataType) iType;</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   }</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     theType=input.getDataType();</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span> </div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     std::cout << std::endl << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span> </div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="keywordtype">string</span> imageType;<span class="comment">//=input.getImageType();</span></div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordflow">if</span>(oformat_opt.size())</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span> </div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     theInterleave+=input.getInterleave();</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   }</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     cout << <span class="stringliteral">"Calculating statistic metrics: "</span> << function_opt.size() << endl;</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     output.open(output_opt[0],input.nrOfCol(),input.nrOfRow(),function_opt.size(),theType,imageType,option_opt);</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   }</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     cout << errorstring << endl;</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     exit(4);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   }</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span> </div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   output.setProjection(input.getProjection());</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   input.getGeoTransform(gt);</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   output.setGeoTransform(gt);</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   </div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>){</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     cout << <span class="stringliteral">"set colortable "</span> << colorTable_opt[0] << endl;</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>       assert(output.getDataType()==GDT_Byte);</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>       output.setColorTable(colorTable_opt[0]);</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     }</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   }</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(input.getColorTable()!=NULL)</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     output.setColorTable(input.getColorTable());</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   </div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   <span class="keywordflow">if</span>(nodata_opt.size()){</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.nrOfBand();++iband)</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>       output.GDALSetNoDataValue(nodata_opt[0],iband);</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   }</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span> </div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     filter1d.stats(input,output,function_opt);</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   }</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   }</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   input.close();</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   output.close();</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span> }</div>
+<div class="ttc" id="classfilter_1_1Filter_html"><div class="ttname"><a href="classfilter_1_1Filter.html">filter::Filter</a></div><div class="ttdef"><b>Definition:</b> <a href="Filter_8h_source.html#l00040">Filter.h:40</a></div></div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdsm2shadow.html b/doc/html/pkstatz.html
similarity index 54%
copy from doc/html/pkdsm2shadow.html
copy to doc/html/pkstatz.html
index f5cafeb..124693c 100644
--- a/doc/html/pkdsm2shadow.html
+++ b/doc/html/pkstatz.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: pkdsm2shadow</title>
+<title>pktools: pkstatz</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.5</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -40,19 +40,51 @@
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">pkdsm2shadow </div>  </div>
+<div class="title">pkstatz </div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="textblock"><p>program to calculate sun shadow based on digital surface model and sun angles </p>
+<div class="textblock"><p>program to calculate statistics in temporal or spectral profile </p>
 <h2>SYNOPSIS</h2>
-<p><code> Usage: pkdsm2shadow -i input.txt -o output [-sza angle] [-saa angle] </code></p>
-<p><code></code></p>
-<p><code> Options: [-f value] [-ot type] [-of GDALformat] [-ct filename] [-co option]*</code></p>
-<p><code> Advanced options: [–scale value] [–offset value] </code></p>
-<h1><a class="anchor" id="pkdsm2shadow_description"></a>
+<p><code> Usage: pkstatz -i input -o output [-f function]* </code></p>
+<p><code> Options: [-nodata value]</code></p>
+<p><code> Advanced options: check table </code></p>
+<h1><a class="anchor" id="pkstatz_description"></a>
 Description</h1>
-<p>Utility to create a binary shadow mask from a digital surface model, based on Sun zenith (-sza) and azimuth angles (-saa).</p>
-<h1><a class="anchor" id="pkdsm2shadow_options"></a>
+<p>This utility calculates statistics for a temporal (time series) or spectral profile</p>
+<p><a class="anchor" id="pkstatz_functions"></a> </p>
+<table class="doxtable">
+<tr>
+<th>function </th><th>description  </th></tr>
+<tr>
+<td>mean </td><td>calculate mean in window </td></tr>
+<tr>
+<td>median </td><td>perform a median filter in spatial (dx, dy) or spectral/temporal (dz) domain </td></tr>
+<tr>
+<td>var </td><td>calculate variance in window </td></tr>
+<tr>
+<td>stdev </td><td>calculate standard deviation in window </td></tr>
+<tr>
+<td>min </td><td>calculate minimum in window </td></tr>
+<tr>
+<td>max </td><td>calculate maximum in window </td></tr>
+<tr>
+<td>sum </td><td>calculate sum in window </td></tr>
+<tr>
+<td>mode </td><td>calculate mode of all values </td></tr>
+<tr>
+<td>ismin </td><td>1 if value is minimum, else 0 </td></tr>
+<tr>
+<td>ismax </td><td>1 if value is maximum, else 0 </td></tr>
+<tr>
+<td>per </td><td>calculate percentile in time series (provide percentage value as argument) </td></tr>
+<tr>
+<td>prop </td><td>calculate proportion </td></tr>
+<tr>
+<td>nvalid </td><td>report number of valid observations </td></tr>
+</table>
+<p>Example: Calculate min and max NDVI in time series</p>
+<div class="fragment"><div class="line">pkstatz -i modis_ndvi_2010.tif -o modis_stats_2010.tif -f min -f max</div>
+</div><!-- fragment --><h1><a class="anchor" id="pkfilter_options"></a>
 Options</h1>
 <ul>
 <li>use either <code>-short</code> or <code>--long</code> options (both <code>--long=value</code> and <code>--long value</code> are supported)</li>
@@ -64,33 +96,23 @@ Options</h1>
 <tr>
 <td>o </td><td>output </td><td>std::string </td><td></td><td>Output image file </td></tr>
 <tr>
-<td>sza </td><td>sza </td><td>double </td><td></td><td>Sun zenith angle. </td></tr>
-<tr>
-<td>saa </td><td>saa </td><td>double </td><td></td><td>Sun azimuth angle (N=0 E=90 S=180 W=270). </td></tr>
-<tr>
-<td>f </td><td>flag </td><td>int </td><td>0 </td><td>Flag to put in image if pixel shadow </td></tr>
-<tr>
-<td>s </td><td>scale </td><td>double </td><td></td><td>scale used for input dsm: height=scale*input+offset </td></tr>
-<tr>
-<td>off </td><td>offset </td><td>double </td><td></td><td>offset used for input dsm: height=scale*input+offset </td></tr>
-<tr>
-<td>co </td><td>co </td><td>std::string </td><td></td><td>Creation option for output file. Multiple options can be specified. </td></tr>
+<td>f </td><td>function </td><td>std::string </td><td></td><td>statistics function (see table) </td></tr>
 <tr>
-<td>ot </td><td>otype </td><td>std::string </td><td></td><td>Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image </td></tr>
+<td>perc </td><td>percentile </td><td>double </td><td></td><td>percentile value(s) for percentile function </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td></td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>class </td><td>class </td><td>std::string </td><td></td><td>class value(s) to use for mode, proportion </td></tr>
 <tr>
-<td>ct </td><td>ct </td><td>std::string </td><td></td><td>color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) </td></tr>
+<td>nodata </td><td>nodata </td><td>double </td><td></td><td>nodata value(s) </td></tr>
 </table>
-Usage: pkdsm2shadow -i input.txt -o output [-sza angle] [-saa angle]</li>
+Usage: pkstatz -i input -o ouptut [-f function]*</li>
 </ul>
 <h1>Examples </h1>
-<p>Some examples how to use pkdsm2shadow can be found <a class="el" href="md_examples_pkdsm2shadow.html#examples_pkdsm2shadow">here</a> </p>
+<p>Some examples how to use pkstatz can be found here </p>
 </div></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Dec 16 2015 16:04:45 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm.html b/doc/html/pksvm.html
index a420e48..da209e6 100644
--- a/doc/html/pksvm.html
+++ b/doc/html/pksvm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -76,7 +76,7 @@ Options</h1>
 <tr>
 <td>r </td><td>reclass </td><td>short </td><td></td><td>List of class values (use same order as in class opt). </td></tr>
 <tr>
-<td>of </td><td>oformat </td><td>std::string </td><td></td><td>Output image format (see also gdal_translate). Empty string: inherit from input image </td></tr>
+<td>of </td><td>oformat </td><td>std::string </td><td>GTiff </td><td>Output image format (see also gdal_translate). </td></tr>
 <tr>
 <td>f </td><td>f </td><td>std::string </td><td>SQLite </td><td>Output ogr format for active training sample </td></tr>
 <tr>
@@ -94,7 +94,7 @@ Options</h1>
 <tr>
 <td>m </td><td>mask </td><td>std::string </td><td></td><td>Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata. </td></tr>
 <tr>
-<td>msknodata </td><td>msknodata </td><td>short </td><td>0 </td><td>Mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. </td></tr>
+<td>msknodata </td><td>msknodata </td><td>short </td><td>0 </td><td>Mask value(s) not to consider for classification. Values will be taken over in classification image. </td></tr>
 <tr>
 <td>nodata </td><td>nodata </td><td>unsigned short </td><td>0 </td><td>Nodata value to put where image is masked as nodata </td></tr>
 <tr>
@@ -160,7 +160,7 @@ Usage: pksvm -t training [-i input -o output] [-cv value]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm_8cc_source.html b/doc/html/pksvm_8cc_source.html
index 88848e2..e56c9dd 100644
--- a/doc/html/pksvm_8cc_source.html
+++ b/doc/html/pksvm_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -136,10 +136,10 @@
 <div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> bagSize_opt(<span class="stringliteral">"bagsize"</span>, <span class="stringliteral">"bagsize"</span>, <span class="stringliteral">"Percentage of features used from available training features for each bootstrap aggregation (one size for all classes, or a different size for each class respectively"</span>, 100);</div>
 <div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> classBag_opt(<span class="stringliteral">"cb"</span>, <span class="stringliteral">"classbag"</span>, <span class="stringliteral">"Output for each individual bootstrap aggregation"</span>);</div>
 <div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata."</span>);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image."</ [...]
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value(s) not to consider for classification. Values will be taken over in classification image."</span>, 0);</div>
 <div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"Nodata value to put where image is masked as nodata"</span>, 0);</div>
 <div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output classification image"</span>); </div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate)."</span>,<span class="stringliteral">"GTiff"</span>);</div>
 <div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
 <div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"Color table in ASCII format having 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>); </div>
 <div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> prob_opt(<span class="stringliteral">"prob"</span>, <span class="stringliteral">"prob"</span>, <span class="stringliteral">"Probability image."</span>); </div>
@@ -151,1234 +151,1237 @@
 <div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> classvalue_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"reclass"</span>, <span class="stringliteral">"List of class values (use same order as in class opt)."</span>); </div>
 <div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"Verbose level"</span>,0,2);</div>
 <div class="line"><a name="l00180"></a><span class="lineno">  180</span> </div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   band_opt.setHide(1);</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   bstart_opt.setHide(1);</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   bend_opt.setHide(1);</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   balance_opt.setHide(1);</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   minSize_opt.setHide(1);</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   bag_opt.setHide(1);</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   bagSize_opt.setHide(1);</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   comb_opt.setHide(1);</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   classBag_opt.setHide(1);</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   prob_opt.setHide(1);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   priorimg_opt.setHide(1);</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   offset_opt.setHide(1);</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   scale_opt.setHide(1);</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   svm_type_opt.setHide(1);</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   kernel_type_opt.setHide(1);</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   kernel_degree_opt.setHide(1);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   coef0_opt.setHide(1);</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   nu_opt.setHide(1);</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   epsilon_loss_opt.setHide(1);</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   cache_opt.setHide(1);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   epsilon_tol_opt.setHide(1);</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   shrinking_opt.setHide(1);</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   prob_est_opt.setHide(1);</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   entropy_opt.setHide(1);</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   active_opt.setHide(1);</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   nactive_opt.setHide(1);</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   random_opt.setHide(1);</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span> </div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   verbose_opt.setHide(2);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   oformat_opt.setHide(1);</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   band_opt.setHide(1);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   bstart_opt.setHide(1);</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   bend_opt.setHide(1);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   balance_opt.setHide(1);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   minSize_opt.setHide(1);</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   bag_opt.setHide(1);</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   bagSize_opt.setHide(1);</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   comb_opt.setHide(1);</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   classBag_opt.setHide(1);</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   prob_opt.setHide(1);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   priorimg_opt.setHide(1);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   offset_opt.setHide(1);</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   scale_opt.setHide(1);</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   svm_type_opt.setHide(1);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   kernel_type_opt.setHide(1);</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   kernel_degree_opt.setHide(1);</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   coef0_opt.setHide(1);</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   nu_opt.setHide(1);</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   epsilon_loss_opt.setHide(1);</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   cache_opt.setHide(1);</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   epsilon_tol_opt.setHide(1);</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   shrinking_opt.setHide(1);</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   prob_est_opt.setHide(1);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   entropy_opt.setHide(1);</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   active_opt.setHide(1);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   nactive_opt.setHide(1);</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   random_opt.setHide(1);</div>
 <div class="line"><a name="l00210"></a><span class="lineno">  210</span> </div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     doProcess=training_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     cv_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     cmformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     tlayer_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     classname_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     classvalue_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     label_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     priors_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     gamma_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     ccost_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     mask_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     msknodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     <span class="comment">// Advanced options</span></div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     bstart_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     bend_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     balance_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     minSize_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     bag_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     bagSize_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     comb_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     classBag_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     prob_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     priorimg_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     offset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     scale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     svm_type_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     kernel_type_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     kernel_degree_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     coef0_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     nu_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     epsilon_loss_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     cache_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     epsilon_tol_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     shrinking_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     prob_est_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     entropy_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     active_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     nactive_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     random_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   }</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     exit(0);</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   }</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     cout << endl;</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     cout << <span class="stringliteral">"Usage: pksvm -t training [-i input -o output] [-cv value]"</span> << endl;</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   verbose_opt.setHide(2);</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span> </div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     doProcess=training_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     cv_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     cmformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     tlayer_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     classname_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     classvalue_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     label_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     priors_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     gamma_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     ccost_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     mask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     msknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     <span class="comment">// Advanced options</span></div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     bstart_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     bend_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     balance_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     minSize_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     bag_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     bagSize_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     comb_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     classBag_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     prob_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     priorimg_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     offset_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     scale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     svm_type_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     kernel_type_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     kernel_degree_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     coef0_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     nu_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     epsilon_loss_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     cache_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     epsilon_tol_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     shrinking_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     prob_est_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     entropy_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     active_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     nactive_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     random_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   }</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     exit(0);</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   }</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordflow">if</span>(!doProcess){</div>
 <div class="line"><a name="l00269"></a><span class="lineno">  269</span>     cout << endl;</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   }</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span> </div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="keywordflow">if</span>(entropy_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     entropy_opt.clear();</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordflow">if</span>(active_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     active_opt.clear();</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordflow">if</span>(priorimg_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     priorimg_opt.clear();</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span> </div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span> </div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   std::map<std::string, svm::SVM_TYPE> svmMap;</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     cout << <span class="stringliteral">"Usage: pksvm -t training [-i input -o output] [-cv value]"</span> << endl;</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     cout << endl;</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   }</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span> </div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordflow">if</span>(entropy_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     entropy_opt.clear();</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordflow">if</span>(active_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     active_opt.clear();</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="keywordflow">if</span>(priorimg_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     priorimg_opt.clear();</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span> </div>
 <div class="line"><a name="l00283"></a><span class="lineno">  283</span> </div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   svmMap[<span class="stringliteral">"C_SVC"</span>]=svm::C_SVC;</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   svmMap[<span class="stringliteral">"nu_SVC"</span>]=svm::nu_SVC;</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   svmMap[<span class="stringliteral">"one_class"</span>]=svm::one_class;</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   svmMap[<span class="stringliteral">"epsilon_SVR"</span>]=svm::epsilon_SVR;</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   svmMap[<span class="stringliteral">"nu_SVR"</span>]=svm::nu_SVR;</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span> </div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   std::map<std::string, svm::KERNEL_TYPE> kernelMap;</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   std::map<std::string, svm::SVM_TYPE> svmMap;</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span> </div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   svmMap[<span class="stringliteral">"C_SVC"</span>]=svm::C_SVC;</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   svmMap[<span class="stringliteral">"nu_SVC"</span>]=svm::nu_SVC;</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   svmMap[<span class="stringliteral">"one_class"</span>]=svm::one_class;</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   svmMap[<span class="stringliteral">"epsilon_SVR"</span>]=svm::epsilon_SVR;</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   svmMap[<span class="stringliteral">"nu_SVR"</span>]=svm::nu_SVR;</div>
 <div class="line"><a name="l00291"></a><span class="lineno">  291</span> </div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   kernelMap[<span class="stringliteral">"linear"</span>]=svm::linear;</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   kernelMap[<span class="stringliteral">"polynomial"</span>]=svm::polynomial;</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   kernelMap[<span class="stringliteral">"radial"</span>]=svm::radial;</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   kernelMap[<span class="stringliteral">"sigmoid;"</span>]=svm::sigmoid;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span> </div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   assert(training_opt.size());</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   std::map<std::string, svm::KERNEL_TYPE> kernelMap;</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span> </div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   kernelMap[<span class="stringliteral">"linear"</span>]=svm::linear;</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   kernelMap[<span class="stringliteral">"polynomial"</span>]=svm::polynomial;</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   kernelMap[<span class="stringliteral">"radial"</span>]=svm::radial;</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   kernelMap[<span class="stringliteral">"sigmoid;"</span>]=svm::sigmoid;</div>
 <div class="line"><a name="l00298"></a><span class="lineno">  298</span> </div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     <span class="keywordflow">if</span>(input_opt.size())</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       std::cout << <span class="stringliteral">"input filename: "</span> << input_opt[0] << std::endl;</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       std::cout << <span class="stringliteral">"mask filename: "</span> << mask_opt[0] << std::endl;</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     std::cout << <span class="stringliteral">"training vector file: "</span> << std::endl;</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<training_opt.size();++ifile)</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       std::cout << training_opt[ifile] << std::endl;</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     std::cout << <span class="stringliteral">"verbose: "</span> << verbose_opt[0] << std::endl;</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   }</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nbag=(training_opt.size()>1)?training_opt.size():bag_opt[0];</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     std::cout << <span class="stringliteral">"number of bootstrap aggregations: "</span> << nbag << std::endl;</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span> </div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   OGRLayer  *readLayer;</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span> </div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   <span class="keywordtype">double</span> ulx=0;</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   <span class="keywordtype">double</span> uly=0;</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <span class="keywordtype">double</span> lrx=0;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordtype">double</span> lry=0;</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span> </div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordtype">bool</span> maskIsVector=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>       extentReader.open(mask_opt[0]);</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       maskIsVector=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>       readLayer = extentReader.getDataSource()->GetLayer(0);</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(ulx,uly,lrx,lry))){</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     cerr << <span class="stringliteral">"Error: could not get extent from "</span> << mask_opt[0] << endl;</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     exit(1);</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       }</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     }</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>       maskIsVector=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     }</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   }</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span> </div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> activeWriter;</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>   <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     prob_est_opt[0]=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     activeWriter.open(active_opt[0],ogrformat_opt[0]);</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     activeWriter.createLayer(active_opt[0],trainingReader.getProjection(),wkbPoint,NULL);</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     activeWriter.copyFields(trainingReader);</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   }</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>   vector<PosValue> activePoints(nactive_opt[0]);</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     activePoints[iactive].value=1.0;</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     activePoints[iactive].posx=0.0;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     activePoints[iactive].posy=0.0;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   }</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   </div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSamples=0;</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nactive=0;</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   vector<struct svm_model*> svm(nbag);</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   vector<struct svm_parameter> param(nbag);</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span> </div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordtype">short</span> nclass=0;</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   <span class="keywordtype">int</span> startBand=2;<span class="comment">//first two bands represent X and Y pos</span></div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span> </div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   <span class="comment">//normalize priors from command line</span></div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>   <span class="keywordflow">if</span>(priors_opt.size()>1){<span class="comment">//priors from argument list</span></div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     priors.resize(priors_opt.size());</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="keywordtype">double</span> normPrior=0;</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<priors_opt.size();++iclass){</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       priors[iclass]=priors_opt[iclass];</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       normPrior+=priors[iclass];</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     }</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="comment">//normalize</span></div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<priors_opt.size();++iclass)</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       priors[iclass]/=normPrior;</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   }</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span> </div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       }</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       band_opt.clear();</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     }</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       band_opt.push_back(iband);</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       }</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     }</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   }</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     cerr << error << std::endl;</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     exit(1);</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   }</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   <span class="comment">//sort bands</span></div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>     std::sort(band_opt.begin(),band_opt.end());</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span> </div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>   map<string,short> classValueMap;</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   vector<std::string> nameVector;</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>   }</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span> </div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>   <a class="code" href="classconfusionmatrix_1_1ConfusionMatrix.html">confusionmatrix::ConfusionMatrix</a> cm;</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   vector< vector<double> > offset(nbag);</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>   vector< vector<double> > scale(nbag);</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>   map<string,Vector2d<float> > trainingMap;</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>   vector<string> fields;</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span> </div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>   vector<struct svm_problem> prob(nbag);</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>   vector<struct svm_node *> x_space(nbag);</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span> </div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     <span class="comment">//organize training data</span></div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     <span class="keywordflow">if</span>(ibag<training_opt.size()){<span class="comment">//if bag contains new training pixels</span></div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>       trainingMap.clear();</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       trainingPixels.clear();</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>         std::cout << <span class="stringliteral">"reading imageVector file "</span> << training_opt[0] << std::endl;</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReaderBag(training_opt[ibag]);</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>         <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>         <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>           <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training file, did you provide class labels in training sample (see option label)?"</span>;</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>         }</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     trainingReaderBag.close();</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>       }</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>         exit(1);</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       }</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       <span class="keywordflow">catch</span>(std::exception& e){</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         std::cerr << <span class="stringliteral">"Error: "</span>;</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>         std::cerr << e.what() << std::endl;</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>         std::cerr << CPLGetLastErrorMsg() << std::endl; </div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>         exit(1);</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       }</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>         exit(1);</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       }</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span> </div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="comment">//convert map to vector</span></div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       <span class="comment">// short iclass=0;</span></div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         <span class="comment">//delete small classes</span></div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>         <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>           trainingMap.erase(mapit);</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>         }</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         trainingPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>           std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>         ++mapit;</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       }</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       <span class="keywordflow">if</span>(!ibag){</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>         nclass=trainingPixels.size();</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">if</span>(classname_opt.size())</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       assert(nclass==classname_opt.size());</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>         nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       }</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         assert(nclass==trainingPixels.size());</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         assert(nband==trainingPixels[0][0].size()-2);</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       }</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span> </div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       <span class="comment">//balance training data</span></div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         <span class="keywordflow">while</span>(balance_opt.size()<nclass)</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>           balance_opt.push_back(balance_opt.back());</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>         <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>           srand(time(NULL));</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         totalSamples=0;</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>             <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>               <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>               trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>             }</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>           }</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>             <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[iclass];++isample){</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>               <span class="keywordtype">int</span> index = rand()%oldsize;</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>               trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>             }</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>           }</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>           totalSamples+=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>         }</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>       }</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     </div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       <span class="comment">//set scale and offset</span></div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       offset[ibag].resize(nband);</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       scale[ibag].resize(nband);</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>         assert(offset_opt.size()==nband);</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>         assert(scale_opt.size()==nband);</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>           std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>         offset[ibag][iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>         scale[ibag][iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>         <span class="comment">//search for min and maximum</span></div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>         <span class="keywordflow">if</span>(scale[ibag][iband]<=0){</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>           <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>           <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>               <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>                 theMin=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>               <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>                 theMax=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>             }</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>           }</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>           offset[ibag][iband]=theMin+(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>           scale[ibag][iband]=(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>           <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>             std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>             std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[ibag][iband] << <span class="stringliteral">", "</span> << scale[ibag][iband] << std::endl;</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>             std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">","</span> << (theMax-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">"]"</span> <&lt [...]
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>           }</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         }</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       }</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     }</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     <span class="keywordflow">else</span>{<span class="comment">//use same offset and scale </span></div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       offset[ibag].resize(nband);</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       scale[ibag].resize(nband);</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>         offset[ibag][iband]=offset[0][iband];</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>         scale[ibag][iband]=scale[0][iband];</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       }</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     }</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       </div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     <span class="keywordflow">if</span>(!ibag){</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordflow">if</span>(priors_opt.size()==1){<span class="comment">//default: equal priors for each class</span></div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         priors.resize(nclass);</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>           priors[iclass]=1.0/nclass;</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       }</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       assert(priors_opt.size()==1||priors_opt.size()==nclass);</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span> </div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="comment">//set bagsize for each class if not done already via command line</span></div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       <span class="keywordflow">while</span>(bagSize_opt.size()<nclass)</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>         bagSize_opt.push_back(bagSize_opt.back());</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span> </div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     <span class="keywordflow">if</span>(priorimg_opt.empty()){</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       std::cout << <span class="stringliteral">"priors:"</span>;</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>         std::cout << <span class="stringliteral">" "</span> << priors[iclass];</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       std::cout << std::endl;</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     }</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       }</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       <span class="keywordtype">bool</span> doSort=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       nameVector.push_back(mapit->first);</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       <span class="keywordflow">if</span>(classValueMap.size()){</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>         <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>         <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>           <span class="keywordflow">if</span>(cm.getClassIndex(type2string<short>(classValueMap[mapit->first]))<0){</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>         cm.pushBackClassName(type2string<short>(classValueMap[mapit->first]),doSort);</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>           }</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>         }</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>           std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>           exit(1);</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>         }</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       }</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         cm.pushBackClassName(mapit->first,doSort);</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       ++mapit;</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     }</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       }</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordflow">catch</span>(<a class="code" href="classBadConversion.html">BadConversion</a> conversionString){</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     std::cerr << <span class="stringliteral">"Error: did you provide class pairs names (-c) and integer values (-r) for each class in training vector?"</span> << std::endl;</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     exit(1);</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       }</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       <span class="keywordflow">if</span>(classname_opt.empty()){</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>         <span class="comment">//std::cerr << "Warning: no class name and value pair provided for all " << nclass << " classes, using string2type<int> instead!" << std::endl;</span></div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>             std::cout << iclass << <span class="stringliteral">" "</span> << cm.getClass(iclass) << <span class="stringliteral">" -> "</span> << string2type<short>(cm.getClass(iclass)) << std::endl;</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>           classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass));</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>         }</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       }</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span> </div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       <span class="comment">// if(priors_opt.size()==nameVector.size()){</span></div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="comment">//    std::cerr << "Warning: please check if priors are provided in correct order!!!" << std::endl;</span></div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="comment">//    for(int iclass=0;iclass<nameVector.size();++iclass)</span></div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="comment">//      std::cerr << nameVector[iclass] << " " << priors_opt[iclass] << std::endl;</span></div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     }<span class="comment">//if(!ibag)</span></div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span> </div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="comment">//Calculate features of training set</span></div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     vector< Vector2d<float> > trainingFeatures(nclass);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="keywordtype">int</span> nctraining=0;</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         srand(time(NULL));</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       nctraining=(bagSize_opt[iclass]<100)? trainingPixels[iclass].size()/100.0*bagSize_opt[iclass] : trainingPixels[iclass].size();<span class="comment">//bagSize_opt[iclass] given in % of training size</span></div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       <span class="keywordflow">if</span>(nctraining<=0)</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>         nctraining=1;</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       assert(nctraining<=trainingPixels[iclass].size());</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       <span class="keywordtype">int</span> index=0;</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       <span class="keywordflow">if</span>(bagSize_opt[iclass]<100)</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>         random_shuffle(trainingPixels[iclass].begin(),trainingPixels[iclass].end());</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     std::cout << <span class="stringliteral">"nctraining (class "</span> << iclass << <span class="stringliteral">"): "</span> << nctraining << std::endl;</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       trainingFeatures[iclass].resize(nctraining);</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining;++isample){</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>         <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>           <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>           trainingFeatures[iclass][isample].push_back((value-offset[ibag][iband])/scale[ibag][iband]);</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         }</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       }</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       assert(trainingFeatures[iclass].size()==nctraining);</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     }</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     </div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       std::cout << <span class="stringliteral">"number of features: "</span> << nFeatures << std::endl;</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ntraining=0;</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       ntraining+=trainingFeatures[iclass].size();</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       std::cout << <span class="stringliteral">"training size over all classes: "</span> << ntraining << std::endl;</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span> </div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     prob[ibag].l=ntraining;</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     prob[ibag].y = Malloc(<span class="keywordtype">double</span>,prob[ibag].l);</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     prob[ibag].x = Malloc(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a> *,prob[ibag].l);</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     x_space[ibag] = Malloc(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a>,(nFeatures+1)*ntraining);</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> spaceIndex=0;</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     <span class="keywordtype">int</span> lIndex=0;</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingFeatures[iclass].size();++isample){</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>         prob[ibag].x[lIndex]=&(x_space[ibag][spaceIndex]);</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifeature=0;ifeature<nFeatures;++ifeature){</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>           x_space[ibag][spaceIndex].index=ifeature+1;</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>           x_space[ibag][spaceIndex].value=trainingFeatures[iclass][isample][ifeature];</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>           ++spaceIndex;</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>         }</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>         x_space[ibag][spaceIndex++].index=-1;</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>         prob[ibag].y[lIndex]=iclass;</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>         ++lIndex;</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       }</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     }</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     assert(lIndex==prob[ibag].l);</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span> </div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="comment">//set SVM parameters through command line options</span></div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     param[ibag].svm_type = svmMap[svm_type_opt[0]];</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     param[ibag].kernel_type = kernelMap[kernel_type_opt[0]];</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     param[ibag].degree = kernel_degree_opt[0];</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     param[ibag].gamma = (gamma_opt[0]>0)? gamma_opt[0] : 1.0/nFeatures;</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     param[ibag].coef0 = coef0_opt[0];</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     param[ibag].nu = nu_opt[0];</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     param[ibag].cache_size = cache_opt[0];</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     param[ibag].C = ccost_opt[0];</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     param[ibag].eps = epsilon_tol_opt[0];</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     param[ibag].p = epsilon_loss_opt[0];</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     param[ibag].shrinking = (shrinking_opt[0])? 1 : 0;</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     param[ibag].probability = (prob_est_opt[0])? 1 : 0;</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     param[ibag].nr_weight = 0;<span class="comment">//not used: I use priors and balancing</span></div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     param[ibag].weight_label = NULL;</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     param[ibag].weight = NULL;</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     param[ibag].verbose=(verbose_opt[0]>1)? <span class="keyword">true</span>:<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span> </div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       std::cout << <span class="stringliteral">"checking parameters"</span> << std::endl;</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     svm_check_parameter(&prob[ibag],&param[ibag]);</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       std::cout << <span class="stringliteral">"parameters ok, training"</span> << std::endl;</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     svm[ibag]=svm_train(&prob[ibag],&param[ibag]);</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       std::cout << <span class="stringliteral">"SVM is now trained"</span> << std::endl;</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     std::cout << <span class="stringliteral">"Cross validating"</span> << std::endl;</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       <span class="keywordtype">double</span> *target = Malloc(<span class="keywordtype">double</span>,prob[ibag].l);</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       svm_cross_validation(&prob[ibag],&param[ibag],cv_opt[0],target);</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>       assert(param[ibag].svm_type != EPSILON_SVR&&param[ibag].svm_type != NU_SVR);<span class="comment">//only for regression</span></div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span> </div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<prob[ibag].l;i++){</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="keywordtype">string</span> refClassName=nameVector[prob[ibag].y[i]];</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>     <span class="keywordtype">string</span> className=nameVector[target[i]];</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       cm.incrementResult(type2string<short>(classValueMap[refClassName]),type2string<short>(classValueMap[className]),1.0/nbag);</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       cm.incrementResult(cm.getClass(prob[ibag].y[i]),cm.getClass(target[i]),1.0/nbag);</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       }</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>       free(target);</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     }</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     <span class="comment">// *NOTE* Because svm_model contains pointers to svm_problem, you can</span></div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     <span class="comment">// not free the memory used by svm_problem if you are still using the</span></div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     <span class="comment">// svm_model produced by svm_train(). </span></div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   }<span class="comment">//for ibag</span></div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>   <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     assert(cm.nReference());</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     cm.setFormat(cmformat_opt[0]);</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     cm.reportSE95(<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>     std::cout << cm << std::endl;</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     <span class="comment">// cout << "class #samples userAcc prodAcc" << endl;</span></div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     <span class="comment">// double se95_ua=0;</span></div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     <span class="comment">// double se95_pa=0;</span></div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     <span class="comment">// double se95_oa=0;</span></div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>     <span class="comment">// double dua=0;</span></div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     <span class="comment">// double dpa=0;</span></div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     <span class="comment">// double doa=0;</span></div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     <span class="comment">// for(short iclass=0;iclass<cm.nClasses();++iclass){</span></div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     <span class="comment">//   dua=cm.ua(cm.getClass(iclass),&se95_ua);</span></div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     <span class="comment">//   dpa=cm.pa(cm.getClass(iclass),&se95_pa);</span></div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="comment">//   cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;</span></div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     <span class="comment">// }</span></div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="comment">// std::cout << "Kappa: " << cm.kappa() << std::endl;</span></div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     <span class="comment">// doa=cm.oa(&se95_oa);</span></div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     <span class="comment">// std::cout << "Overall Accuracy: " << 100*doa << " (" << 100*se95_oa << ")"  << std::endl;</span></div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>   }</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span> </div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>   <span class="comment">//--------------------------------- end of training -----------------------------------</span></div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>   <span class="keywordflow">if</span>(input_opt.empty())</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     exit(0);</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span> </div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>   <span class="keywordtype">float</span> progress=0;</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>   <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>   <span class="comment">//-------------------------------- open image file ------------------------------------</span></div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>   <span class="keywordtype">bool</span> inputIsRaster=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> imgReaderOgr;</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     imgReaderOgr.open(input_opt[0]);</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     imgReaderOgr.close();</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>   }</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     inputIsRaster=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   assert(training_opt.size());</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span> </div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="keywordflow">if</span>(input_opt.size())</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       std::cout << <span class="stringliteral">"input filename: "</span> << input_opt[0] << std::endl;</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       std::cout << <span class="stringliteral">"mask filename: "</span> << mask_opt[0] << std::endl;</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     std::cout << <span class="stringliteral">"training vector file: "</span> << std::endl;</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<training_opt.size();++ifile)</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       std::cout << training_opt[ifile] << std::endl;</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     std::cout << <span class="stringliteral">"verbose: "</span> << verbose_opt[0] << std::endl;</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   }</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nbag=(training_opt.size()>1)?training_opt.size():bag_opt[0];</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     std::cout << <span class="stringliteral">"number of bootstrap aggregations: "</span> << nbag << std::endl;</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span> </div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   OGRLayer  *readLayer;</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span> </div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <span class="keywordtype">double</span> ulx=0;</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordtype">double</span> uly=0;</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="keywordtype">double</span> lrx=0;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordtype">double</span> lry=0;</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span> </div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <span class="keywordtype">bool</span> maskIsVector=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>       extentReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       maskIsVector=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       readLayer = extentReader.getDataSource()->GetLayer(0);</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(ulx,uly,lrx,lry))){</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     cerr << <span class="stringliteral">"Error: could not get extent from "</span> << mask_opt[0] << endl;</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     exit(1);</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>       }</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     }</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       maskIsVector=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     }</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   }</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span> </div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> activeWriter;</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     prob_est_opt[0]=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     activeWriter.open(active_opt[0],ogrformat_opt[0]);</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     activeWriter.createLayer(active_opt[0],trainingReader.getProjection(),wkbPoint,NULL);</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     activeWriter.copyFields(trainingReader);</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   }</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   vector<PosValue> activePoints(nactive_opt[0]);</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     activePoints[iactive].value=1.0;</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     activePoints[iactive].posx=0.0;</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     activePoints[iactive].posy=0.0;</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   }</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   </div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSamples=0;</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nactive=0;</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   vector<struct svm_model*> svm(nbag);</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   vector<struct svm_parameter> param(nbag);</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span> </div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   <span class="keywordtype">short</span> nclass=0;</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   <span class="keywordtype">int</span> startBand=2;<span class="comment">//first two bands represent X and Y pos</span></div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span> </div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   <span class="comment">//normalize priors from command line</span></div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   <span class="keywordflow">if</span>(priors_opt.size()>1){<span class="comment">//priors from argument list</span></div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     priors.resize(priors_opt.size());</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="keywordtype">double</span> normPrior=0;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<priors_opt.size();++iclass){</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>       priors[iclass]=priors_opt[iclass];</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       normPrior+=priors[iclass];</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     }</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     <span class="comment">//normalize</span></div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<priors_opt.size();++iclass)</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       priors[iclass]/=normPrior;</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   }</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span> </div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       }</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       band_opt.clear();</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     }</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>       band_opt.push_back(iband);</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       }</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     }</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>   }</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     exit(1);</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>   }</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   <span class="comment">//sort bands</span></div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     std::sort(band_opt.begin(),band_opt.end());</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span> </div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>   map<string,short> classValueMap;</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>   vector<std::string> nameVector;</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>   }</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span> </div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>   <a class="code" href="classconfusionmatrix_1_1ConfusionMatrix.html">confusionmatrix::ConfusionMatrix</a> cm;</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>   vector< vector<double> > offset(nbag);</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>   vector< vector<double> > scale(nbag);</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>   map<string,Vector2d<float> > trainingMap;</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>   vector<string> fields;</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span> </div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>   vector<struct svm_problem> prob(nbag);</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>   vector<struct svm_node *> x_space(nbag);</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span> </div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     <span class="comment">//organize training data</span></div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     <span class="keywordflow">if</span>(ibag<training_opt.size()){<span class="comment">//if bag contains new training pixels</span></div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       trainingMap.clear();</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       trainingPixels.clear();</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         std::cout << <span class="stringliteral">"reading imageVector file "</span> << training_opt[0] << std::endl;</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReaderBag(training_opt[ibag]);</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>         <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       <span class="comment">//todo: when tlayer_opt is provided, readDataImageOgr does not read any layer</span></div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>         <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>           <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training file, did you provide class labels in training sample (see option label)?"</span>;</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>           <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>         }</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     trainingReaderBag.close();</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       }</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         exit(1);</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       }</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       <span class="keywordflow">catch</span>(std::exception& e){</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>         std::cerr << <span class="stringliteral">"Error: "</span>;</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         std::cerr << e.what() << std::endl;</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>         std::cerr << CPLGetLastErrorMsg() << std::endl; </div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         exit(1);</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       }</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>         exit(1);</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       }</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span> </div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       <span class="comment">//convert map to vector</span></div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       <span class="comment">// short iclass=0;</span></div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>         <span class="comment">//delete small classes</span></div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>         <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>           trainingMap.erase(mapit);</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>         }</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>         trainingPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>         ++mapit;</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       }</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       <span class="keywordflow">if</span>(!ibag){</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>         nclass=trainingPixels.size();</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     <span class="keywordflow">if</span>(classname_opt.size())</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       assert(nclass==classname_opt.size());</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       }</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>         assert(nclass==trainingPixels.size());</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>         assert(nband==trainingPixels[0][0].size()-2);</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       }</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span> </div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>       <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       <span class="comment">//balance training data</span></div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         <span class="keywordflow">while</span>(balance_opt.size()<nclass)</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>           balance_opt.push_back(balance_opt.back());</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           srand(time(NULL));</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>         totalSamples=0;</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>           <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>             <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>               <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>               trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>             }</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>           }</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>             <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[iclass];++isample){</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>               <span class="keywordtype">int</span> index = rand()%oldsize;</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>               trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>             }</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>           }</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>           totalSamples+=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>         }</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       }</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     </div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       <span class="comment">//set scale and offset</span></div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       offset[ibag].resize(nband);</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       scale[ibag].resize(nband);</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         assert(offset_opt.size()==nband);</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>         assert(scale_opt.size()==nband);</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>           std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>         offset[ibag][iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>         scale[ibag][iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>         <span class="comment">//search for min and maximum</span></div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>         <span class="keywordflow">if</span>(scale[ibag][iband]<=0){</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>           <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>           <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>               <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>                 theMin=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>               <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>                 theMax=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>             }</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>           }</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>           offset[ibag][iband]=theMin+(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>           scale[ibag][iband]=(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>           <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>             std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>             std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[ibag][iband] << <span class="stringliteral">", "</span> << scale[ibag][iband] << std::endl;</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>             std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">","</span> << (theMax-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">"]"</span> <&lt [...]
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>           }</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>         }</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       }</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     }</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">else</span>{<span class="comment">//use same offset and scale </span></div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       offset[ibag].resize(nband);</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       scale[ibag].resize(nband);</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>         offset[ibag][iband]=offset[0][iband];</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         scale[ibag][iband]=scale[0][iband];</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       }</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     }</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       </div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     <span class="keywordflow">if</span>(!ibag){</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       <span class="keywordflow">if</span>(priors_opt.size()==1){<span class="comment">//default: equal priors for each class</span></div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>         priors.resize(nclass);</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>           priors[iclass]=1.0/nclass;</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       }</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       assert(priors_opt.size()==1||priors_opt.size()==nclass);</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span> </div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="comment">//set bagsize for each class if not done already via command line</span></div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="keywordflow">while</span>(bagSize_opt.size()<nclass)</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         bagSize_opt.push_back(bagSize_opt.back());</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span> </div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>         std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>         std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     <span class="keywordflow">if</span>(priorimg_opt.empty()){</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       std::cout << <span class="stringliteral">"priors:"</span>;</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>         std::cout << <span class="stringliteral">" "</span> << priors[iclass];</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       std::cout << std::endl;</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     }</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       }</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       <span class="keywordtype">bool</span> doSort=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       nameVector.push_back(mapit->first);</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       <span class="keywordflow">if</span>(classValueMap.size()){</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>         <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>         <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>           <span class="keywordflow">if</span>(cm.getClassIndex(type2string<short>(classValueMap[mapit->first]))<0){</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>         cm.pushBackClassName(type2string<short>(classValueMap[mapit->first]),doSort);</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>           }</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>         }</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>           std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>           exit(1);</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         }</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       }</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>         cm.pushBackClassName(mapit->first,doSort);</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       ++mapit;</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     }</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       }</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       <span class="keywordflow">catch</span>(<a class="code" href="classBadConversion.html">BadConversion</a> conversionString){</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>     std::cerr << <span class="stringliteral">"Error: did you provide class pairs names (-c) and integer values (-r) for each class in training vector?"</span> << std::endl;</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     exit(1);</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       }</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       <span class="keywordflow">if</span>(classname_opt.empty()){</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>         <span class="comment">//std::cerr << "Warning: no class name and value pair provided for all " << nclass << " classes, using string2type<int> instead!" << std::endl;</span></div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>             std::cout << iclass << <span class="stringliteral">" "</span> << cm.getClass(iclass) << <span class="stringliteral">" -> "</span> << string2type<short>(cm.getClass(iclass)) << std::endl;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>           classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass));</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>         }</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       }</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span> </div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="comment">// if(priors_opt.size()==nameVector.size()){</span></div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       <span class="comment">//    std::cerr << "Warning: please check if priors are provided in correct order!!!" << std::endl;</span></div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="comment">//    for(int iclass=0;iclass<nameVector.size();++iclass)</span></div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       <span class="comment">//      std::cerr << nameVector[iclass] << " " << priors_opt[iclass] << std::endl;</span></div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     }<span class="comment">//if(!ibag)</span></div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span> </div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     <span class="comment">//Calculate features of training set</span></div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     vector< Vector2d<float> > trainingFeatures(nclass);</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <span class="keywordtype">int</span> nctraining=0;</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>         std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>         srand(time(NULL));</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       nctraining=(bagSize_opt[iclass]<100)? trainingPixels[iclass].size()/100.0*bagSize_opt[iclass] : trainingPixels[iclass].size();<span class="comment">//bagSize_opt[iclass] given in % of training size</span></div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       <span class="keywordflow">if</span>(nctraining<=0)</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>         nctraining=1;</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       assert(nctraining<=trainingPixels[iclass].size());</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       <span class="keywordtype">int</span> index=0;</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       <span class="keywordflow">if</span>(bagSize_opt[iclass]<100)</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>         random_shuffle(trainingPixels[iclass].begin(),trainingPixels[iclass].end());</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     std::cout << <span class="stringliteral">"nctraining (class "</span> << iclass << <span class="stringliteral">"): "</span> << nctraining << std::endl;</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       trainingFeatures[iclass].resize(nctraining);</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining;++isample){</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>           <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>           trainingFeatures[iclass][isample].push_back((value-offset[ibag][iband])/scale[ibag][iband]);</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>         }</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       }</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       assert(trainingFeatures[iclass].size()==nctraining);</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     }</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>     </div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       std::cout << <span class="stringliteral">"number of features: "</span> << nFeatures << std::endl;</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ntraining=0;</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       ntraining+=trainingFeatures[iclass].size();</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       std::cout << <span class="stringliteral">"training size over all classes: "</span> << ntraining << std::endl;</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span> </div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     prob[ibag].l=ntraining;</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     prob[ibag].y = Malloc(<span class="keywordtype">double</span>,prob[ibag].l);</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     prob[ibag].x = Malloc(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a> *,prob[ibag].l);</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     x_space[ibag] = Malloc(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a>,(nFeatures+1)*ntraining);</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> spaceIndex=0;</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     <span class="keywordtype">int</span> lIndex=0;</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingFeatures[iclass].size();++isample){</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>         prob[ibag].x[lIndex]=&(x_space[ibag][spaceIndex]);</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifeature=0;ifeature<nFeatures;++ifeature){</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>           x_space[ibag][spaceIndex].index=ifeature+1;</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>           x_space[ibag][spaceIndex].value=trainingFeatures[iclass][isample][ifeature];</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>           ++spaceIndex;</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>         }</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>         x_space[ibag][spaceIndex++].index=-1;</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>         prob[ibag].y[lIndex]=iclass;</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>         ++lIndex;</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       }</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     }</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     assert(lIndex==prob[ibag].l);</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span> </div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     <span class="comment">//set SVM parameters through command line options</span></div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     param[ibag].svm_type = svmMap[svm_type_opt[0]];</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     param[ibag].kernel_type = kernelMap[kernel_type_opt[0]];</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     param[ibag].degree = kernel_degree_opt[0];</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     param[ibag].gamma = (gamma_opt[0]>0)? gamma_opt[0] : 1.0/nFeatures;</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     param[ibag].coef0 = coef0_opt[0];</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     param[ibag].nu = nu_opt[0];</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     param[ibag].cache_size = cache_opt[0];</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     param[ibag].C = ccost_opt[0];</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     param[ibag].eps = epsilon_tol_opt[0];</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     param[ibag].p = epsilon_loss_opt[0];</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     param[ibag].shrinking = (shrinking_opt[0])? 1 : 0;</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     param[ibag].probability = (prob_est_opt[0])? 1 : 0;</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     param[ibag].nr_weight = 0;<span class="comment">//not used: I use priors and balancing</span></div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     param[ibag].weight_label = NULL;</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     param[ibag].weight = NULL;</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     param[ibag].verbose=(verbose_opt[0]>1)? <span class="keyword">true</span>:<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span> </div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       std::cout << <span class="stringliteral">"checking parameters"</span> << std::endl;</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     svm_check_parameter(&prob[ibag],&param[ibag]);</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       std::cout << <span class="stringliteral">"parameters ok, training"</span> << std::endl;</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     svm[ibag]=svm_train(&prob[ibag],&param[ibag]);</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       std::cout << <span class="stringliteral">"SVM is now trained"</span> << std::endl;</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     std::cout << <span class="stringliteral">"Cross validating"</span> << std::endl;</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       <span class="keywordtype">double</span> *target = Malloc(<span class="keywordtype">double</span>,prob[ibag].l);</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       svm_cross_validation(&prob[ibag],&param[ibag],cv_opt[0],target);</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>       assert(param[ibag].svm_type != EPSILON_SVR&&param[ibag].svm_type != NU_SVR);<span class="comment">//only for regression</span></div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span> </div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<prob[ibag].l;i++){</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     <span class="keywordtype">string</span> refClassName=nameVector[prob[ibag].y[i]];</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     <span class="keywordtype">string</span> className=nameVector[target[i]];</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       cm.incrementResult(type2string<short>(classValueMap[refClassName]),type2string<short>(classValueMap[className]),1.0/nbag);</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>       cm.incrementResult(cm.getClass(prob[ibag].y[i]),cm.getClass(target[i]),1.0/nbag);</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       }</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>       free(target);</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     }</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     <span class="comment">// *NOTE* Because svm_model contains pointers to svm_problem, you can</span></div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <span class="comment">// not free the memory used by svm_problem if you are still using the</span></div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     <span class="comment">// svm_model produced by svm_train(). </span></div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>   }<span class="comment">//for ibag</span></div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>   <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>     assert(cm.nReference());</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     cm.setFormat(cmformat_opt[0]);</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     cm.reportSE95(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     std::cout << cm << std::endl;</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     <span class="comment">// cout << "class #samples userAcc prodAcc" << endl;</span></div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>     <span class="comment">// double se95_ua=0;</span></div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     <span class="comment">// double se95_pa=0;</span></div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     <span class="comment">// double se95_oa=0;</span></div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     <span class="comment">// double dua=0;</span></div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     <span class="comment">// double dpa=0;</span></div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     <span class="comment">// double doa=0;</span></div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="comment">// for(short iclass=0;iclass<cm.nClasses();++iclass){</span></div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     <span class="comment">//   dua=cm.ua(cm.getClass(iclass),&se95_ua);</span></div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="comment">//   dpa=cm.pa(cm.getClass(iclass),&se95_pa);</span></div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     <span class="comment">//   cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;</span></div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>     <span class="comment">// std::cout << "Kappa: " << cm.kappa() << std::endl;</span></div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>     <span class="comment">// doa=cm.oa(&se95_oa);</span></div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>     <span class="comment">// std::cout << "Overall Accuracy: " << 100*doa << " (" << 100*se95_oa << ")"  << std::endl;</span></div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>   }</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span> </div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>   <span class="comment">//--------------------------------- end of training -----------------------------------</span></div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>   <span class="keywordflow">if</span>(input_opt.empty())</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>     exit(0);</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span> </div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>   <span class="keywordtype">float</span> progress=0;</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>   <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>   <span class="comment">//-------------------------------- open image file ------------------------------------</span></div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>   <span class="keywordtype">bool</span> inputIsRaster=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> imgReaderOgr;</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>     imgReaderOgr.open(input_opt[0]);</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     imgReaderOgr.close();</div>
 <div class="line"><a name="l00759"></a><span class="lineno">  759</span>   }</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>   <span class="keywordflow">if</span>(inputIsRaster){</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> testImage;</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>         std::cout << <span class="stringliteral">"opening image "</span> << input_opt[0] << std::endl; </div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       testImage.open(input_opt[0]);</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>     }</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>       cerr << error << std::endl;</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>       exit(2);</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     }</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> priorReader;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>     <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>           std::cout << <span class="stringliteral">"opening prior image "</span> << priorimg_opt[0] << std::endl;</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>         priorReader.open(priorimg_opt[0]);</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>         assert(priorReader.nrOfCol()==testImage.nrOfCol());</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>         assert(priorReader.nrOfRow()==testImage.nrOfRow());</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       }</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>         exit(2);</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       }</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>         exit(1);</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       }</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     }</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span> </div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     <span class="keywordtype">int</span> nrow=testImage.nrOfRow();</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     <span class="keywordtype">int</span> ncol=testImage.nrOfCol();</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       theInterleave+=testImage.getInterleave();</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>     }</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     vector<char> classOut(ncol);<span class="comment">//classified line for writing to image file</span></div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span> </div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>     <span class="comment">//   assert(nband==testImage.nrOfBand());</span></div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageBag;</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageOut;</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> probImage;</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> entropyImage;</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span> </div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     <span class="keywordtype">string</span> imageType=testImage.getImageType();</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       assert(output_opt.size());</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>         std::cout << <span class="stringliteral">"opening class image for writing output "</span> << output_opt[0] << std::endl;</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>         classImageBag.open(classBag_opt[0],ncol,nrow,nbag,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>     classImageBag.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>         classImageBag.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>         classImageBag.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       }</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       classImageOut.open(output_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>       classImageOut.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       classImageOut.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       classImageOut.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       <span class="keywordflow">if</span>(colorTable_opt.size())</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         classImageOut.setColorTable(colorTable_opt[0],0);</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>         probImage.open(prob_opt[0],ncol,nrow,nclass,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     probImage.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>         probImage.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>         probImage.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       }</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>         entropyImage.open(entropy_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     entropyImage.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>         entropyImage.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         entropyImage.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       }</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     }</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     inputIsRaster=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>   }</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>   <span class="keywordflow">if</span>(inputIsRaster){</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> testImage;</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>         std::cout << <span class="stringliteral">"opening image "</span> << input_opt[0] << std::endl; </div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>       testImage.open(input_opt[0]);</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>     }</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       exit(2);</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>     }</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> priorReader;</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>           std::cout << <span class="stringliteral">"opening prior image "</span> << priorimg_opt[0] << std::endl;</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>         priorReader.open(priorimg_opt[0]);</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>         assert(priorReader.nrOfCol()==testImage.nrOfCol());</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>         assert(priorReader.nrOfRow()==testImage.nrOfRow());</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       }</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>         exit(2);</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       }</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>         exit(1);</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       }</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     }</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span> </div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     <span class="keywordtype">int</span> nrow=testImage.nrOfRow();</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>     <span class="keywordtype">int</span> ncol=testImage.nrOfCol();</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       theInterleave+=testImage.getInterleave();</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>     }</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>     vector<char> classOut(ncol);<span class="comment">//classified line for writing to image file</span></div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span> </div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>     <span class="comment">//   assert(nband==testImage.nrOfBand());</span></div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageBag;</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageOut;</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> probImage;</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> entropyImage;</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span> </div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>     <span class="keywordtype">string</span> imageType=testImage.getImageType();</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>     <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       assert(output_opt.size());</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>         std::cout << <span class="stringliteral">"opening class image for writing output "</span> << output_opt[0] << std::endl;</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>         classImageBag.open(classBag_opt[0],ncol,nrow,nbag,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     classImageBag.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>         classImageBag.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         classImageBag.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       }</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       classImageOut.open(output_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       classImageOut.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>       classImageOut.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       classImageOut.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       <span class="keywordflow">if</span>(colorTable_opt.size())</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>         classImageOut.setColorTable(colorTable_opt[0],0);</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>         probImage.open(prob_opt[0],ncol,nrow,nclass,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>     probImage.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>         probImage.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>         probImage.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       }</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         entropyImage.open(entropy_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>     entropyImage.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>         entropyImage.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         entropyImage.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>       }</div>
 <div class="line"><a name="l00839"></a><span class="lineno">  839</span>     }</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>   </div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span> </div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="keywordflow">if</span>(maskIsVector){</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncol,nrow,1,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     maskWriter.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>         maskWriter.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>         maskWriter.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     maskWriter.rasterizeOgr(extentReader,burnValues);</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     extentReader.close();</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     maskWriter.close();</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>       }</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>         exit(2);</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       }</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         exit(1);</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       }</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       mask_opt.clear();</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>     }</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>     <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>           std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>         maskReader.open(mask_opt[0]);</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       }</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>         exit(2);</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       }</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>         exit(1);</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       }</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>     }</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span> </div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<nrow;++iline){</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       vector<float> buffer(ncol);</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       vector<short> lineMask;</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> linePrior;</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>      linePrior.resize(nclass,ncol);<span class="comment">//prior prob for each class</span></div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> hpixel(ncol);</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> probOut(nclass,ncol);<span class="comment">//posterior prob for each (internal) class</span></div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>       vector<float> entropy(ncol);</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       <a class="code" href="classVector2d.html">Vector2d<char></a> classBag;<span class="comment">//classified line for writing to image file</span></div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>         classBag.resize(nbag,ncol);</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>         <span class="keywordflow">if</span>(band_opt.size()){</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>               std::cout << <span class="stringliteral">"reading band "</span> << band_opt[iband] << std::endl;</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>             assert(band_opt[iband]>=0);</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>             assert(band_opt[iband]<testImage.nrOfBand());</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>             testImage.readData(buffer,GDT_Float32,iline,band_opt[iband]);</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>               hpixel[icol].push_back(buffer[icol]);</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>           }</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>         }</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>               std::cout << <span class="stringliteral">"reading band "</span> << iband << std::endl;</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>             assert(iband>=0);</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>             assert(iband<testImage.nrOfBand());</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>             testImage.readData(buffer,GDT_Float32,iline,iband);</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>               hpixel[icol].push_back(buffer[icol]);</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>           }</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>         }</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       }</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>         cerr << <span class="stringliteral">"Error reading "</span> << input_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>         exit(3);</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       }</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>         exit(3);</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       }</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       assert(nband==hpixel[0].size());</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>         std::cout << <span class="stringliteral">"used bands: "</span> << nband << std::endl;</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       <span class="comment">//read prior</span></div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>         <span class="keywordflow">if</span>(verbose_opt.size()>1)</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>           std::cout << <span class="stringliteral">"Reading "</span> << priorimg_opt[0] << <span class="stringliteral">" band "</span> << iclass << <span class="stringliteral">" line "</span> << iline << std::endl;</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>         priorReader.readData(linePrior[iclass],GDT_Float32,iline,iclass);</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       }</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>         }</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       std::cerr << <span class="stringliteral">"Error reading "</span> << priorimg_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>           exit(3);</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>         }</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>         <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>           cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>           exit(3);</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>         }</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>       }</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       <span class="comment">//process per pixel</span></div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>         assert(hpixel[icol].size()==nband);</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>     <span class="keywordtype">bool</span> doClassify=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     <span class="keywordtype">double</span> geox=0;</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     <span class="keywordtype">double</span> geoy=0;</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>         <span class="keywordflow">if</span>(maskIsVector){</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       doClassify=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       <span class="comment">//check enveloppe first</span></div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       <span class="keywordflow">if</span>(uly>=geoy&&lry<=geoy&&ulx<=geox&&lrx>=geox){</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>         doClassify=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       }</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     }</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       <span class="comment">//read mask</span></div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>       <span class="keywordtype">double</span> colMask=0;</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       <span class="keywordtype">double</span> rowMask=0;</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span> </div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>       maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>           assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>         <span class="comment">// maskReader.readData(lineMask[imask],GDT_Int32,static_cast<int>(rowMask));</span></div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>         maskReader.readData(lineMask,GDT_Int16,static_cast<int>(rowMask));</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>           }</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>         cerr << errorstring << endl;</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>         exit(1);</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>           }</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>           <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>         exit(3);</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>           }</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>           oldRowMask=rowMask;</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>         }</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>         <span class="keywordtype">short</span> theMask=0;</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>           <span class="keywordflow">if</span>(msknodata_opt[ivalue]>=0){<span class="comment">//values set in msknodata_opt are invalid</span></div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>         <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[ivalue]){</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>           theMask=lineMask[colMask];</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>         }</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>           }</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>           <span class="keywordflow">else</span>{<span class="comment">//only values set in msknodata_opt are valid</span></div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         <span class="keywordflow">if</span>(lineMask[colMask]!=-msknodata_opt[ivalue]){</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>           theMask=lineMask[colMask];</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>         }</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>           masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         }</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>           }</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         }</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>         <span class="keywordflow">if</span>(masked){</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>           <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>           classBag[ibag][icol]=theMask;</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>           classOut[icol]=theMask;</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>         }</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>       }</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       <span class="keywordtype">bool</span> valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<hpixel[icol].size();++iband){</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         <span class="keywordflow">if</span>(hpixel[icol][iband]){</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>           valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>         }</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       }</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>       <span class="keywordflow">if</span>(!valid)</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>         doClassify=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>     }</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>           probOut[iclass][icol]=0;</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     <span class="keywordflow">if</span>(!doClassify){</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>           classBag[ibag][icol]=nodata_opt[0];</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       classOut[icol]=nodata_opt[0];</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>       <span class="keywordflow">continue</span>;<span class="comment">//next column</span></div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>     }</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       std::cout << <span class="stringliteral">"begin classification "</span> << std::endl;</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>         <span class="comment">//----------------------------------- classification -------------------</span></div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>           vector<double> result(nclass);</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>           <span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *x;</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>           x = (<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *) malloc((nband+1)*<span class="keyword">sizeof</span>(<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a>));</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>             x[iband].index=iband+1;</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>             x[iband].value=(hpixel[icol][iband]-offset[ibag][iband])/scale[ibag][iband];</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>           }</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           x[nband].index=-1;<span class="comment">//to end svm feature vector</span></div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>           <span class="keywordtype">double</span> predict_label=0;</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>           vector<float> prValues(nclass);</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>           <span class="keywordtype">float</span> maxP=0;</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>           <span class="keywordflow">if</span>(!prob_est_opt[0]){</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>             predict_label = svm_predict(svm[ibag],x);</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>             <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>               <span class="keywordflow">if</span>(iclass==static_cast<short>(predict_label))</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>                 result[iclass]=1;</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>                 result[iclass]=0;</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>             }</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>           }</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>             assert(svm_check_probability_model(svm[ibag]));</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>             predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));</div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>           }</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>           <span class="comment">//calculate posterior prob of bag </span></div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>           <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>             <span class="comment">//search for max prob within bag</span></div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>             maxP=0;</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>             classBag[ibag][icol]=0;</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>           }</div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>       <span class="keywordtype">double</span> normPrior=0;</div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>           normPrior+=linePrior[iclass][icol];</div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>       }</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>         <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>           priors[iclass]=linePrior[iclass][icol]/normPrior;<span class="comment">//todo: check if correct for all cases... (automatic classValueMap and manual input for names and values)</span></div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>             <span class="keywordflow">switch</span>(comb_opt[0]){</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>             <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>             <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>               probOut[iclass][icol]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>             <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>               probOut[iclass][icol]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>             <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>               <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass][icol])</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>                 probOut[iclass][icol]=priors[iclass]*result[iclass];</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>             }</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>             <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>               <span class="comment">//search for max prob within bag</span></div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>               <span class="comment">// if(prValues[iclass]>maxP){</span></div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>               <span class="comment">//   maxP=prValues[iclass];</span></div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>               <span class="comment">//   classBag[ibag][icol]=iclass;</span></div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>               <span class="comment">// }</span></div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>               <span class="keywordflow">if</span>(result[iclass]>maxP){</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>                 maxP=result[iclass];</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>                 classBag[ibag][icol]=iclass;</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>               }</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>             }</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>           }</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>           free(x);</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>         }<span class="comment">//ibag</span></div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span> </div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>         <span class="comment">//search for max class prob</span></div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         <span class="keywordtype">float</span> maxBag1=0;<span class="comment">//max probability</span></div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         <span class="keywordtype">float</span> maxBag2=0;<span class="comment">//second max probability</span></div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         <span class="keywordtype">float</span> normBag=0;</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>           <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag1){</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>             maxBag1=probOut[iclass][icol];</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>             classOut[icol]=classValueMap[nameVector[iclass]];</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>           }</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag2)</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>             maxBag2=probOut[iclass][icol];</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>           normBag+=probOut[iclass][icol];</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         }</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>         <span class="comment">//normalize probOut and convert to percentage</span></div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>         entropy[icol]=0;</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>           <span class="keywordtype">float</span> prv=probOut[iclass][icol];</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>           prv/=normBag;</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>           entropy[icol]-=prv*log(prv)/log(2.0);</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>           prv*=100.0;</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>             </div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>           probOut[iclass][icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(prv+0.5);</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]<probOut.size());</span></div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]>=0);</span></div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>           <span class="comment">// probOut[classValueMap[nameVector[iclass]]][icol]=static_cast<short>(prv+0.5);</span></div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>         }</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         entropy[icol]/=log(static_cast<double>(nclass))/log(2.0);</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>         entropy[icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(100*entropy[icol]+0.5);</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordflow">if</span>(entropy[icol]>activePoints.back().value){</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         activePoints.back().value=entropy[icol];<span class="comment">//replace largest value (last)</span></div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         activePoints.back().posx=icol;</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>         activePoints.back().posy=iline;</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>         std::sort(activePoints.begin(),activePoints.end(),<a class="code" href="classDecrease__PosValue.html">Decrease_PosValue</a>());<span class="comment">//sort in descending order (largest first, smallest last)</span></div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>           std::cout << activePoints.back().posx << <span class="stringliteral">" "</span> << activePoints.back().posy << <span class="stringliteral">" "</span> << activePoints.back().value << std::endl;</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       }</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>     }</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       }<span class="comment">//icol</span></div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       <span class="comment">//----------------------------------- write output ------------------------------------------</span></div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>           classImageBag.writeData(classBag[ibag],GDT_Byte,iline,ibag);</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>           probImage.writeData(probOut[iclass],GDT_Float32,iline,iclass);</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>       }</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>         entropyImage.writeData(entropy,GDT_Float32,iline);</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     }</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>   </div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span> </div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     <span class="keywordflow">if</span>(maskIsVector){</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncol,nrow,1,GDT_Float32,imageType,option_opt);</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     maskWriter.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>         maskWriter.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>         maskWriter.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     maskWriter.rasterizeOgr(extentReader,burnValues);</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     extentReader.close();</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     maskWriter.close();</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>       }</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>         exit(2);</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>       }</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>         exit(1);</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       }</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>       mask_opt.clear();</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>     }</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>     <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>           std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>         maskReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>       }</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>         exit(2);</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>       }</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>         exit(1);</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>       }</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>     }</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span> </div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<nrow;++iline){</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       vector<float> buffer(ncol);</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       vector<short> lineMask;</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> linePrior;</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>      linePrior.resize(nclass,ncol);<span class="comment">//prior prob for each class</span></div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> hpixel(ncol);</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> probOut(nclass,ncol);<span class="comment">//posterior prob for each (internal) class</span></div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       vector<float> entropy(ncol);</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       <a class="code" href="classVector2d.html">Vector2d<char></a> classBag;<span class="comment">//classified line for writing to image file</span></div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>         classBag.resize(nbag,ncol);</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>         <span class="keywordflow">if</span>(band_opt.size()){</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>               std::cout << <span class="stringliteral">"reading band "</span> << band_opt[iband] << std::endl;</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>             assert(band_opt[iband]>=0);</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>             assert(band_opt[iband]<testImage.nrOfBand());</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>             testImage.readData(buffer,GDT_Float32,iline,band_opt[iband]);</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>               hpixel[icol].push_back(buffer[icol]);</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>           }</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>         }</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>               std::cout << <span class="stringliteral">"reading band "</span> << iband << std::endl;</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>             assert(iband>=0);</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>             assert(iband<testImage.nrOfBand());</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>             testImage.readData(buffer,GDT_Float32,iline,iband);</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>               hpixel[icol].push_back(buffer[icol]);</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>           }</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>         }</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       }</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>         cerr << <span class="stringliteral">"Error reading "</span> << input_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>         exit(3);</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>       }</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>         exit(3);</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       }</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       assert(nband==hpixel[0].size());</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>         std::cout << <span class="stringliteral">"used bands: "</span> << nband << std::endl;</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       <span class="comment">//read prior</span></div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>         <span class="keywordflow">if</span>(verbose_opt.size()>1)</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>           std::cout << <span class="stringliteral">"Reading "</span> << priorimg_opt[0] << <span class="stringliteral">" band "</span> << iclass << <span class="stringliteral">" line "</span> << iline << std::endl;</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>         priorReader.readData(linePrior[iclass],GDT_Float32,iline,iclass);</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       }</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>         }</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       std::cerr << <span class="stringliteral">"Error reading "</span> << priorimg_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>           exit(3);</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>         }</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>         <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>           cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>           exit(3);</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>         }</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       }</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>       <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       <span class="comment">//process per pixel</span></div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>         assert(hpixel[icol].size()==nband);</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     <span class="keywordtype">bool</span> doClassify=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>     <span class="keywordtype">double</span> geox=0;</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>     <span class="keywordtype">double</span> geoy=0;</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>         <span class="keywordflow">if</span>(maskIsVector){</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       doClassify=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       <span class="comment">//check enveloppe first</span></div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       <span class="keywordflow">if</span>(uly>=geoy&&lry<=geoy&&ulx<=geox&&lrx>=geox){</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>         doClassify=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       }</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>     }</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>       <span class="comment">//read mask</span></div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>       <span class="keywordtype">double</span> colMask=0;</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>       <span class="keywordtype">double</span> rowMask=0;</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span> </div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>       <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>           assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>           <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>         <span class="comment">// maskReader.readData(lineMask[imask],GDT_Int32,static_cast<int>(rowMask));</span></div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>         maskReader.readData(lineMask,GDT_Int16,static_cast<int>(rowMask));</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>           }</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>         exit(1);</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>           }</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>           <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>         cerr << <span class="stringliteral">"error caught"</span> << std::endl;</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>         exit(3);</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>           }</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>           oldRowMask=rowMask;</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>         }</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>         <span class="keywordtype">short</span> theMask=0;</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>           <span class="comment">// if(msknodata_opt[ivalue]>=0){//values set in msknodata_opt are invalid</span></div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>         <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[ivalue]){</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>           theMask=lineMask[colMask];</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         }</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>           <span class="comment">// }</span></div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>           <span class="comment">// else{//only values set in msknodata_opt are valid</span></div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>           <span class="comment">//    if(lineMask[colMask]!=-msknodata_opt[ivalue]){</span></div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>           <span class="comment">//      theMask=lineMask[colMask];</span></div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>           <span class="comment">//      masked=true;</span></div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>           <span class="comment">//    }</span></div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>           <span class="comment">//    else{</span></div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>           <span class="comment">//      masked=false;</span></div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>           <span class="comment">//      break;</span></div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>           <span class="comment">//    }</span></div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>           <span class="comment">// }</span></div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         }</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>         <span class="keywordflow">if</span>(masked){</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>           <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>           classBag[ibag][icol]=theMask;</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>           classOut[icol]=theMask;</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         }</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>       }</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>       <span class="keywordtype">bool</span> valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<hpixel[icol].size();++iband){</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>         <span class="keywordflow">if</span>(hpixel[icol][iband]){</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>           valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>         }</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>       }</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>       <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         doClassify=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     }</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>           probOut[iclass][icol]=0;</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>     <span class="keywordflow">if</span>(!doClassify){</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>           classBag[ibag][icol]=nodata_opt[0];</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>       classOut[icol]=nodata_opt[0];</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       <span class="keywordflow">continue</span>;<span class="comment">//next column</span></div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>     }</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>       std::cout << <span class="stringliteral">"begin classification "</span> << std::endl;</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>         <span class="comment">//----------------------------------- classification -------------------</span></div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           vector<double> result(nclass);</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>           <span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *x;</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>           x = (<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *) malloc((nband+1)*<span class="keyword">sizeof</span>(<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a>));</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>             x[iband].index=iband+1;</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>             x[iband].value=(hpixel[icol][iband]-offset[ibag][iband])/scale[ibag][iband];</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>           }</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>           x[nband].index=-1;<span class="comment">//to end svm feature vector</span></div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>           <span class="keywordtype">double</span> predict_label=0;</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>           vector<float> prValues(nclass);</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>           <span class="keywordtype">float</span> maxP=0;</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>           <span class="keywordflow">if</span>(!prob_est_opt[0]){</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>             predict_label = svm_predict(svm[ibag],x);</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>             <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>               <span class="keywordflow">if</span>(iclass==static_cast<short>(predict_label))</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>                 result[iclass]=1;</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>                 result[iclass]=0;</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>             }</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>           }</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>             assert(svm_check_probability_model(svm[ibag]));</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>             predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>           }</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>           <span class="comment">//calculate posterior prob of bag </span></div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>           <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>             <span class="comment">//search for max prob within bag</span></div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>             maxP=0;</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>             classBag[ibag][icol]=0;</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>           }</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>       <span class="keywordtype">double</span> normPrior=0;</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>           normPrior+=linePrior[iclass][icol];</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>       }</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>         <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>           priors[iclass]=linePrior[iclass][icol]/normPrior;<span class="comment">//todo: check if correct for all cases... (automatic classValueMap and manual input for names and values)</span></div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>             <span class="keywordflow">switch</span>(comb_opt[0]){</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>             <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>             <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>               probOut[iclass][icol]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>             <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>               probOut[iclass][icol]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>             <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>               <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass][icol])</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>                 probOut[iclass][icol]=priors[iclass]*result[iclass];</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>             }</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>             <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>               <span class="comment">//search for max prob within bag</span></div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>               <span class="comment">// if(prValues[iclass]>maxP){</span></div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>               <span class="comment">//   maxP=prValues[iclass];</span></div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>               <span class="comment">//   classBag[ibag][icol]=iclass;</span></div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>               <span class="comment">// }</span></div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>               <span class="keywordflow">if</span>(result[iclass]>maxP){</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>                 maxP=result[iclass];</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>                 classBag[ibag][icol]=iclass;</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>               }</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>             }</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>           }</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>           free(x);</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         }<span class="comment">//ibag</span></div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span> </div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         <span class="comment">//search for max class prob</span></div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         <span class="keywordtype">float</span> maxBag1=0;<span class="comment">//max probability</span></div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         <span class="keywordtype">float</span> maxBag2=0;<span class="comment">//second max probability</span></div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>         <span class="keywordtype">float</span> normBag=0;</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>           <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag1){</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>             maxBag1=probOut[iclass][icol];</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>             classOut[icol]=classValueMap[nameVector[iclass]];</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>           }</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag2)</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>             maxBag2=probOut[iclass][icol];</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>           normBag+=probOut[iclass][icol];</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>         }</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>         <span class="comment">//normalize probOut and convert to percentage</span></div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>         entropy[icol]=0;</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>           <span class="keywordtype">float</span> prv=probOut[iclass][icol];</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>           prv/=normBag;</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>           entropy[icol]-=prv*log(prv)/log(2.0);</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>           prv*=100.0;</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>             </div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>           probOut[iclass][icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(prv+0.5);</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]<probOut.size());</span></div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]>=0);</span></div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>           <span class="comment">// probOut[classValueMap[nameVector[iclass]]][icol]=static_cast<short>(prv+0.5);</span></div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>         }</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>         entropy[icol]/=log(static_cast<double>(nclass))/log(2.0);</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         entropy[icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(100*entropy[icol]+0.5);</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       <span class="keywordflow">if</span>(entropy[icol]>activePoints.back().value){</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>         activePoints.back().value=entropy[icol];<span class="comment">//replace largest value (last)</span></div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>         activePoints.back().posx=icol;</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>         activePoints.back().posy=iline;</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>         std::sort(activePoints.begin(),activePoints.end(),<a class="code" href="classDecrease__PosValue.html">Decrease_PosValue</a>());<span class="comment">//sort in descending order (largest first, smallest last)</span></div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>           std::cout << activePoints.back().posx << <span class="stringliteral">" "</span> << activePoints.back().posy << <span class="stringliteral">" "</span> << activePoints.back().value << std::endl;</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       }</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>     }</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>       }<span class="comment">//icol</span></div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>       <span class="comment">//----------------------------------- write output ------------------------------------------</span></div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>           classImageBag.writeData(classBag[ibag],GDT_Byte,iline,ibag);</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>           probImage.writeData(probOut[iclass],GDT_Float32,iline,iclass);</div>
 <div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>       }</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>       classImageOut.writeData(classOut,GDT_Byte,iline);</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(iline+1.0)/classImageOut.nrOfRow();</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>       }</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>     }</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>     <span class="comment">//write active learning points</span></div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>     std::map<string,double> pointMap;</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<testImage.nrOfBand();++iband){</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       <span class="keywordtype">double</span> value;</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>       testImage.readData(value,GDT_Float64,static_cast<int>(activePoints[iactive].posx),static_cast<int>(activePoints[iactive].posy),iband);</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       ostringstream fs;</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>       fs << <span class="stringliteral">"B"</span> << iband;</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>       pointMap[fs.str()]=value;</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>     }</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>     pointMap[label_opt[0]]=0;</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>     <span class="keywordtype">double</span> x, y;</div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     testImage.image2geo(activePoints[iactive].posx,activePoints[iactive].posy,x,y);</div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>         std::string fieldname=<span class="stringliteral">"id"</span>;<span class="comment">//number of the point</span></div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>     activeWriter.addPoint(x,y,pointMap,fieldname,++nactive);</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>       }</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>     }</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span> </div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>     testImage.close();</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>       maskReader.close();</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>     <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       priorReader.close();</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>     <span class="keywordflow">if</span>(prob_opt.size())</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>       probImage.close();</div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>     <span class="keywordflow">if</span>(entropy_opt.size())</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       entropyImage.close();</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>     <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>       classImageBag.close();</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>     classImageOut.close();</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>   }</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>   <span class="keywordflow">else</span>{<span class="comment">//classify vector file</span></div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     cm.clearResults();</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>     <span class="comment">//notice that fields have already been set by readDataImageOgr (taking into account appropriate bands)</span></div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalidation=0;ivalidation<input_opt.size();++ivalidation){</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>     assert(output_opt.size()==input_opt.size());</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>         std::cout << <span class="stringliteral">"opening img reader "</span> << input_opt[ivalidation] << std::endl;</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>       imgReaderOgr.open(input_opt[ivalidation]);</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> imgWriterOgr;</div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span> </div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       std::cout << <span class="stringliteral">"opening img writer and copying fields from img reader"</span> << output_opt[ivalidation] << std::endl;</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     imgWriterOgr.open(output_opt[ivalidation],imgReaderOgr);</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>       }</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>     cout << <span class="stringliteral">"number of layers in input ogr file: "</span> << imgReaderOgr.getLayerCount() << endl;</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<imgReaderOgr.getLayerCount();++ilayer){</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>       cout << <span class="stringliteral">"processing input layer "</span> << ilayer << endl;</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>     <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>         std::cout << <span class="stringliteral">"creating field class"</span> << std::endl;</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>       <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTInteger,ilayer);</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTString,ilayer);</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>     }</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=imgReaderOgr.getFeatureCount(ilayer);</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>     progress=0;</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     OGRFeature *poFeature;</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>     <span class="keywordflow">while</span>( (poFeature = imgReaderOgr.getLayer(ilayer)->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>         std::cout << <span class="stringliteral">"feature "</span> << ifeature << std::endl;</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>       <span class="keywordflow">if</span>( poFeature == NULL ){</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>           cout << <span class="stringliteral">"Warning: could not read feature "</span> << ifeature << <span class="stringliteral">" in layer "</span> << imgReaderOgr.getLayerName(ilayer) << endl;</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>       }</div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>       OGRFeature *poDstFeature = NULL;</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>         poDstFeature=imgWriterOgr.createFeature(ilayer);</div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>         <span class="keywordflow">if</span>( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>           OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>         }</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>       }</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>       vector<float> validationPixel;</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>       vector<float> validationFeature;</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>         </div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>       imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature,ilayer);</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>       assert(validationPixel.size()==nband);</div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>       vector<float> probOut(nclass);<span class="comment">//posterior prob for each class</span></div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>         probOut[iclass]=0;</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>           validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>           <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>         std::cout << <span class="stringliteral">" "</span> << validationFeature.back();</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         }</div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>           std::cout << std::endl;</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>         vector<double> result(nclass);</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>         <span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *x;</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>         x = (<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *) malloc((validationFeature.size()+1)*<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a>));</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<validationFeature.size();++i){</div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>           x[i].index=i+1;</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>           x[i].value=validationFeature[i];</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>         }</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span> </div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>         x[validationFeature.size()].index=-1;<span class="comment">//to end svm feature vector</span></div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         <span class="keywordtype">double</span> predict_label=0;</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>         <span class="keywordflow">if</span>(!prob_est_opt[0]){</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>           predict_label = svm_predict(svm[ibag],x);</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>         <span class="keywordflow">if</span>(iclass==static_cast<short>(predict_label))</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>           result[iclass]=1;</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>           result[iclass]=0;</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>           }</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>         }</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>           assert(svm_check_probability_model(svm[ibag]));</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>           predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>         }</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>           std::cout << <span class="stringliteral">"predict_label: "</span> << predict_label << std::endl;</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<result.size();++iclass)</div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>         std::cout << result[iclass] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>           std::cout << std::endl;</div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>         }</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span> </div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>         <span class="comment">//calculate posterior prob of bag </span></div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>           <span class="keywordflow">switch</span>(comb_opt[0]){</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>           <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>         probOut[iclass]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>           <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>         probOut[iclass]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>           <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>         <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass])</div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>           probOut[iclass]=priors[iclass]*result[iclass];</div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>           }</div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>         }</div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>         free(x);</div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>       }<span class="comment">//for ibag</span></div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> </div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>       <span class="comment">//search for max class prob</span></div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>       <span class="keywordtype">float</span> maxBag=0;</div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>       <span class="keywordtype">float</span> normBag=0;</div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>       <span class="keywordtype">string</span> classOut=<span class="stringliteral">"Unclassified"</span>;</div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>           std::cout << probOut[iclass] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>         <span class="keywordflow">if</span>(probOut[iclass]>maxBag){</div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>           maxBag=probOut[iclass];</div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>           classOut=nameVector[iclass];</div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>         }</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>       }</div>
-<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>       <span class="comment">//look for class name</span></div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>           std::cout << <span class="stringliteral">"->"</span> << classValueMap[classOut] << std::endl;</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>         <span class="keywordflow">else</span>        </div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>           std::cout << <span class="stringliteral">"->"</span> << classOut << std::endl;</div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>       }</div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classValueMap[classOut]);</div>
-<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>         <span class="keywordflow">else</span>        </div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classOut.c_str());</div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>         poDstFeature->SetFID( poFeature->GetFID() );</div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>       }</div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>       <span class="keywordtype">int</span> labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());</div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>       <span class="keywordflow">if</span>(labelIndex>=0){</div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>         <span class="keywordtype">string</span> classRef=poFeature->GetFieldAsString(labelIndex);</div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>         <span class="keywordflow">if</span>(classRef!=<span class="stringliteral">"0"</span>){</div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>           <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>         cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>         cm.incrementResult(classRef,classOut,1);</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>         }</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>       }</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>       CPLErrorReset();</div>
-<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>         <span class="keywordflow">if</span>(imgWriterOgr.createFeature(poDstFeature,ilayer) != OGRERR_NONE){</div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
-<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>         }</div>
-<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>       }</div>
-<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>       ++ifeature;</div>
-<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
-<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1.0)/nFeatures;</div>
-<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>       }</div>
-<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>       OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>       OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>     }<span class="comment">//get next feature</span></div>
-<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>       }<span class="comment">//next layer</span></div>
-<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>       imgReaderOgr.close();</div>
-<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>     imgWriterOgr.close();</div>
-<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>     }</div>
-<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>     <span class="keywordflow">if</span>(cm.nReference()){</div>
-<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>       std::cout << cm << std::endl;</div>
-<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>       cout << <span class="stringliteral">"class #samples userAcc prodAcc"</span> << endl;</div>
-<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>       <span class="keywordtype">double</span> se95_ua=0;</div>
-<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>       <span class="keywordtype">double</span> se95_pa=0;</div>
-<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>       <span class="keywordtype">double</span> se95_oa=0;</div>
-<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>       <span class="keywordtype">double</span> dua=0;</div>
-<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>       <span class="keywordtype">double</span> dpa=0;</div>
-<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>       <span class="keywordtype">double</span> doa=0;</div>
-<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<cm.nClasses();++iclass){</div>
-<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>     dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</div>
-<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>     dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</div>
-<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>     cout << cm.getClass(iclass) << <span class="stringliteral">" "</span> << cm.nReference(cm.getClass(iclass)) << <span class="stringliteral">" "</span> << dua << <span class="stringliteral">" ("</span> << se95_ua << <span class="stringliteral">")"</span> << <span class="stringliteral">" "</span> << dp [...]
-<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>       }</div>
-<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>       std::cout << <span class="stringliteral">"Kappa: "</span> << cm.kappa() << std::endl;</div>
-<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>       doa=cm.oa(&se95_oa);</div>
-<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>       std::cout << <span class="stringliteral">"Overall Accuracy: "</span> << 100*doa << <span class="stringliteral">" ("</span> << 100*se95_oa << <span class="stringliteral">")"</span>  << std::endl;</div>
-<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>     }</div>
-<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>   }</div>
-<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>     <span class="keywordflow">if</span>(active_opt.size())</div>
-<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>       activeWriter.close();</div>
-<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>   }</div>
-<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>     std::cerr << <span class="stringliteral">"Error: errorString"</span> << std::endl;</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>         entropyImage.writeData(entropy,GDT_Float32,iline);</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>       }</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>       classImageOut.writeData(classOut,GDT_Byte,iline);</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(iline+1.0)/classImageOut.nrOfRow();</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>       }</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>     }</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>     <span class="comment">//write active learning points</span></div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>     std::map<string,double> pointMap;</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<testImage.nrOfBand();++iband){</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>       <span class="keywordtype">double</span> value;</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>       testImage.readData(value,GDT_Float64,static_cast<int>(activePoints[iactive].posx),static_cast<int>(activePoints[iactive].posy),iband);</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>       ostringstream fs;</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>       fs << <span class="stringliteral">"B"</span> << iband;</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>       pointMap[fs.str()]=value;</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     }</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>     pointMap[label_opt[0]]=0;</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>     <span class="keywordtype">double</span> x, y;</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>     testImage.image2geo(activePoints[iactive].posx,activePoints[iactive].posy,x,y);</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>         std::string fieldname=<span class="stringliteral">"id"</span>;<span class="comment">//number of the point</span></div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>     activeWriter.addPoint(x,y,pointMap,fieldname,++nactive);</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       }</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>     }</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> </div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>     testImage.close();</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>       maskReader.close();</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>     <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>       priorReader.close();</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>     <span class="keywordflow">if</span>(prob_opt.size())</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>       probImage.close();</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>     <span class="keywordflow">if</span>(entropy_opt.size())</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>       entropyImage.close();</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>     <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       classImageBag.close();</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     classImageOut.close();</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>   }</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>   <span class="keywordflow">else</span>{<span class="comment">//classify vector file</span></div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>     cm.clearResults();</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>     <span class="comment">//notice that fields have already been set by readDataImageOgr (taking into account appropriate bands)</span></div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalidation=0;ivalidation<input_opt.size();++ivalidation){</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>     assert(output_opt.size()==input_opt.size());</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>         std::cout << <span class="stringliteral">"opening img reader "</span> << input_opt[ivalidation] << std::endl;</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>       imgReaderOgr.open(input_opt[ivalidation]);</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> imgWriterOgr;</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span> </div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>       std::cout << <span class="stringliteral">"opening img writer and copying fields from img reader"</span> << output_opt[ivalidation] << std::endl;</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>     imgWriterOgr.open(output_opt[ivalidation],imgReaderOgr);</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>       }</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>     cout << <span class="stringliteral">"number of layers in input ogr file: "</span> << imgReaderOgr.getLayerCount() << endl;</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<imgReaderOgr.getLayerCount();++ilayer){</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>       cout << <span class="stringliteral">"processing input layer "</span> << ilayer << endl;</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>     <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>         std::cout << <span class="stringliteral">"creating field class"</span> << std::endl;</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>       <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTInteger,ilayer);</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTString,ilayer);</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>     }</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=imgReaderOgr.getFeatureCount(ilayer);</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>     progress=0;</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>     OGRFeature *poFeature;</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>     <span class="keywordflow">while</span>( (poFeature = imgReaderOgr.getLayer(ilayer)->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>         std::cout << <span class="stringliteral">"feature "</span> << ifeature << std::endl;</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>       <span class="keywordflow">if</span>( poFeature == NULL ){</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>           cout << <span class="stringliteral">"Warning: could not read feature "</span> << ifeature << <span class="stringliteral">" in layer "</span> << imgReaderOgr.getLayerName(ilayer) << endl;</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>       }</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>       OGRFeature *poDstFeature = NULL;</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>         poDstFeature=imgWriterOgr.createFeature(ilayer);</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>         <span class="keywordflow">if</span>( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>           OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>         }</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>       }</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>       vector<float> validationPixel;</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>       vector<float> validationFeature;</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>         </div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>       imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature,ilayer);</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>       assert(validationPixel.size()==nband);</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>       vector<float> probOut(nclass);<span class="comment">//posterior prob for each class</span></div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>         probOut[iclass]=0;</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>           validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>           <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>         std::cout << <span class="stringliteral">" "</span> << validationFeature.back();</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>         }</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>         <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>           std::cout << std::endl;</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>         vector<double> result(nclass);</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>         <span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *x;</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>         x = (<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *) malloc((validationFeature.size()+1)*<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a>));</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<validationFeature.size();++i){</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>           x[i].index=i+1;</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>           x[i].value=validationFeature[i];</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         }</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span> </div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>         x[validationFeature.size()].index=-1;<span class="comment">//to end svm feature vector</span></div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>         <span class="keywordtype">double</span> predict_label=0;</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>         <span class="keywordflow">if</span>(!prob_est_opt[0]){</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>           predict_label = svm_predict(svm[ibag],x);</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>         <span class="keywordflow">if</span>(iclass==static_cast<short>(predict_label))</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>           result[iclass]=1;</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>           result[iclass]=0;</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>           }</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>         }</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>           assert(svm_check_probability_model(svm[ibag]));</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>           predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>         }</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>           std::cout << <span class="stringliteral">"predict_label: "</span> << predict_label << std::endl;</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<result.size();++iclass)</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>         std::cout << result[iclass] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>           std::cout << std::endl;</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>         }</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span> </div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>         <span class="comment">//calculate posterior prob of bag </span></div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>           <span class="keywordflow">switch</span>(comb_opt[0]){</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>           <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>         probOut[iclass]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>           <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>         probOut[iclass]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>           <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>         <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass])</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>           probOut[iclass]=priors[iclass]*result[iclass];</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>           }</div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>         }</div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>         free(x);</div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>       }<span class="comment">//for ibag</span></div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span> </div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>       <span class="comment">//search for max class prob</span></div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>       <span class="keywordtype">float</span> maxBag=0;</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>       <span class="keywordtype">float</span> normBag=0;</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>       <span class="keywordtype">string</span> classOut=<span class="stringliteral">"Unclassified"</span>;</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>           std::cout << probOut[iclass] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>         <span class="keywordflow">if</span>(probOut[iclass]>maxBag){</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>           maxBag=probOut[iclass];</div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>           classOut=nameVector[iclass];</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>         }</div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>       }</div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>       <span class="comment">//look for class name</span></div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>           std::cout << <span class="stringliteral">"->"</span> << classValueMap[classOut] << std::endl;</div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>         <span class="keywordflow">else</span>        </div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>           std::cout << <span class="stringliteral">"->"</span> << classOut << std::endl;</div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>       }</div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classValueMap[classOut]);</div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>         <span class="keywordflow">else</span>        </div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classOut.c_str());</div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>         poDstFeature->SetFID( poFeature->GetFID() );</div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>       }</div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>       <span class="keywordtype">int</span> labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());</div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>       <span class="keywordflow">if</span>(labelIndex>=0){</div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>         <span class="keywordtype">string</span> classRef=poFeature->GetFieldAsString(labelIndex);</div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>         <span class="keywordflow">if</span>(classRef!=<span class="stringliteral">"0"</span>){</div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>           <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>         cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);</div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>         cm.incrementResult(classRef,classOut,1);</div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>         }</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>       }</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>       CPLErrorReset();</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>         <span class="keywordflow">if</span>(imgWriterOgr.createFeature(poDstFeature,ilayer) != OGRERR_NONE){</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
+<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
+<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>         }</div>
+<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>       }</div>
+<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>       ++ifeature;</div>
+<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
+<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1.0)/nFeatures;</div>
+<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>       }</div>
+<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>       OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>       OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>     }<span class="comment">//get next feature</span></div>
+<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>       }<span class="comment">//next layer</span></div>
+<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>       imgReaderOgr.close();</div>
+<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>     imgWriterOgr.close();</div>
+<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>     }</div>
+<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>     <span class="keywordflow">if</span>(cm.nReference()){</div>
+<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>       std::cout << cm << std::endl;</div>
+<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>       cout << <span class="stringliteral">"class #samples userAcc prodAcc"</span> << endl;</div>
+<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>       <span class="keywordtype">double</span> se95_ua=0;</div>
+<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>       <span class="keywordtype">double</span> se95_pa=0;</div>
+<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>       <span class="keywordtype">double</span> se95_oa=0;</div>
+<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>       <span class="keywordtype">double</span> dua=0;</div>
+<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>       <span class="keywordtype">double</span> dpa=0;</div>
+<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>       <span class="keywordtype">double</span> doa=0;</div>
+<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<cm.nClasses();++iclass){</div>
+<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>     dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</div>
+<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>     dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</div>
+<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>     cout << cm.getClass(iclass) << <span class="stringliteral">" "</span> << cm.nReference(cm.getClass(iclass)) << <span class="stringliteral">" "</span> << dua << <span class="stringliteral">" ("</span> << se95_ua << <span class="stringliteral">")"</span> << <span class="stringliteral">" "</span> << dp [...]
+<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>       }</div>
+<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>       std::cout << <span class="stringliteral">"Kappa: "</span> << cm.kappa() << std::endl;</div>
+<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>       doa=cm.oa(&se95_oa);</div>
+<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>       std::cout << <span class="stringliteral">"Overall Accuracy: "</span> << 100*doa << <span class="stringliteral">" ("</span> << 100*se95_oa << <span class="stringliteral">")"</span>  << std::endl;</div>
+<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>     }</div>
+<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>   }</div>
+<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>     <span class="keywordflow">if</span>(active_opt.size())</div>
+<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>       activeWriter.close();</div>
 <div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>   }</div>
-<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span> </div>
-<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>     <span class="comment">// svm_destroy_param[ibag](&param[ibag]);</span></div>
-<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>     svm_destroy_param(&param[ibag]);</div>
-<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>     free(prob[ibag].y);</div>
-<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>     free(prob[ibag].x);</div>
-<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>     free(x_space[ibag]);</div>
-<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>     svm_free_and_destroy_model(&(svm[ibag]));</div>
-<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>   }</div>
-<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>   <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span> }</div>
-<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
-<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
+<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>     std::cerr << <span class="stringliteral">"Error: errorString"</span> << std::endl;</div>
+<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>   }</div>
+<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span> </div>
+<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>     <span class="comment">// svm_destroy_param[ibag](&param[ibag]);</span></div>
+<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>     svm_destroy_param(&param[ibag]);</div>
+<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>     free(prob[ibag].y);</div>
+<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>     free(prob[ibag].x);</div>
+<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>     free(x_space[ibag]);</div>
+<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>     svm_free_and_destroy_model(&(svm[ibag]));</div>
+<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>   }</div>
+<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>   <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span> }</div>
+<div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00032">ImgReaderGdal.h:32</a></div></div>
+<div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00033">ImgWriterGdal.h:33</a></div></div>
 <div class="ttc" id="classBadConversion_html"><div class="ttname"><a href="classBadConversion.html">BadConversion</a></div><div class="ttdoc">throw this class when syntax error in command line option </div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00045">Optionpk.h:45</a></div></div>
 <div class="ttc" id="classDecrease__PosValue_html"><div class="ttname"><a href="classDecrease__PosValue.html">Decrease_PosValue</a></div><div class="ttdef"><b>Definition:</b> <a href="PosValue_8h_source.html#l00034">PosValue.h:34</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
@@ -1391,7 +1394,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm_8py_source.html b/doc/html/pksvm_8py_source.html
index 4bcc6a7..1690c8c 100644
--- a/doc/html/pksvm_8py_source.html
+++ b/doc/html/pksvm_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -199,7 +199,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm__gui_2main_8cpp_source.html b/doc/html/pksvm__gui_2main_8cpp_source.html
index 048ddf9..10a7727 100644
--- a/doc/html/pksvm__gui_2main_8cpp_source.html
+++ b/doc/html/pksvm__gui_2main_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm__gui_2mainwindow_8cpp_source.html b/doc/html/pksvm__gui_2mainwindow_8cpp_source.html
index f1c879e..6a0e1bc 100644
--- a/doc/html/pksvm__gui_2mainwindow_8cpp_source.html
+++ b/doc/html/pksvm__gui_2mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -337,7 +337,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm__gui_2mainwindow_8h_source.html b/doc/html/pksvm__gui_2mainwindow_8h_source.html
index d59235e..3be5391 100644
--- a/doc/html/pksvm__gui_2mainwindow_8h_source.html
+++ b/doc/html/pksvm__gui_2mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -135,7 +135,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktestOption_8cc_source.html b/doc/html/pktestOption_8cc_source.html
index 548d296..bbb34ef 100644
--- a/doc/html/pktestOption_8cc_source.html
+++ b/doc/html/pktestOption_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -113,7 +113,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktoolsAlgorithmProvider_8py_source.html b/doc/html/pktoolsAlgorithmProvider_8py_source.html
index b7bb6a0..9745ae5 100644
--- a/doc/html/pktoolsAlgorithmProvider_8py_source.html
+++ b/doc/html/pktoolsAlgorithmProvider_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -184,7 +184,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktoolsAlgorithm_8py_source.html b/doc/html/pktoolsAlgorithm_8py_source.html
index c2b7fe2..21c7881 100644
--- a/doc/html/pktoolsAlgorithm_8py_source.html
+++ b/doc/html/pktoolsAlgorithm_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -113,7 +113,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktoolsUtils_8py_source.html b/doc/html/pktoolsUtils_8py_source.html
index 96c86a5..dbf8928 100644
--- a/doc/html/pktoolsUtils_8py_source.html
+++ b/doc/html/pktoolsUtils_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -150,7 +150,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2ProcessingPktoolsPlugin_8py_source.html b/doc/html/pktools_2ProcessingPktoolsPlugin_8py_source.html
index 84cdfaf..6dff032 100644
--- a/doc/html/pktools_2ProcessingPktoolsPlugin_8py_source.html
+++ b/doc/html/pktools_2ProcessingPktoolsPlugin_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -107,7 +107,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2____init_____8py_source.html b/doc/html/pktools_2____init_____8py_source.html
index b1ce6cc..e06a6bd 100644
--- a/doc/html/pktools_2____init_____8py_source.html
+++ b/doc/html/pktools_2____init_____8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pkcomposite_8py_source.html b/doc/html/pktools_2pkcomposite_8py_source.html
index 4252759..f68f7dd 100644
--- a/doc/html/pktools_2pkcomposite_8py_source.html
+++ b/doc/html/pktools_2pkcomposite_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -233,7 +233,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pkcrop_8py_source.html b/doc/html/pktools_2pkcrop_8py_source.html
index d90b13d..4a7196e 100644
--- a/doc/html/pktools_2pkcrop_8py_source.html
+++ b/doc/html/pktools_2pkcrop_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -200,7 +200,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pkdiff__accuracy_8py_source.html b/doc/html/pktools_2pkdiff__accuracy_8py_source.html
index aa12708..485e9e5 100644
--- a/doc/html/pktools_2pkdiff__accuracy_8py_source.html
+++ b/doc/html/pktools_2pkdiff__accuracy_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -261,7 +261,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pkextract_8py_source.html b/doc/html/pktools_2pkextract_8py_source.html
index 5cf2e77..0a05ca8 100644
--- a/doc/html/pktools_2pkextract_8py_source.html
+++ b/doc/html/pktools_2pkextract_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -262,7 +262,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pkextract__grid_8py_source.html b/doc/html/pktools_2pkextract__grid_8py_source.html
index 3853894..f223c73 100644
--- a/doc/html/pktools_2pkextract__grid_8py_source.html
+++ b/doc/html/pktools_2pkextract__grid_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -246,7 +246,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pkextract__random_8py_source.html b/doc/html/pktools_2pkextract__random_8py_source.html
index 62158bb..ad9f55f 100644
--- a/doc/html/pktools_2pkextract__random_8py_source.html
+++ b/doc/html/pktools_2pkextract__random_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -249,7 +249,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pkfilter__spatial_8py_source.html b/doc/html/pktools_2pkfilter__spatial_8py_source.html
index b849f4b..94c6b7f 100644
--- a/doc/html/pktools_2pkfilter__spatial_8py_source.html
+++ b/doc/html/pktools_2pkfilter__spatial_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -183,7 +183,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pkfilter__spectral_8py_source.html b/doc/html/pktools_2pkfilter__spectral_8py_source.html
index 2ad847a..d1d2a74 100644
--- a/doc/html/pktools_2pkfilter__spectral_8py_source.html
+++ b/doc/html/pktools_2pkfilter__spectral_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -177,7 +177,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pkfilterdem_8py_source.html b/doc/html/pktools_2pkfilterdem_8py_source.html
index 11aee87..acb9ea6 100644
--- a/doc/html/pktools_2pkfilterdem_8py_source.html
+++ b/doc/html/pktools_2pkfilterdem_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -163,7 +163,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pkgetmask_8py_source.html b/doc/html/pktools_2pkgetmask_8py_source.html
index f4935ae..c40a453 100644
--- a/doc/html/pktools_2pkgetmask_8py_source.html
+++ b/doc/html/pktools_2pkgetmask_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -196,7 +196,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pklas2img_8py_source.html b/doc/html/pktools_2pklas2img_8py_source.html
index 3f9a5c2..84fe53d 100644
--- a/doc/html/pktools_2pklas2img_8py_source.html
+++ b/doc/html/pktools_2pklas2img_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -206,7 +206,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pkreclass_8py_source.html b/doc/html/pktools_2pkreclass_8py_source.html
index ca93488..d58ffaa 100644
--- a/doc/html/pktools_2pkreclass_8py_source.html
+++ b/doc/html/pktools_2pkreclass_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -195,7 +195,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pksetmask_8py_source.html b/doc/html/pktools_2pksetmask_8py_source.html
index a085649..2d3f838 100644
--- a/doc/html/pktools_2pksetmask_8py_source.html
+++ b/doc/html/pktools_2pksetmask_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -184,7 +184,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pksvm_8py_source.html b/doc/html/pktools_2pksvm_8py_source.html
index 71941aa..7961c4e 100644
--- a/doc/html/pktools_2pksvm_8py_source.html
+++ b/doc/html/pktools_2pksvm_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -198,7 +198,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pktoolsAlgorithmProvider_8py_source.html b/doc/html/pktools_2pktoolsAlgorithmProvider_8py_source.html
index 91c0ee8..a07967b 100644
--- a/doc/html/pktools_2pktoolsAlgorithmProvider_8py_source.html
+++ b/doc/html/pktools_2pktoolsAlgorithmProvider_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -184,7 +184,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pktoolsAlgorithm_8py_source.html b/doc/html/pktools_2pktoolsAlgorithm_8py_source.html
index 123e6f0..8454453 100644
--- a/doc/html/pktools_2pktoolsAlgorithm_8py_source.html
+++ b/doc/html/pktools_2pktoolsAlgorithm_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -114,7 +114,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktools_2pktoolsUtils_8py_source.html b/doc/html/pktools_2pktoolsUtils_8py_source.html
index 6b04b61..e005f98 100644
--- a/doc/html/pktools_2pktoolsUtils_8py_source.html
+++ b/doc/html/pktools_2pktoolsUtils_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -150,7 +150,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structIndexValue-members.html b/doc/html/structIndexValue-members.html
index 0841284..3d26145 100644
--- a/doc/html/structIndexValue-members.html
+++ b/doc/html/structIndexValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -60,7 +60,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structIndexValue.html b/doc/html/structIndexValue.html
index 6aacef3..32d199e 100644
--- a/doc/html/structIndexValue.html
+++ b/doc/html/structIndexValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,7 +74,7 @@ double </td><td class="memItemRight" valign="bottom"><b>value</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structPosValue-members.html b/doc/html/structPosValue-members.html
index d572a2e..ba827c3 100644
--- a/doc/html/structPosValue-members.html
+++ b/doc/html/structPosValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -61,7 +61,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structPosValue.html b/doc/html/structPosValue.html
index 2408e68..b5a276a 100644
--- a/doc/html/structPosValue.html
+++ b/doc/html/structPosValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,7 +77,7 @@ double </td><td class="memItemRight" valign="bottom"><b>value</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structSolver_1_1SolutionInfo-members.html b/doc/html/structSolver_1_1SolutionInfo-members.html
index 655c739..cafdab8 100644
--- a/doc/html/structSolver_1_1SolutionInfo-members.html
+++ b/doc/html/structSolver_1_1SolutionInfo-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -67,7 +67,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structSolver_1_1SolutionInfo.html b/doc/html/structSolver_1_1SolutionInfo.html
index 2cd0428..091f168 100644
--- a/doc/html/structSolver_1_1SolutionInfo.html
+++ b/doc/html/structSolver_1_1SolutionInfo.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@ double </td><td class="memItemRight" valign="bottom"><b>r</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structdecision__function-members.html b/doc/html/structdecision__function-members.html
index 57d594e..4e41ac0 100644
--- a/doc/html/structdecision__function-members.html
+++ b/doc/html/structdecision__function-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -60,7 +60,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structdecision__function.html b/doc/html/structdecision__function.html
index 43c7ad2..6a871ab 100644
--- a/doc/html/structdecision__function.html
+++ b/doc/html/structdecision__function.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,7 +74,7 @@ double </td><td class="memItemRight" valign="bottom"><b>rho</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__model-members.html b/doc/html/structsvm__model-members.html
index 3626b45..8cb277b 100644
--- a/doc/html/structsvm__model-members.html
+++ b/doc/html/structsvm__model-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -69,7 +69,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__model.html b/doc/html/structsvm__model.html
index e74b014..6dfa92a 100644
--- a/doc/html/structsvm__model.html
+++ b/doc/html/structsvm__model.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -108,7 +108,7 @@ int </td><td class="memItemRight" valign="bottom"><b>free_sv</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__node-members.html b/doc/html/structsvm__node-members.html
index 288f402..d5ffefc 100644
--- a/doc/html/structsvm__node-members.html
+++ b/doc/html/structsvm__node-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -60,7 +60,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__node.html b/doc/html/structsvm__node.html
index d1971ce..6647e18 100644
--- a/doc/html/structsvm__node.html
+++ b/doc/html/structsvm__node.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,7 +74,7 @@ double </td><td class="memItemRight" valign="bottom"><b>value</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__parameter-members.html b/doc/html/structsvm__parameter-members.html
index 87a8a17..e1a1fb9 100644
--- a/doc/html/structsvm__parameter-members.html
+++ b/doc/html/structsvm__parameter-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,7 +74,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__parameter.html b/doc/html/structsvm__parameter.html
index b08fde9..950dac1 100644
--- a/doc/html/structsvm__parameter.html
+++ b/doc/html/structsvm__parameter.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -116,7 +116,7 @@ bool </td><td class="memItemRight" valign="bottom"><b>verbose</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__problem-members.html b/doc/html/structsvm__problem-members.html
index 0bd48c8..74ee752 100644
--- a/doc/html/structsvm__problem-members.html
+++ b/doc/html/structsvm__problem-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -61,7 +61,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__problem.html b/doc/html/structsvm__problem.html
index 88804bf..8c4b97f 100644
--- a/doc/html/structsvm__problem.html
+++ b/doc/html/structsvm__problem.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -84,7 +84,7 @@ struct <a class="el" href="structsvm__node.html">svm_node</a> ** </td><td c
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:06 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/svm_8cpp_source.html b/doc/html/svm_8cpp_source.html
index b77afb9..2b93c3c 100644
--- a/doc/html/svm_8cpp_source.html
+++ b/doc/html/svm_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -3196,7 +3196,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/svm_8h_source.html b/doc/html/svm_8h_source.html
index fa6300a..146302f 100644
--- a/doc/html/svm_8h_source.html
+++ b/doc/html/svm_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.4</span>
+    <span id="projectnumber">2.6.6</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -162,7 +162,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Wed Jan 20 2016 09:05:05 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/installation_linux.dox b/doc/installation_linux.dox
index 56ba035..98268ad 100644
--- a/doc/installation_linux.dox
+++ b/doc/installation_linux.dox
@@ -37,6 +37,32 @@ tar xzvf pktools-latest.tar.gz
 cd pktools-*
 \endcode
 
+You can install pktools via
+    - \ref installation_autotools "autotools" (linux only)
+    - \ref installation_cmake "cmake" (linux, windows, Mac OS)
+
+\subsection installation_autotools Installation via autotools
+
+Add libtool support to your package:
+
+If you obtained pktools from the git repository, please please perform the following actions first (assuming the current directory is pktools):
+
+\code
+libtoolize
+\endcode
+
+Remake the GNU Build System files by scanning 'configure.ac' and running 'autoconf', 'autoheader', 'aclocal', 'automake' and 'libtoolize':
+
+\code
+autoreconf
+\endcode
+
+Finalize package generation:
+
+\code
+automake --add-missing
+\endcode
+
 Basic installation (please refer to INSTALL file for more advanced configuration)
 \code
 ./configure
@@ -143,3 +169,22 @@ packages to install before pktools
    sudo make install
    sudo ldconfig
    \endcode
+
+\subsection installation_cmake Installation via cmake (or ccmake)
+Note that CMake version 3.0 or higher is required for building via cmake
+We will build out-of-source:
+
+\code
+mkdir build
+cd build
+ccmake ..
+\endcode
+
+Within ccmake, press "c" to configure. Make sure all paths are correctly set.
+Then press "g" to generate and exit ccmake.
+
+Compile and link via make:
+
+\code
+make
+\endcode
diff --git a/doc/installation_windows.dox b/doc/installation_windows.dox
index 7705fa6..61575c0 100644
--- a/doc/installation_windows.dox
+++ b/doc/installation_windows.dox
@@ -1,18 +1,41 @@
 \section installation_windows Installation on Windows machines
 
-\subsection installation_windows_dependencies Dependencies: OSGeo4W
+\subsection installation_windows_dependencies Dependencies: OSGeo4W and Visual Studio redistributables
 
-Download and install the ​<a href="http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86.exe">32bit</a> or ​<a href="http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe">64bit</a> version of <a href="osgeo4w.osgeo.org">OSGeo4W</a>. The basic installation with GDAL contains all dependencies that are required for pktools.
+Download and install the ​<a href="http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86.exe">32bit</a> or ​<a href="http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe">64bit</a> (preferred) version of <a href="osgeo4w.osgeo.org">OSGeo4W</a>. The basic installation with GDAL contains most dependencies that are required for pktools.
 
-\subsection Installation_windows_pktools pktools
+Download and install the ​<a href="http://www.microsoft.com/en-us/download/details.aspx?id=48145">redistributables</a> for Visual Studio 2015.
 
-The latest version of pktools for Windows is available for <a href="http://download.savannah.gnu.org/releases/pktools/pktools-latest_win32.zip">32bit</a> and <a href="http://download.savannah.gnu.org/releases/pktools/pktools-latest_win64.zip">64bit</a> architectures from the <a href="http://download.savannah.gnu.org/releases/pktools">download</a> ftp server.
+Please make sure the latest version of pktools is always installed. Changes with respect to the previous versions can be checked in the text file <a href="http://git.savannah.gnu.org/cgit/pktools.git/tree/ChangeLog">Changelog</a>. Older versions of pktools were installed with a setup exe file. They should be uninstalled first via Programs and Features in Control Panel.
 
-Unzip the archives to your local hard drive. 
+\subsection Installation_windows_binaries Binary packages of pktools
 
-\subsection Installation_windows_cli Command line interface
+Binary packages of pktools are available for Windows on the <a href="http://download.savannah.gnu.org/releases/pktools">ftp server</a>. Latest versions are only available for <a href="http://download.savannah.gnu.org/releases/pktools/pktools-latest_win64.zip">64bit</a> architectures. 
+Older versions of pktools are also available for 32 bit architectures
 
-The pktools utilities can be run from the command line using a command prompt window (from the Start button, click All Programs, Accessories, and then Command Prompt). First add the bin directory extracted from the pktools zip archive to the environment variable PATH (from the Start button, click on  control panel, then System, Advanced system settings, select Environment Variables and edit PATH)
+Unzip the archives to your local hard drive. Then copy the pktools folder in the OSGeo apps directory (e.g., "C:\OSGeoW64\apps")
 
-\subsection Uninstall_windows Older versions of pktools
-Please make sure the latest version of pktools is always installed. Changes with respect to the previous versions can be checked in the text file <a href="http://git.savannah.gnu.org/cgit/pktools.git/tree/ChangeLog">Changelog</a>. Older versions of pktools were installed with a setup exe file. They should be uninstalled first via Programs and Features in Control Panel.
+\subsection Installation_windows_cmake Manual installation via cmake
+
+If you prefer to compile pktools yourself, the easiest way is to use CMake. First, install CMake on your machine (version 3.0 or higher). These dependency packages must also be pre-installed: <a href="http://arma.sourceforge.net/download.html">Armadillo</a> and <a href="http://ab-initio.mit.edu/wiki/index.php/NLopt_on_Windows">NLOpt</a> (for the utility pkoptsvm only).
+
+Set the source directory in CMake to the pktools directory. Build out-of-source by setting a "build" directory, where binaries will be created.
+
+Specify the generator for building the pktools (e.g., Visual Studio 14 2015 Win64 for 64 bit architectures). You can leave the default native compilers checked. 
+
+Add the OSGeoW64 and armadillo paths to the CMAKE_INSTALL_PREFIX (via the button "add Entry"). Other paths for dependencies on FANN and NLOPT should also be added here.
+
+Click on the "Configure" button. 
+
+Under "BUILD" you can now select extra utilities based on FANN, LIBLAS and NLOPT. Click again on "Configure". Make sure all dependencies are resolved. 
+
+Then press "Generate". 
+
+A Visual Studio project (PKTOOLS.sln) will be created in the build directory. Open the project in Visual Studio and build the solution.
+
+\subsection run_windows How to run pktools in Windows
+
+The pktools utilities can be run from the command line using the OSGEo4W Shell. 
+A selection of them can also be run from within \ref qgis_plugin "QGIS", via the Processing Toolbox. 
+
+To run the pktools utilities from a simple Windows cmd shell, you first have to set some environment variables. This can be done by executing the batch file o4w_env.bat, located in OSGeo4W64\bin from within the cmd shell.
\ No newline at end of file
diff --git a/src/algorithms/FeatureSelector.h b/src/algorithms/FeatureSelector.h
index 5072ebd..503aa50 100644
--- a/src/algorithms/FeatureSelector.h
+++ b/src/algorithms/FeatureSelector.h
@@ -349,7 +349,7 @@ template<class T> double FeatureSelector::removeFeature(std::vector< Vector2d<T>
     }
     tmpset.push_front(last);
   }
-  if(maxCost<0){//all levels removed were catched
+  if(maxCost<0){//all levels removed were caught
     subset=catchset;
   }
   //test: assert list contains no duplicate elements
diff --git a/src/apps/Makefile.am b/src/apps/Makefile.am
index 6b8fe52..39c7ed1 100644
--- a/src/apps/Makefile.am
+++ b/src/apps/Makefile.am
@@ -10,7 +10,7 @@ LDADD = $(GSL_LIBS) $(GDAL_LDFLAGS) $(top_builddir)/src/algorithms/libalgorithms
 bin_PROGRAMS = pkinfo pkcrop pkdiff pkgetmask pksetmask pkcreatect pkdumpimg pkdumpogr pksieve pkstat pkstatascii pkstatogr pkstatprofile pkegcs pkextract pkfillnodata pkfilter pkfilterdem pkfilterascii pkdsm2shadow pkcomposite pkpolygonize pkascii2img pksvm pkfssvm pkascii2ogr pkreclass pkkalman
 
 # the program to build but not install (the names of the final binaries)
-noinst_PROGRAMS = pkkalman
+#noinst_PROGRAMS = pkkalman
 
 
 if USE_FANN
@@ -38,7 +38,7 @@ pkoptsvm_LDADD = $(GSL_LIBS) $(AM_LDFLAGS) -lnlopt -lgsl
 endif
 # list of sources for the binaries
 pkinfo_SOURCES = pkinfo.cc
-pkinfo_LDADD = -lgsl
+pkinfo_LDADD = $(AM_LDFLAGS) -lgsl
 pkcrop_SOURCES = pkcrop.cc
 pkcrop_LDADD = -lgsl
 pkdiff_SOURCES = pkdiff.cc
diff --git a/src/apps/Makefile.in b/src/apps/Makefile.in
index 1cf2554..7160b4a 100644
--- a/src/apps/Makefile.in
+++ b/src/apps/Makefile.in
@@ -89,7 +89,9 @@ bin_PROGRAMS = pkinfo$(EXEEXT) pkcrop$(EXEEXT) pkdiff$(EXEEXT) \
 	pkascii2img$(EXEEXT) pksvm$(EXEEXT) pkfssvm$(EXEEXT) \
 	pkascii2ogr$(EXEEXT) pkreclass$(EXEEXT) pkkalman$(EXEEXT) \
 	$(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
-noinst_PROGRAMS = pkkalman$(EXEEXT)
+
+# the program to build but not install (the names of the final binaries)
+#noinst_PROGRAMS = pkkalman
 @USE_FANN_TRUE at am__append_1 = pkann pkfsann pkregann
 @USE_LAS_TRUE at am__append_2 = pklas2img
 @USE_NLOPT_TRUE at am__append_3 = pkoptsvm
@@ -112,7 +114,7 @@ CONFIG_CLEAN_VPATH_FILES =
 @USE_LAS_TRUE at am__EXEEXT_2 = pklas2img$(EXEEXT)
 @USE_NLOPT_TRUE at am__EXEEXT_3 = pkoptsvm$(EXEEXT)
 am__installdirs = "$(DESTDIR)$(bindir)"
-PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+PROGRAMS = $(bin_PROGRAMS)
 am__pkann_SOURCES_DIST = $(top_srcdir)/src/algorithms/myfann_cpp.h \
 	pkann.cc
 @USE_FANN_TRUE at am_pkann_OBJECTS = pkann-pkann.$(OBJEXT)
@@ -229,7 +231,7 @@ pkgetmask_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(top_builddir)/src/fileclasses/libfileClasses.la
 am_pkinfo_OBJECTS = pkinfo.$(OBJEXT)
 pkinfo_OBJECTS = $(am_pkinfo_OBJECTS)
-pkinfo_DEPENDENCIES =
+pkinfo_DEPENDENCIES = $(am__DEPENDENCIES_2)
 am_pkkalman_OBJECTS = pkkalman.$(OBJEXT) ImgRegression.$(OBJEXT)
 pkkalman_OBJECTS = $(am_pkkalman_OBJECTS)
 pkkalman_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
@@ -561,7 +563,7 @@ LDADD = $(GSL_LIBS) $(GDAL_LDFLAGS) $(top_builddir)/src/algorithms/libalgorithms
 @USE_NLOPT_TRUE at pkoptsvm_LDADD = $(GSL_LIBS) $(AM_LDFLAGS) -lnlopt -lgsl
 # list of sources for the binaries
 pkinfo_SOURCES = pkinfo.cc
-pkinfo_LDADD = -lgsl
+pkinfo_LDADD = $(AM_LDFLAGS) -lgsl
 pkcrop_SOURCES = pkcrop.cc
 pkcrop_LDADD = -lgsl
 pkdiff_SOURCES = pkdiff.cc
@@ -688,15 +690,6 @@ clean-binPROGRAMS:
 	echo " rm -f" $$list; \
 	rm -f $$list
 
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-
 pkann$(EXEEXT): $(pkann_OBJECTS) $(pkann_DEPENDENCIES) $(EXTRA_pkann_DEPENDENCIES) 
 	@rm -f pkann$(EXEEXT)
 	$(AM_V_CXXLD)$(pkann_LINK) $(pkann_OBJECTS) $(pkann_LDADD) $(LIBS)
@@ -1110,8 +1103,7 @@ maintainer-clean-generic:
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-binPROGRAMS clean-generic clean-libtool \
-	clean-noinstPROGRAMS mostlyclean-am
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
@@ -1182,16 +1174,15 @@ uninstall-am: uninstall-binPROGRAMS
 .MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
-	clean-binPROGRAMS clean-generic clean-libtool \
-	clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-binPROGRAMS install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
+	clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
 	tags tags-am uninstall uninstall-am uninstall-binPROGRAMS
diff --git a/src/apps/pkann.cc b/src/apps/pkann.cc
index 53ceb92..7305d16 100644
--- a/src/apps/pkann.cc
+++ b/src/apps/pkann.cc
@@ -84,7 +84,7 @@ The utility pkann implements an artificial neural network (ANN) to solve a super
  | bs     | bsize                | int  | 100   |Percentage of features used from available training features for each bootstrap aggregation (one size for all classes, or a different size for each class respectively | 
  | cb     | classbag             | std::string |       |output for each individual bootstrap aggregation (default is blank) | 
  | m      | mask                 | std::string |       |Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata. | 
- | msknodata | msknodata            | short | 0     |mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. Default is 0 | 
+ | msknodata | msknodata            | short | 0     |mask value(s) not to consider for classification. Values will be taken over in classification image. Default is 0 | 
  | nodata | nodata               | unsigned short | 0     |nodata value to put where image is masked as nodata | 
  | o      | output               | std::string |       |output classification image | 
  | ot     | otype                | std::string |       |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
@@ -139,7 +139,7 @@ int main(int argc, char *argv[])
   Optionpk<int> bagSize_opt("bs", "bsize", "Percentage of features used from available training features for each bootstrap aggregation (one size for all classes, or a different size for each class respectively", 100);
   Optionpk<string> classBag_opt("cb", "classbag", "output for each individual bootstrap aggregation (default is blank)"); 
   Optionpk<string> mask_opt("m", "mask", "Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata.");
-  Optionpk<short> msknodata_opt("msknodata", "msknodata", "mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. Default is 0", 0);
+  Optionpk<short> msknodata_opt("msknodata", "msknodata", "mask value(s) not to consider for classification. Values will be taken over in classification image. Default is 0", 0);
   Optionpk<unsigned short> nodata_opt("nodata", "nodata", "nodata value to put where image is masked as nodata", 0);
   Optionpk<string> output_opt("o", "output", "output classification image"); 
   Optionpk<string>  otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image");
@@ -369,9 +369,9 @@ int main(int argc, char *argv[])
       try{
 	ImgReaderOgr trainingReaderBag(training_opt[ibag]);
         if(band_opt.size())
-          totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);
+          totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt);
         else
-          totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);
+          totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt);
         if(trainingMap.size()<2){
           string errorstring="Error: could not read at least two classes from training file, did you provide class labels in training sample (see option label)?";
           throw(errorstring);
@@ -383,7 +383,7 @@ int main(int argc, char *argv[])
         exit(1);
       }
       catch(...){
-        cerr << "error catched" << std::endl;
+        cerr << "error caught" << std::endl;
         exit(1);
       }
       //delete class 0 ?
@@ -771,7 +771,7 @@ int main(int argc, char *argv[])
         exit(2);
       }
       catch(...){
-        cerr << "error catched" << std::endl;
+        cerr << "error caught" << std::endl;
         exit(1);
       }
     }
@@ -845,7 +845,7 @@ int main(int argc, char *argv[])
         exit(2);
       }
       catch(...){
-        cerr << "error catched" << std::endl;
+        cerr << "error caught" << std::endl;
         exit(1);
       }
       mask_opt.clear();
@@ -863,7 +863,7 @@ int main(int argc, char *argv[])
         exit(2);
       }
       catch(...){
-        cerr << "error catched" << std::endl;
+        cerr << "error caught" << std::endl;
         exit(1);
       }
     }
@@ -913,7 +913,7 @@ int main(int argc, char *argv[])
         exit(3);
       }
       catch(...){
-        cerr << "error catched" << std::endl;
+        cerr << "error caught" << std::endl;
         exit(3);
       }
       assert(nband==hpixel[0].size());
@@ -933,7 +933,7 @@ int main(int argc, char *argv[])
           exit(3);
         }
         catch(...){
-          cerr << "error catched" << std::endl;
+          cerr << "error caught" << std::endl;
           exit(3);
         }
       }
@@ -974,30 +974,30 @@ int main(int argc, char *argv[])
 		exit(1);
 	      }
 	      catch(...){
-		cerr << "error catched" << std::endl;
+		cerr << "error caught" << std::endl;
 		exit(3);
 	      }
 	      oldRowMask=rowMask;
 	    }
 	    short theMask=0;
 	    for(short ivalue=0;ivalue<msknodata_opt.size();++ivalue){
-	      if(msknodata_opt[ivalue]>=0){//values set in msknodata_opt are invalid
+	      // if(msknodata_opt[ivalue]>=0){//values set in msknodata_opt are invalid
 		if(lineMask[colMask]==msknodata_opt[ivalue]){
 		  theMask=lineMask[colMask];
 		  masked=true;
 		  break;
 		}
-	      }
-	      else{//only values set in msknodata_opt are valid
-		if(lineMask[colMask]!=-msknodata_opt[ivalue]){
-		  theMask=lineMask[colMask];
-		  masked=true;
-		}
-		else{
-		  masked=false;
-		  break;
-		}
-	      }
+	      // }
+	      // else{//only values set in msknodata_opt are valid
+	      // 	if(lineMask[colMask]!=-msknodata_opt[ivalue]){
+	      // 	  theMask=lineMask[colMask];
+	      // 	  masked=true;
+	      // 	}
+	      // 	else{
+	      // 	  masked=false;
+	      // 	  break;
+	      // 	}
+	      // }
 	    }
 	    if(masked){
 	      if(classBag_opt.size())
diff --git a/src/apps/pkcomposite.cc b/src/apps/pkcomposite.cc
index fcc3b4c..c99ed57 100644
--- a/src/apps/pkcomposite.cc
+++ b/src/apps/pkcomposite.cc
@@ -43,7 +43,7 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
   Options: [-b band]* [-dx xres] [-dy yres] [-e vector] [-ulx ULX -uly ULY -lrx LRX -lry LRY] [-cr rule] [-cb band] [-srcnodata value] [-bndnodata band] [-min value] [-max value] [-dstnodata value] [-r resampling_method] [-ot {Byte / Int16 / UInt16 / UInt32 / Int32 / Float32 / Float64 / CInt16 / CInt32 / CFloat32 / CFloat64}] [-of format] [-co NAME=VALUE]* [-a_srs epsg:number]
 
   Advanced options:
-       [-file] [-w weight]* [-c class]* [-ct colortable] [-d description]
+       [-file] [-w weight]* [-c class]* [-ct colortable] [-d description] [-align]
 </code>
 
 \section pkcomposite_description Description
@@ -120,6 +120,7 @@ pkcomposite -i input1.tif -i input2.tif -o minimum.tif -cr minallbands
  | w      | weight               | short | 1     |Weights (type: short) for the composite, use one weight for each input file in same order as input files are provided). Use value 1 for equal weights. | 
  | c      | class                | short | 0     |classes for multi-band output image: each band represents the number of observations for one specific class. Use value 0 for no multi-band output image. | 
  | ct     | ct                   | std::string |       |color table file with 5 columns: id R G B ALFA (0: transparent, 255: solid) | 
+ | align  | align                | bool  |       |Align output bounding box to first input image | 
  | d      | description          | std::string |       |Set image description | 
 
 Examples
@@ -170,6 +171,7 @@ int main(int argc, char *argv[])
   Optionpk<short> class_opt("c", "class", "classes for multi-band output image: each band represents the number of observations for one specific class. Use value 0 for no multi-band output image.", 0);
   Optionpk<string>  colorTable_opt("ct", "ct", "color table file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
   Optionpk<string>  description_opt("d", "description", "Set image description");
+  Optionpk<bool>  align_opt("align", "align", "Align output bounding box to input image",false);
   Optionpk<short>  verbose_opt("v", "verbose", "verbose", 0,2);
 
   extent_opt.setHide(1);
@@ -217,6 +219,7 @@ int main(int argc, char *argv[])
     class_opt.retrieveOption(argc,argv);
     colorTable_opt.retrieveOption(argc,argv);
     description_opt.retrieveOption(argc,argv);
+    align_opt.retrieveOption(argc,argv);
     verbose_opt.retrieveOption(argc,argv);
   }
   catch(string predefinedString){
@@ -532,6 +535,24 @@ int main(int argc, char *argv[])
     minLRY=floor(minLRY);
     minLRY-=static_cast<int>(minLRY)%(static_cast<int>(dy));
   }
+  else if(align_opt[0]){
+    if(minULX>imgReader[0].getUlx())
+      minULX-=fmod(minULX-imgReader[0].getUlx(),dx);
+    else if(minULX<imgReader[0].getUlx())
+      minULX+=fmod(imgReader[0].getUlx()-minULX,dx)-dx;
+    if(maxLRX<imgReader[0].getLrx())
+      maxLRX+=fmod(imgReader[0].getLrx()-maxLRX,dx);
+    else if(maxLRX>imgReader[0].getLrx())
+      maxLRX-=fmod(maxLRX-imgReader[0].getLrx(),dx)+dx;
+    if(minLRY>imgReader[0].getLry())
+      minLRY-=fmod(minLRY-imgReader[0].getLry(),dy);
+    else if(minLRY<imgReader[0].getLry())
+      minLRY+=fmod(imgReader[0].getLry()-minLRY,dy)-dy;
+    if(maxULY<imgReader[0].getUly())
+      maxULY+=fmod(imgReader[0].getUly()-maxULY,dy);
+    else if(maxULY>imgReader[0].getUly())
+      maxULY-=fmod(maxULY-imgReader[0].getUly(),dy)+dy;
+  }
 
   if(verbose_opt[0])
     cout << "bounding box composite image (ULX ULY LRX LRY): " << fixed << setprecision(6) << minULX << " " << maxULY << " " << maxLRX << " " << minLRY << endl;
@@ -633,7 +654,7 @@ int main(int argc, char *argv[])
       exit(2);
     }
     catch(...){
-      cerr << "error catched" << std::endl;
+      cerr << "error caught" << std::endl;
       exit(1);
     }
     //todo: support multiple masks
@@ -656,7 +677,7 @@ int main(int argc, char *argv[])
       exit(2);
     }
     catch(...){
-      cerr << "error catched" << std::endl;
+      cerr << "error caught" << std::endl;
       exit(1);
     }
   }
@@ -799,7 +820,7 @@ int main(int argc, char *argv[])
 		exit(1);
 	      }
 	      catch(...){
-		cerr << "error catched" << std::endl;
+		cerr << "error caught" << std::endl;
 		exit(3);
 	      }
 	      oldRowMask=rowMask;
diff --git a/src/apps/pkcrop.cc b/src/apps/pkcrop.cc
index 021f0e8..884d524 100644
--- a/src/apps/pkcrop.cc
+++ b/src/apps/pkcrop.cc
@@ -43,12 +43,14 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
   Options: [-of out_format] [-ot {Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}] [-b band]* [-ulx ULX -uly ULY -lrx LRX -lry LRY] [-dx xres] [-dy yres] [-r resampling_method] [-a_srs epsg:number] [-nodata value] 
 
   Advanced options:
-  	   [-e vector [-cut]] [-sband band -eband band]* [-co NAME=VALUE]* [-x center_x -y center_y] [-nx size_x -ny size_y] [-ns nsample -nl nlines] [-as min -as max] [-scale value]* [-off offset]* [-ct colortable] [-d description] 
+  	   [-e vector [-cut]] [-sband band -eband band]* [-co NAME=VALUE]* [-x center_x -y center_y] [-nx size_x -ny size_y] [-ns nsample -nl nlines] [-as min -as max] [-scale value]* [-off offset]* [-ct colortable] [-d description] [-align]
 </code>
 
 \section pkcrop_description Description
 
-The utility pkcrop can subset and stack raster images. In the spatial domain it can crop a bounding box from a larger image. The output bounding box is selected by setting the new corner coordinates using the options -ulx -uly -lrx -lry. Alternatively you can set the new image center (-x -y) and size. This can be done either in projected coordinates (using the options -nx -ny) or in image coordinates (using the options -ns -nl). You can also use a vector file to set the new bounding box  [...]
+The utility pkcrop can subset and stack raster images. In the spatial domain it can crop a bounding box from a larger image. The output bounding box is selected by setting the new corner coordinates using the options -ulx -uly -lrx -lry. Alternatively you can set the new image center (-x -y) and size. This can be done either in projected coordinates (using the options -nx -ny) or in image coordinates (using the options -ns -nl). You can also use a vector file to set the new bounding box  [...]
+
+\section pkcrop_options Options
  - use either `-short` or `--long` options (both `--long=value` and `--long value` are supported)
  - short option `-h` shows basic options only, long option `--help` shows all options
 |short|long|type|default|description|
@@ -86,11 +88,9 @@ The utility pkcrop can subset and stack raster images. In the spatial domain it
  | scale  | scale                | double |       |output=scale*input+offset | 
  | off    | offset               | double |       |output=scale*input+offset | 
  | nodata | nodata               | float |       |Nodata value to put in image if out of bounds. | 
+ | align  | align                | bool  |       |Align output bounding box to input image | 
  | d      | description          | std::string |       |Set image description | 
 
-Usage: pkcrop -i input -o output
-
-
 Examples
 ========
 Some examples how to use pkcrop can be found \ref examples_pkcrop "here"
@@ -134,6 +134,7 @@ int main(int argc, char *argv[])
   Optionpk<float>  nodata_opt("nodata", "nodata", "Nodata value to put in image if out of bounds.");
   Optionpk<string>  resample_opt("r", "resampling-method", "Resampling method (near: nearest neighbor, bilinear: bi-linear interpolation).", "near");
   Optionpk<string>  description_opt("d", "description", "Set image description");
+  Optionpk<bool>  align_opt("align", "align", "Align output bounding box to input image",false);
   Optionpk<short>  verbose_opt("v", "verbose", "verbose", 0,2);
 
   extent_opt.setHide(1);
@@ -190,6 +191,7 @@ int main(int argc, char *argv[])
     offset_opt.retrieveOption(argc,argv);
     nodata_opt.retrieveOption(argc,argv);
     description_opt.retrieveOption(argc,argv);
+    align_opt.retrieveOption(argc,argv);
     verbose_opt.retrieveOption(argc,argv);
   }
   catch(string predefinedString){
@@ -416,7 +418,7 @@ int main(int argc, char *argv[])
       exit(2);
     }
     catch(...){
-      cerr << "error catched" << std::endl;
+      cerr << "error caught" << std::endl;
       exit(1);
     }
     //todo: support multiple masks
@@ -439,7 +441,7 @@ int main(int argc, char *argv[])
       exit(2);
     }
     catch(...){
-      cerr << "error catched" << std::endl;
+      cerr << "error caught" << std::endl;
       exit(1);
     }
   }
@@ -526,8 +528,24 @@ int main(int argc, char *argv[])
 	Egcs egcs;
         egcs.setLevel(egcs.res2level(dx));
 	egcs.force2grid(cropulx,cropuly,croplrx,croplry);
-	imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);
-	imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);
+      }
+      else if(align_opt[0]){
+      	if(cropulx>imgReader.getUlx())
+      	  cropulx-=fmod(cropulx-imgReader.getUlx(),dx);
+      	else if(cropulx<imgReader.getUlx())
+      	  cropulx+=fmod(imgReader.getUlx()-cropulx,dx)-dx;
+      	if(croplrx<imgReader.getLrx())
+      	  croplrx+=fmod(imgReader.getLrx()-croplrx,dx);
+      	else if(croplrx>imgReader.getLrx())
+      	  croplrx-=fmod(croplrx-imgReader.getLrx(),dx)+dx;
+      	if(croplry>imgReader.getLry())
+      	  croplry-=fmod(croplry-imgReader.getLry(),dy);
+      	else if(croplry<imgReader.getLry())
+      	  croplry+=fmod(imgReader.getLry()-croplry,dy)-dy;
+      	if(cropuly<imgReader.getUly())
+      	  cropuly+=fmod(imgReader.getUly()-cropuly,dy);
+      	else if(cropuly>imgReader.getUly())
+      	  cropuly-=fmod(cropuly-imgReader.getUly(),dy)+dy;
       }
       imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);
       imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);
@@ -746,7 +764,7 @@ int main(int argc, char *argv[])
 			exit(1);
 		      }
 		      catch(...){
-			cerr << "error catched" << std::endl;
+			cerr << "error caught" << std::endl;
 			exit(3);
 		      }
 		      oldRowMask=rowMask;
diff --git a/src/apps/pkextract.cc b/src/apps/pkextract.cc
index 98ad942..71cbdcd 100644
--- a/src/apps/pkextract.cc
+++ b/src/apps/pkextract.cc
@@ -898,15 +898,23 @@ int main(int argc, char *argv[])
     //support multiple layers
     int nlayerRead=sampleReaderOgr.getDataSource()->GetLayerCount();
     int ilayerWrite=0;
+    unsigned long int ntotalvalid=0;
+
     if(verbose_opt[0])
       std::cout << "number of layers: " << nlayerRead << endl;
       
     for(int ilayer=0;ilayer<nlayerRead;++ilayer){
       OGRLayer *readLayer=sampleReaderOgr.getLayer(ilayer);
       string currentLayername=readLayer->GetName();
-      if(layer_opt.size())
-	if(find(layer_opt.begin(),layer_opt.end(),currentLayername)==layer_opt.end())
+      int layerIndex=ilayer;
+      if(layer_opt.size()){
+	vector<string>::const_iterator it=find(layer_opt.begin(),layer_opt.end(),currentLayername);
+	if(it==layer_opt.end())
 	  continue;
+	else
+	  layerIndex=it-layer_opt.begin();
+      }
+      float theThreshold=(threshold_opt.size()==layer_opt.size())? threshold_opt[layerIndex]: threshold_opt[0];
       cout << "processing layer " << currentLayername << endl;
       
       readLayer->ResetReading();
@@ -982,7 +990,8 @@ int main(int argc, char *argv[])
       }
       OGRFeature *readFeature;
       unsigned long int ifeature=0;
-      unsigned long int nfeature=sampleReaderOgr.getFeatureCount();
+      unsigned long int nfeatureLayer=sampleReaderOgr.getFeatureCount(ilayer);
+      unsigned long int ntotalvalidLayer=0;
       progress=0;
       pfnProgress(progress,pszMessage,pProgressArg);
       while( (readFeature = readLayer->GetNextFeature()) != NULL ){
@@ -990,10 +999,12 @@ int main(int argc, char *argv[])
 	bool writeTest=false;//write this feature to test_opt[0] instead of output_opt
 	if(verbose_opt[0]>0)
 	  std::cout << "reading feature " << readFeature->GetFID() << std::endl;
-	if(threshold_opt[0]>0){//percentual value
+	if(theThreshold>0){//percentual value
+	  // if(!test_opt.size()&&ntotalvalid>threshold_opt[0]/100.0*nfeature)
+	  //   break;
 	  double p=static_cast<double>(rand())/(RAND_MAX);
 	  p*=100.0;
-	  if(p>threshold_opt[0]){
+	  if(p>theThreshold){
 	    if(test_opt.size())
 	      writeTest=true;
 	    else
@@ -1001,11 +1012,21 @@ int main(int argc, char *argv[])
 	  }
 	}
 	else{//absolute value
-	  if(ntotalvalid>=-threshold_opt[0]){
-	    if(test_opt.size())
-	      writeTest=true;
-	    else
-	      continue;//do not select any more pixels, go to next column feature
+	  if(threshold_opt.size()==layer_opt.size()){
+	    if(ntotalvalidLayer>=-theThreshold){
+	      if(test_opt.size())
+		writeTest=true;
+	      else
+		continue;//do not select any more pixels, go to next column feature
+	    }
+	  }
+	  else{
+	    if(ntotalvalid>=-theThreshold){
+	      if(test_opt.size())
+		writeTest=true;
+	      else
+		continue;//do not select any more pixels, go to next column feature
+	    }
 	  }
 	}
 	if(verbose_opt[0]>0)
@@ -1289,8 +1310,7 @@ int main(int argc, char *argv[])
  		    //destroy feature
 		    OGRFeature::DestroyFeature( writePointFeature );
 		    ++ntotalvalid;
-		    if(verbose_opt[0])
-		      std::cout << "ntotalvalid(2): " << ntotalvalid << std::endl;
+		    ++ntotalvalidLayer;
 		  }
 		}
 	      }
@@ -1517,8 +1537,7 @@ int main(int argc, char *argv[])
 		}
 		OGRFeature::DestroyFeature( writePolygonFeature );
 		++ntotalvalid;
-		if(verbose_opt[0])
-		  std::cout << "ntotalvalid(1): " << ntotalvalid << std::endl;
+		++ntotalvalidLayer;
 	      }
 	      else{
 		if(verbose_opt[0]>1)
@@ -1539,8 +1558,7 @@ int main(int argc, char *argv[])
 		}
 		OGRFeature::DestroyFeature( writeCentroidFeature );
 		++ntotalvalid;
-		if(verbose_opt[0])
-		  std::cout << "ntotalvalid: " << ntotalvalid << std::endl;
+		++ntotalvalidLayer;
 	      }
 	    }
 	  }//if wkbPoint
@@ -1775,8 +1793,7 @@ int main(int argc, char *argv[])
 		    //destroy feature
 		    OGRFeature::DestroyFeature( writePointFeature );
 		    ++ntotalvalid;
-		    if(verbose_opt[0])
-		      std::cout << "ntotalvalid(2): " << ntotalvalid << std::endl;
+		    ++ntotalvalidLayer;
 		  }
 		}
 	      }
@@ -1988,8 +2005,7 @@ int main(int argc, char *argv[])
 		}
 		OGRFeature::DestroyFeature( writePolygonFeature );
 		++ntotalvalid;
-		if(verbose_opt[0])
-		  std::cout << "ntotalvalid(1): " << ntotalvalid << std::endl;
+		++ntotalvalidLayer;
 	      }
 	      else{
 		if(verbose_opt[0]>1)
@@ -2010,8 +2026,7 @@ int main(int argc, char *argv[])
 		}
 		OGRFeature::DestroyFeature( writeCentroidFeature );
 		++ntotalvalid;
-		if(verbose_opt[0])
-		  std::cout << "ntotalvalid: " << ntotalvalid << std::endl;
+		++ntotalvalidLayer;
 	      }
 	    }
 	  }
@@ -2243,8 +2258,7 @@ int main(int argc, char *argv[])
 		  }
 		  // ++isample;
 		  ++ntotalvalid;
-		  if(verbose_opt[0])
-		    std::cout << "ntotalvalid: " << ntotalvalid << std::endl;
+		  ++ntotalvalidLayer;
 	      }
 	    }
 	    if(!validFeature)
@@ -2455,8 +2469,7 @@ int main(int argc, char *argv[])
 		}
 		OGRFeature::DestroyFeature( writePolygonFeature );
 		++ntotalvalid;
-		if(verbose_opt[0])
-		  std::cout << "ntotalvalid: " << ntotalvalid << std::endl;
+		++ntotalvalidLayer;
 	      }
 	      else{
 		if(verbose_opt[0]>1)
@@ -2477,8 +2490,7 @@ int main(int argc, char *argv[])
 		}
 		OGRFeature::DestroyFeature( writeCentroidFeature );
 		++ntotalvalid;
-		if(verbose_opt[0])
-		  std::cout << "ntotalvalid: " << ntotalvalid << std::endl;
+		++ntotalvalidLayer;
 	      }
 	    }
 	  }
@@ -2490,7 +2502,14 @@ int main(int argc, char *argv[])
 	    throw(oss.str());
 	  }
 	  ++ifeature;
-	  progress=static_cast<float>(ifeature+1)/nfeature;
+	  if(theThreshold>0){
+	    if(threshold_opt.size()==layer_opt.size())
+	      progress=(100.0/theThreshold)*static_cast<float>(ntotalvalidLayer)/nfeatureLayer;
+	    else
+	      progress=static_cast<float>(ntotalvalidLayer)/nfeatureLayer;
+	  }
+ 	  else
+	    progress=static_cast<float>(ifeature+1)/(-theThreshold);
 	  pfnProgress(progress,pszMessage,pProgressArg);
 	}
 	catch(std::string e){
diff --git a/src/apps/pkfsann.cc b/src/apps/pkfsann.cc
index d876061..230cd05 100644
--- a/src/apps/pkfsann.cc
+++ b/src/apps/pkfsann.cc
@@ -448,7 +448,7 @@ int main(int argc, char *argv[])
     exit(1);
   }
   catch(...){
-    cerr << "error catched" << std::endl;
+    cerr << "error caught" << std::endl;
     exit(1);
   }
   //delete class 0 ?
@@ -695,7 +695,7 @@ int main(int argc, char *argv[])
     }
   }
   catch(...){
-    std::cout << "catched feature selection" << std::endl;
+    std::cout << "caught feature selection" << std::endl;
     exit(1);
   }
 
diff --git a/src/apps/pkfssvm.cc b/src/apps/pkfssvm.cc
index 047f0c4..ce9e997 100644
--- a/src/apps/pkfssvm.cc
+++ b/src/apps/pkfssvm.cc
@@ -492,7 +492,7 @@ int main(int argc, char *argv[])
     exit(1);
   }
   catch(...){
-    cerr << "error catched" << std::endl;
+    cerr << "error caught" << std::endl;
     exit(1);
   }
   //todo: delete class 0 ?
@@ -733,7 +733,7 @@ int main(int argc, char *argv[])
     }
   }
   catch(...){
-    std::cout << "catched feature selection" << std::endl;
+    std::cout << "caught feature selection" << std::endl;
     exit(1);
   }
 
diff --git a/src/apps/pkinfo.cc b/src/apps/pkinfo.cc
index 9619bc1..7a87141 100644
--- a/src/apps/pkinfo.cc
+++ b/src/apps/pkinfo.cc
@@ -370,7 +370,7 @@ int main(int argc, char *argv[])
       // 	std::cout << "image description: " << imgReader.getImageDescription() << std::endl;
       // }
       // catch(...){
-      // 	std::cout << "catched" << std::endl;
+      // 	std::cout << "caught" << std::endl;
       // }
       std::list<std::string> metaData;
       imgReader.getMetadata(metaData);
diff --git a/src/apps/pkkalman.cc b/src/apps/pkkalman.cc
index cb54d4e..ad03fbf 100644
--- a/src/apps/pkkalman.cc
+++ b/src/apps/pkkalman.cc
@@ -24,6 +24,7 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 #include "base/Vector2d.h"
 #include "imageclasses/ImgReaderGdal.h"
 #include "imageclasses/ImgWriterGdal.h"
+#include "imageclasses/ImgUpdaterGdal.h"
 #include "algorithms/StatFactory.h"
 
 /******************************************************************************/
@@ -32,26 +33,43 @@ produce kalman filtered raster time series
 ## SYNOPSIS
 
 <code>
-  
+  Usage: pkkalman -mod modelinput.tif -obs obsinput.tif [-direction [forward|backward|smooth]]* -ofw output_fc.tif -obw output_bw.tif -ofb output_fb.tif
+</code>
+
+<code>
+
+  Options[-tmod time]* [-tobs time]* [-modnodata value]* [-obsnodata value]* [-modmask mask.tif] [-obsmask mask.tif] [-msknodata value]* [-mskband] [-u_ofw uncert_fw.tif] [-u_obw uncert_bw.tif] [-u_ofb uncert_fb.tif]
+
+  Advanced options (see table)
 </code>
 
-\section pkkalman_options Options
+\section pkkalman_description Description
+
+The utilty pkkalman will complement a time series of observations (option -obs) at fine spatial resolution. A data assimilation technique based on a Kalman filter is hereby used. The data at fine spatial resolution are assimilated with coarse spatial resolution time series at a finer temporal resolution, referred to as a model (option -mod). The time series for both observation and model can either be provided as multi-band raster datasets or as multiple single band datasets. Missing dat [...]
+
+\section pkcrop_options Options
  - use either `-short` or `--long` options (both `--long=value` and `--long value` are supported)
  - short option `-h` shows basic options only, long option `--help` shows all options
-
 |short|long|type|default|description|
 |-----|----|----|-------|-----------|
  | dir    | direction            | std::string | forward |direction to run model (forward\|backward\|smooth) | 
- | mod    | model                | std::string |       |model input datasets, e.g., MODIS (use: -mod model1 -mod model2 etc. | 
- | obs    | observation          | std::string |       |observation input datasets, e.g., landsat (use: -obs obs1 -obs obs2 etc. | 
+ | mod    | model                | std::string |       |coarse spatial resolution input datasets(s) used as model. Use either multi-band input (-model multiband_model.tif) or multiple single-band inputs (-mod model1 -mod model2 etc.) | 
+ | modmask| modmask              | std::string |       |model mask datasets(s). Must have same dimension as model input. Use either multi-band input or multiple single-band inputs| 
+ | obs    | observation          | std::string |       |fine spatial resolution input dataset(s) used as observation. Use either multi-band input (-obs multiband_obs.tif) or multiple single-band inputs (-obs obs1 -obs obs2 etc.) | 
+ | obsmask| obsmask              | std::string |       |observation mask dataset(s). Must have same dimension as observation input (use multi-band input or multiple single-band inputs | 
  | tmod   | tmodel               | int  |       |time sequence of model input. Sequence must have exact same length as model input. Leave empty to have default sequence 0,1,2,etc. | 
- | tobs   | tobservation         | int  |       |time sequence of observation input. Sequence must have exact same length as observation input) | 
+ | tobs   | tobservation         | int  |       |time sequence of observation input. Sequence must have exact same length as observation input | 
  | a_srs  | a_srs                | std::string |       |Override the projection for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid | 
  | ofw    | outputfw             | std::string |       |Output raster dataset for forward model | 
+ | u_ofw  | u_outputfw           | std::string |       |Uncertainty output raster dataset for forward model | 
  | obw    | outputbw             | std::string |       |Output raster dataset for backward model | 
+ | u_obw  | u_outputbw           | std::string |       |Uncertainty output raster dataset for backward model | 
  | ofb    | outputfb             | std::string |       |Output raster dataset for smooth model | 
- | modnodata | modnodata            | double | 0     |invalid value for model input | 
+ | u_ofb  | u_outputfb           | std::string |       |Uncertainty output raster dataset for smooth model | 
+ | modnodata | modnodata         | double | 0     |invalid value for model input | 
  | obsnodata | obsnodata         | double | 0     |invalid value for observation input | 
+ | msknodata | msknodata         | float | 0     |Mask value not to consider
+ | mskband | mskband             | short | 0     |Mask band to read (0 indexed) | 
  | obsmin | obsmin               | double |      |Minimum value for observation data | 
  | obsmax | obsmax               | double |      |Maximum value for observation data | 
  | eps    | eps                  | double | 1e-05 |epsilon for non zero division | 
@@ -59,12 +77,15 @@ produce kalman filtered raster time series
  | uo     | uncertobs            | double | 1     |Uncertainty of valid observations | 
  | unodata | uncertnodata         | double | 100 |Uncertainty in case of no-data values in observation | 
  | q      | q                    | double | 1     |Process noise: expresses instability (variance) of proportions of fine res pixels within a moderate resolution pixel | 
- | down   | down                 | int  |       |Downsampling factor for reading model data to calculate regression | 
+ | down   | down                 | int  |       |Downsampling factor for reading model data to calculate regression (default is ratio between coarse (model) and fine (obs) resolution raster datasets)| 
  | ot     | otype                | std::string |       |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
  | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate).| 
  | co     | co                   | std::string |       |Creation option for output file. Multiple options can be specified. | 
  | v      | verbose              | short | 0     |verbose mode when positive | 
 
+Examples
+========
+Some examples how to use pkcrop can be found \ref examples_pkkalman "here"
 **/
 
 using namespace std;
@@ -73,23 +94,29 @@ using namespace std;
   ----------------*/
 int main(int argc,char **argv) {
   Optionpk<string> direction_opt("dir","direction","direction to run model (forward|backward|smooth)","forward");
-  Optionpk<string> model_opt("mod","model","model input datasets, e.g., MODIS (use: -mod model1 -mod model2 etc.)");
-  Optionpk<string> observation_opt("obs","observation","observation input datasets, e.g., landsat (use: -obs obs1 -obs obs2 etc.)");
+  Optionpk<string> model_opt("mod","model","coarse spatial resolution input datasets(s) used as model. Use either multi-band input (-model multiband_model.tif) or multiple single-band inputs (-mod model1 -mod model2 etc.)");
+  Optionpk<string> modelmask_opt("modmask","modmask","model mask datasets(s). Must have same dimension as model input. Use either multi-band input or multiple single-band inputs");
+  Optionpk<string> observation_opt("obs","observation","fine spatial resolution input dataset(s) used as observation. Use either multi-band input (-obs multiband_obs.tif) or multiple single-band inputs (-obs obs1 -obs obs2 etc.)");
+  Optionpk<string> observationmask_opt("obsmask","obsmask","observation mask dataset(s). Must have same dimension as observation input (use multi-band input or multiple single-band inputs");
   Optionpk<int> tmodel_opt("tmod","tmodel","time sequence of model input. Sequence must have exact same length as model input. Leave empty to have default sequence 0,1,2,etc."); 
   Optionpk<int> tobservation_opt("tobs","tobservation","time sequence of observation input. Sequence must have exact same length as observation input)"); 
   Optionpk<string>  projection_opt("a_srs", "a_srs", "Override the projection for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid");
   Optionpk<string> outputfw_opt("ofw", "outputfw", "Output raster dataset for forward model");
+  Optionpk<string> uncertfw_opt("u_ofw", "u_outputfw", "Uncertainty output raster dataset for forward model");
   Optionpk<string> outputbw_opt("obw", "outputbw", "Output raster dataset for backward model");
+  Optionpk<string> uncertbw_opt("u_obw", "u_outputbw", "Uncertainty output raster dataset for backward model");
   Optionpk<string> outputfb_opt("ofb", "outputfb", "Output raster dataset for smooth model");
+  Optionpk<string> uncertfb_opt("u_ofb", "u_outputfb", "Uncertainty output raster dataset for smooth model");
   Optionpk<string> gain_opt("gain", "gain", "Output raster dataset for gain");
-  
   Optionpk<double> modnodata_opt("modnodata", "modnodata", "invalid value for model input", 0);
   Optionpk<double> obsnodata_opt("obsnodata", "obsnodata", "invalid value for observation input", 0);
   Optionpk<double> obsmin_opt("obsmin", "obsmin", "Minimum value for observation data");
   Optionpk<double> obsmax_opt("obsmax", "obsmax", "Maximum value for observation data");
+  Optionpk<double> msknodata_opt("msknodata", "msknodata", "Mask value not to consider", 0);
+  Optionpk<short> mskband_opt("mskband", "mskband", "Mask band to read (0 indexed)", 0);
   Optionpk<double> eps_opt("eps", "eps", "epsilon for non zero division", 0.00001);
-  Optionpk<double> uncertModel_opt("um", "uncertmodel", "Uncertainty of model",1,1);
-  Optionpk<double> uncertObs_opt("uo", "uncertobs", "Uncertainty of valid observations",1,1);
+  Optionpk<double> uncertModel_opt("um", "uncertmodel", "Uncertainty of model",1);
+  Optionpk<double> uncertObs_opt("uo", "uncertobs", "Uncertainty of valid observations",1);
   Optionpk<double> processNoise_opt("q", "q", "Process noise: expresses instability (variance) of proportions of fine res pixels within a moderate resolution pixel",1);
   Optionpk<double> uncertNodata_opt("unodata", "uncertnodata", "Uncertainty in case of no-data values in observation", 100);
   Optionpk<int> down_opt("down", "down", "Downsampling factor for reading model data to calculate regression");
@@ -98,22 +125,50 @@ int main(int argc,char **argv) {
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<short> verbose_opt("v", "verbose", "verbose mode when positive", 0);
 
+  observationmask_opt.setHide(1);
+  modelmask_opt.setHide(1);
+  tmodel_opt.setHide(1);
+  tobservation_opt.setHide(1);
+  projection_opt.setHide(1);
+  uncertfw_opt.setHide(1);
+  uncertbw_opt.setHide(1);
+  uncertfb_opt.setHide(1);
+  obsmin_opt.setHide(1);
+  obsmax_opt.setHide(1);
+  msknodata_opt.setHide(1);
+  mskband_opt.setHide(1);
+  eps_opt.setHide(1);
+  uncertNodata_opt.setHide(1);
+  down_opt.setHide(1);
+  otype_opt.setHide(1);
+  oformat_opt.setHide(1);
+  option_opt.setHide(1);
+  verbose_opt.setHide(1);
+  gain_opt.setHide(2);
+
   bool doProcess;//stop process when program was invoked with help option (-h --help)
   try{
     doProcess=direction_opt.retrieveOption(argc,argv);
     model_opt.retrieveOption(argc,argv);
+    modelmask_opt.retrieveOption(argc,argv);
     observation_opt.retrieveOption(argc,argv);
+    observationmask_opt.retrieveOption(argc,argv);
     tmodel_opt.retrieveOption(argc,argv);
     tobservation_opt.retrieveOption(argc,argv);
     projection_opt.retrieveOption(argc,argv);
     outputfw_opt.retrieveOption(argc,argv);
+    uncertfw_opt.retrieveOption(argc,argv);
     outputbw_opt.retrieveOption(argc,argv);
+    uncertbw_opt.retrieveOption(argc,argv);
     outputfb_opt.retrieveOption(argc,argv);
+    uncertfb_opt.retrieveOption(argc,argv);
     gain_opt.retrieveOption(argc,argv);
     modnodata_opt.retrieveOption(argc,argv);
     obsnodata_opt.retrieveOption(argc,argv);
     obsmin_opt.retrieveOption(argc,argv);
     obsmax_opt.retrieveOption(argc,argv);
+    msknodata_opt.retrieveOption(argc,argv);
+    mskband_opt.retrieveOption(argc,argv);
     eps_opt.retrieveOption(argc,argv);
     uncertModel_opt.retrieveOption(argc,argv);
     uncertObs_opt.retrieveOption(argc,argv);
@@ -134,13 +189,9 @@ int main(int argc,char **argv) {
     exit(0);//help was invoked, stop processing
   }
 
-  if(down_opt.empty()){
-    std::cerr << "short option -h shows basic options only, use long option --help to show all options" << std::endl;
-    exit(0);//help was invoked, stop processing
-  }
   try{
     ostringstream errorStream;
-    if(model_opt.size()<2){
+    if(model_opt.size()<1){
       errorStream << "Error: no model dataset selected, use option -mod" << endl;
       throw(errorStream.str());
     }
@@ -148,46 +199,55 @@ int main(int argc,char **argv) {
       errorStream << "Error: no observation dataset selected, use option -obs" << endl;
       throw(errorStream.str());
     }
-    if(direction_opt[0]=="smooth"){
+    if(find(direction_opt.begin(),direction_opt.end(),"forward")!=direction_opt.end()){
       if(outputfw_opt.empty()){
 	errorStream << "Error: output forward datasets is not provided, use option -ofw" << endl;
 	throw(errorStream.str());
       }
+      if(uncertfw_opt.empty()){
+	ostringstream uncertStream;
+	uncertStream << outputfw_opt[0] << "_uncert";
+	uncertfw_opt.push_back(uncertStream.str());
+      }
+    }
+    if(find(direction_opt.begin(),direction_opt.end(),"backward")!=direction_opt.end()){
       if(outputbw_opt.empty()){
 	errorStream << "Error: output backward datasets is not provided, use option -obw" << endl;
 	throw(errorStream.str());
       }
-      if(outputfb_opt.empty()){
-	errorStream << "Error: output smooth datasets is not provided, use option -ofb" << endl;
-	throw(errorStream.str());
+      if(uncertbw_opt.empty()){
+	ostringstream uncertStream;
+	uncertStream << outputbw_opt[0] << "_uncert";
+	uncertbw_opt.push_back(uncertStream.str());
       }
     }
-    else{
-      if(direction_opt[0]=="forward"&&outputfw_opt.empty()){
-	errorStream << "Error: output forward datasets is not provided, use option -ofw" << endl;
+    // if(model_opt.size()<observation_opt.size()){
+    // 	errorStream << "Error: sequence of models should be larger than observations" << endl;
+    // 	throw(errorStream.str());
+    // }
+    if(tmodel_opt.empty()){
+      cout << "Warning: model time sequence is not provided, self generating time sequence from model input"  << endl;
+    }
+    if(tobservation_opt.empty()){
+      cout << "Warning: observation time sequence is not provided, self generating time sequence from observation input" << endl;
+    }
+    if(find(direction_opt.begin(),direction_opt.end(),"smooth")!=direction_opt.end()){
+      if(outputfw_opt.empty()){
+	errorStream << "Error: output forward dataset is not provided, use option -ofw" << endl;
 	throw(errorStream.str());
       }
-      else if(direction_opt[0]=="backward"&&outputbw_opt.empty()){
+      if(outputbw_opt.empty()){
 	errorStream << "Error: output backward datasets is not provided, use option -obw" << endl;
 	throw(errorStream.str());
       }
-
-      if(model_opt.size()<observation_opt.size()){
-	errorStream << "Error: sequence of models should be larger than observations" << endl;
+      if(outputfb_opt.empty()){
+	errorStream << "Error: output smooth datasets is not provided, use option -ofb" << endl;
 	throw(errorStream.str());
       }
-      if(tmodel_opt.size()!=model_opt.size()){
-	if(tmodel_opt.empty())
-	  cout << "Warning: time sequence is not provided, self generating time sequence from 0 to " << model_opt.size() << endl;
-	else
-	  cout << "Warning: time sequence provided (" << tmodel_opt.size() << ") does not match number of model raster datasets (" << model_opt.size() << ")" << endl;
-	tmodel_opt.clear();
-	for(int tindex=0;tindex<model_opt.size();++tindex)
-	  tmodel_opt.push_back(tindex);
-      }
-      if(tobservation_opt.size()!=observation_opt.size()){
-	errorStream << "Error: time sequence for observation must match size of observation dataset" << endl;
-	throw(errorStream.str());
+      if(uncertfb_opt.empty()){
+	ostringstream uncertStream;
+	uncertStream << outputfb_opt[0] << "_uncert";
+	uncertfb_opt.push_back(uncertStream.str());
       }
     }
   }
@@ -200,12 +260,35 @@ int main(int argc,char **argv) {
   stat.setNoDataValues(modnodata_opt);
   ImgReaderGdal imgReaderModel1;
   ImgReaderGdal imgReaderModel2;
+  ImgReaderGdal imgReaderModel1Mask;
+  ImgReaderGdal imgReaderModel2Mask;
   ImgReaderGdal imgReaderObs;
-  ImgWriterGdal imgWriterEst;
+  ImgReaderGdal imgReaderObsMask;
   //test
   ImgWriterGdal imgWriterGain;
 
+  imgReaderModel1.open(model_opt[0]);
+  imgReaderModel1.setNoData(modnodata_opt);
   imgReaderObs.open(observation_opt[0]);
+  imgReaderObs.setNoData(obsnodata_opt);
+  // if(observationmask_opt.empty())
+  //   observationmask_opt=observation_opt;
+  if(modelmask_opt.size()){
+    imgReaderModel1Mask.open(modelmask_opt[0]);
+    imgReaderModel1Mask.setNoData(msknodata_opt);
+  }
+  if(observationmask_opt.size()){
+    imgReaderObsMask.open(observationmask_opt[0]);
+    imgReaderObsMask.setNoData(msknodata_opt);
+  }
+
+  unsigned int nobs=(observation_opt.size()>1)? observation_opt.size() : imgReaderObs.nrOfBand();
+  unsigned int nmodel=(model_opt.size()>1)? model_opt.size() : imgReaderModel1.nrOfBand();
+
+  if(verbose_opt[0]){
+    cout << "number of observations: " << nobs << endl;
+    cout << "number of models: " << nmodel << endl;
+  }
 
   int ncol=imgReaderObs.nrOfCol();
   int nrow=imgReaderObs.nrOfRow();
@@ -238,16 +321,13 @@ int main(int argc,char **argv) {
   }
 
   if(down_opt.empty()){
-    imgReaderModel1.open(model_opt[0]);
     double resModel=imgReaderModel1.getDeltaX();
     double resObs=imgReaderObs.getDeltaX();
     int down=static_cast<int>(ceil(resModel/resObs));
     if(!(down%2))
       down+=1;
     down_opt.push_back(down);
-    imgReaderModel1.close();
   }
-  imgReaderObs.close();
 
   int obsindex=0;
 
@@ -258,6 +338,26 @@ int main(int argc,char **argv) {
 
   double errObs=uncertNodata_opt[0];//start with high initial value in case we do not have first observation at time 0
 
+  while(tmodel_opt.size()<nmodel)
+    tmodel_opt.push_back(tmodel_opt.size());
+  try{
+    if(tobservation_opt.size()<nobs){
+      if(nobs==nmodel){
+	while(tobservation_opt.size()<nobs)
+	  tobservation_opt.push_back(tobservation_opt.size());
+      }
+      else{
+	ostringstream errorStream;
+	errorStream << "Error: please provide time sequence for observation using option tobs" << endl;
+	throw(errorStream.str());
+      }
+    }
+  }
+  catch(string errorString){
+    std::cout << errorString << std::endl;
+    exit(1);
+  }
+  
   vector<int> relobsindex;
 
   for(int tindex=0;tindex<tobservation_opt.size();++tindex){
@@ -266,8 +366,17 @@ int main(int argc,char **argv) {
     int relpos=modit-tmodel_opt.begin()-1;
     assert(relpos>=0);//todo: for now, we assume model is available at time before first measurement
     relobsindex.push_back(relpos);
-    if(verbose_opt[0])
-      cout << "observation " << tindex << ": " << "relative position in model time series is " << relpos << ", date of observation is (tobservation_opt[tindex]): " << tobservation_opt[tindex] << ", relobsindex.back(): " << relobsindex.back() << ", filename observation: " << observation_opt[tindex] << ", filename of corresponding model: " << model_opt[relpos] << endl;
+    if(verbose_opt[0]){
+      cout << "observation " << tindex << ": " << "relative position in model time series is " << relpos << ", date of observation is (tobservation_opt[tindex]): " << tobservation_opt[tindex] << ", relobsindex.back(): " << relobsindex.back();
+      if(observation_opt.size()>tindex)
+	cout << ", filename observation: " << observation_opt[tindex];
+      else
+	cout << ", observation band index: " << tindex;
+      if(model_opt.size()>relpos)
+	cout << ", filename of corresponding model: " << model_opt[relpos] << endl;
+      else
+	cout << ", band index of corresponding model: " << relpos;
+    }
   }
 
   int ndigit=log(1.0*tmodel_opt.back())/log(10.0)+1;
@@ -275,92 +384,221 @@ int main(int argc,char **argv) {
   double geox=0;
   double geoy=0;
 
-  if(find(direction_opt.begin(),direction_opt.end(),"forward")!=direction_opt.end()){
-    ///////////////////////////// forward model /////////////////////////
-    cout << "Running forward model" << endl;
-    obsindex=0;
-    //initialization
-    string output;
-    if(outputfw_opt.size()==model_opt.size()){
-      output=outputfw_opt[0];
-    }
-    else{
-      ostringstream outputstream;
-      outputstream << outputfw_opt[0] << "_";
-      outputstream << setfill('0') << setw(ndigit) << tmodel_opt[0];
-      outputstream << ".tif";
-      output=outputstream.str();
-    }
-    if(verbose_opt[0])
-      cout << "Opening image " << output << " for writing " << endl;
-
-    imgWriterEst.open(output,ncol,nrow,2,theType,imageType,option_opt);
-    imgWriterEst.setProjectionProj4(projection_opt[0]);
-    imgWriterEst.setGeoTransform(geotransform);
-    imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
+  if(model_opt.size()==nmodel)
+    imgReaderModel1.close();
+  if(modelmask_opt.size()==nmodel)
+    imgReaderModel1Mask.close();
+  if(observation_opt.size()==nobs)
+    imgReaderObs.close();
+  if(observationmask_opt.size()==nobs)
+    imgReaderObsMask.close();
 
-    //test
-    if(gain_opt.size()){
-      imgWriterGain.open(gain_opt[0],ncol,nrow,model_opt.size(),GDT_Float64,imageType,option_opt);
-      imgWriterGain.setProjectionProj4(projection_opt[0]);
-      imgWriterGain.setGeoTransform(geotransform);
-      imgWriterGain.GDALSetNoDataValue(obsnodata_opt[0]);
-    }
+  try{
+    if(find(direction_opt.begin(),direction_opt.end(),"forward")!=direction_opt.end()){
+      ///////////////////////////// forward model /////////////////////////
+      cout << "Running forward model" << endl;
+      obsindex=0;
+      if(verbose_opt[0])
+	cout << "Opening image " << outputfw_opt[0] << " for writing " << endl << flush;
+    
+      // imgWriterEst.open(theOutput,ncol,nrow,2,theType,imageType,option_opt);
+      ImgWriterGdal imgWriterEst;
+      ImgWriterGdal imgWriterUncert;
+      imgWriterEst.open(outputfw_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);
+      imgWriterEst.setProjectionProj4(projection_opt[0]);
+      imgWriterEst.setGeoTransform(geotransform);
+      imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
+      imgWriterUncert.open(uncertfw_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);
+      imgWriterUncert.setProjectionProj4(projection_opt[0]);
+      imgWriterUncert.setGeoTransform(geotransform);
 
-    if(verbose_opt[0]){
-      cout << "processing time " << tmodel_opt[0] << endl;
-      if(obsindex<relobsindex.size())
-	cout << "next observation " << tmodel_opt[relobsindex[obsindex]] << endl;
-      else
-	cout << "There is no next observation" << endl;
-    }
+      try{
+	//test
+	if(gain_opt.size()){
+	  imgWriterGain.open(gain_opt[0],ncol,nrow,nmodel,GDT_Float64,imageType,option_opt);
+	  imgWriterGain.setProjectionProj4(projection_opt[0]);
+	  imgWriterGain.setGeoTransform(geotransform);
+	  imgWriterGain.GDALSetNoDataValue(obsnodata_opt[0]);
+	}
 
-    try{
-      imgReaderModel1.open(model_opt[0]);
-      imgReaderModel1.setNoData(modnodata_opt);
-    }
-    catch(string errorString){
-      cerr << errorString << endl;
-    }
-    catch(...){
-      cerr << "Error opening file " << model_opt[0] << endl;
-    }
+	if(verbose_opt[0]){
+	  cout << "processing time " << tmodel_opt[0] << endl;
+	  if(obsindex<relobsindex.size()){
+	    assert(tmodel_opt.size()>relobsindex[obsindex]);
+	    cout << "next observation " << tmodel_opt[relobsindex[obsindex]] << endl;
+	  }
+	  else
+	    cout << "There is no next observation" << endl;
+	}
+	if(model_opt.size()==nmodel){
+	  imgReaderModel1.open(model_opt[0]);
+	  imgReaderModel1.setNoData(modnodata_opt);
+	}
+	if(modelmask_opt.size()==nmodel){
+	  imgReaderModel1Mask.open(modelmask_opt[0]);
+	  imgReaderModel1Mask.setNoData(msknodata_opt);
+	}
+      }
+      catch(string errorString){
+	cerr << errorString << endl;
+      }
+      catch(...){
+	cerr << "Error opening file " << model_opt[0] << endl;
+      }
       
-    //calculate standard deviation of image to serve as model uncertainty
-    // GDALRasterBand* rasterBand;
-    // rasterBand=imgReaderModel1.getRasterBand(0);
-    // double minValue, maxValue, meanValue, stdDev;
-    // void* pProgressData;
-    // rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);
-    double modRow=0;
-    double modCol=0;
-    double lowerCol=0;
-    double upperCol=0;
-    RESAMPLE theResample=BILINEAR;
-
-    if(relobsindex[0]>0){//initialize output_opt[0] as model[0]
-      //write first model as output
-      if(verbose_opt[0])
-	cout << "write first model as output" << endl;
-      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+      double modRow=0;
+      double modCol=0;
+      double lowerCol=0;
+      double upperCol=0;
+      RESAMPLE theResample=BILINEAR;
+
+      if(relobsindex[0]>0){//initialize output_opt[0] as model[0]
+	//write first model as output
+	if(verbose_opt[0])
+	  cout << "write first model as output" << endl;
+	for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+	  vector<double> estReadBuffer;
+	  vector<double> lineModelMask;
+	  vector<double> estWriteBuffer(ncol);
+	  vector<double> uncertWriteBuffer(ncol);
+	  //test
+	  vector<double> gainWriteBuffer(ncol);
+	  try{
+	    for(int irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){
+	      imgWriterEst.image2geo(0,irow,geox,geoy);
+	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+	      if(modRow<0||modRow>=imgReaderModel1.nrOfRow()){
+		cerr << "Error: geo coordinates (" << geox << "," << geoy << ") not covered in model image " << imgReaderModel1.getFileName() << endl;
+		assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+	      }
+	      // imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);
+
+	      int readModelBand=(model_opt.size()==nmodel)? 0:0;
+	      int readModelMaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:0;
+	      imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,readModelBand,theResample);
+	      if(modelmask_opt.size())
+		imgReaderModel1Mask.readData(lineModelMask,GDT_Float64,modRow,readModelMaskBand,theResample);
+	      for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
+		for(int icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){
+		  imgWriterEst.image2geo(icol,irow,geox,geoy);
+		  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+		  if(modelmask_opt.size()){
+		    if(imgReaderModel1Mask.isNoData(lineModelMask[modCol])){
+		      estWriteBuffer[icol]=obsnodata_opt[0];
+		      uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		      //test
+		      gainWriteBuffer[icol]=obsnodata_opt[0];
+		      continue;
+		    }
+		  }
+		  lowerCol=modCol-0.5;
+		  lowerCol=static_cast<int>(lowerCol);
+		  upperCol=modCol+0.5;
+		  upperCol=static_cast<int>(upperCol);
+		  if(lowerCol<0)
+		    lowerCol=0;
+		  if(upperCol>=imgReaderModel1.nrOfCol())
+		    upperCol=imgReaderModel1.nrOfCol()-1;
+		  double modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];
+		  // double modValue=estReadBuffer[modCol];
+		  if(imgReaderModel1.isNoData(modValue)){
+		    estWriteBuffer[icol]=obsnodata_opt[0];
+		    uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		    //test
+		    gainWriteBuffer[icol]=obsnodata_opt[0];
+		    continue;
+		  }
+		  estWriteBuffer[icol]=modValue;
+		  if(obsmin_opt.size()){
+		    if(estWriteBuffer[icol]<obsmin_opt[0])
+		      estWriteBuffer[icol]=obsmin_opt[0];
+		  }
+		  if(obsmax_opt.size()){
+		    if(estWriteBuffer[icol]>obsmax_opt[0])
+		      estWriteBuffer[icol]=obsmax_opt[0];
+		  }
+		  uncertWriteBuffer[icol]=uncertModel_opt[0];
+		  //test
+		  gainWriteBuffer[icol]=0;
+		}
+	      }
+	      imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
+	      imgWriterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,0);
+	      //test
+	      if(gain_opt.size())
+		imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);
+	    }
+	  }
+	  catch(string errorString){
+	    cerr << errorString << endl;
+	  }
+	  catch(...){
+	    cerr << "Error writing file " << imgWriterEst.getFileName() << endl;
+	  }
+	}
+      }
+      else{//we have a measurement
+	if(verbose_opt[0])
+	  cout << "we have a measurement at initial time" << endl;
+	if(observation_opt.size()==nobs){
+	  imgReaderObs.open(observation_opt[0]);
+	  imgReaderObs.setNoData(obsnodata_opt);
+	}
+	if(observationmask_opt.size()==nobs){
+	  imgReaderObsMask.open(observationmask_opt[0]);
+	  imgReaderObsMask.setNoData(msknodata_opt);
+	}
+	imgReaderObs.getGeoTransform(geotransform);
+
+	vector< vector<double> > obsLineVector(down_opt[0]);
+	vector<double> obsLineBuffer;
+	vector<double> obsMaskLineBuffer;
+	vector<double> modelMaskLineBuffer;
+	vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
 	vector<double> estReadBuffer;
 	vector<double> estWriteBuffer(ncol);
 	vector<double> uncertWriteBuffer(ncol);
+	vector<double> uncertObsLineBuffer;
 	//test
 	vector<double> gainWriteBuffer(ncol);
-	try{
-	  for(int irow=jrow;irow<jrow+down_opt[0];++irow){
+
+	if(verbose_opt[0])
+	  cout << "initialize obsLineVector" << endl;
+	assert(down_opt[0]%2);//window size must be odd 
+	int readObsBand=(observation_opt.size()==nobs)? 0:0;
+	int readObsMaskBand=(observationmask_opt.size()==nobs)? mskband_opt[0]:0;
+	int readModelBand=(model_opt.size()==nmodel)? 0:0;
+	int readModelMaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:0;
+	for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
+	  if(iline<0)//replicate line 0
+	    imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,readObsBand);
+	  else
+	    imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,readObsBand);
+	}
+	for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+	  for(int irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){
 	    imgWriterEst.image2geo(0,irow,geox,geoy);
 	    imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	    if(modRow<0||modRow>=imgReaderModel1.nrOfRow()){
-	      cerr << "Error: geo coordinates (" << geox << "," << geoy << ") not covered in model image " << imgReaderModel1.getFileName() << endl;
-	      assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	    }
-	    imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);
+	    assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+	    imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,readModelBand,theResample);
+	    if(modelmask_opt.size())
+	      imgReaderModel1Mask.readData(modelMaskLineBuffer,GDT_Float64,modRow,readModelMaskBand);
+	    int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+	    obsLineVector.erase(obsLineVector.begin());
+	    imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,readObsBand);
+	    obsLineVector.push_back(obsLineBuffer);
+
+	    if(observationmask_opt.size())
+	      imgReaderObsMask.readData(obsMaskLineBuffer,GDT_Float64,irow,readObsMaskBand);
+
 	    for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
-	      for(int icol=icol;icol<icol+down_opt[0];++icol){
+	      for(int icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){
 		imgWriterEst.image2geo(icol,irow,geox,geoy);
 		imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+		assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+		bool modelIsNoData=false;
+		if(modelmask_opt.size())
+		  modelIsNoData=imgReaderModel1Mask.isNoData(modelMaskLineBuffer[modCol]);
 		lowerCol=modCol-0.5;
 		lowerCol=static_cast<int>(lowerCol);
 		upperCol=modCol+0.5;
@@ -371,152 +609,359 @@ int main(int argc,char **argv) {
 		  upperCol=imgReaderModel1.nrOfCol()-1;
 		double modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];
 		// double modValue=estReadBuffer[modCol];
-		if(imgReaderModel1.isNoData(modValue)){
-		  estWriteBuffer[icol]=obsnodata_opt[0];
-		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
-		  gainWriteBuffer[icol]=obsnodata_opt[0];
+		double errMod=uncertModel_opt[0];//*stdDev*stdDev;
+		modelIsNoData=modelIsNoData||imgReaderModel1.isNoData(modValue);
+		bool obsIsNoData=false;
+		if(observationmask_opt.size())
+		  obsIsNoData=imgReaderObsMask.isNoData(obsMaskLineBuffer[icol]);
+		obsIsNoData=obsIsNoData||imgReaderObs.isNoData(obsLineBuffer[icol]);
+		if(modelIsNoData){//model is nodata: retain observation 
+		  if(obsIsNoData){//both model and observation nodata
+		    estWriteBuffer[icol]=obsnodata_opt[0];
+		    uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		    //test
+		    gainWriteBuffer[icol]=obsnodata_opt[0];
+		  }
+		  else{
+		    estWriteBuffer[icol]=obsLineBuffer[icol];
+		    if(obsmin_opt.size()){
+		      if(estWriteBuffer[icol]<obsmin_opt[0])
+			estWriteBuffer[icol]=obsmin_opt[0];
+		    }
+		    if(obsmax_opt.size()){
+		      if(estWriteBuffer[icol]>obsmax_opt[0])
+			estWriteBuffer[icol]=obsmax_opt[0];
+		    }
+		    uncertWriteBuffer[icol]=uncertObs_opt[0];
+		  }
 		}
-		else{
+		else{//model is valid: calculate estimate from model
 		  estWriteBuffer[icol]=modValue;
-		  if(obsmin_opt.size()){
-		    if(estWriteBuffer[icol]<obsmin_opt[0])
-		      estWriteBuffer[icol]=obsmin_opt[0];
+		  uncertWriteBuffer[icol]=errMod;//in case observation is not valid
+		  //test
+		  gainWriteBuffer[icol]=0;
+		}
+		//measurement update
+		if(!obsIsNoData){
+		  // estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2
+		  double kalmanGain=1;
+		  int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
+		  int maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;
+		  int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
+		  int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+		  obsWindowBuffer.clear();
+		  for(int iline=0;iline<obsLineVector.size();++iline){
+		    for(int isample=minCol;isample<=maxCol;++isample){
+		      assert(isample<obsLineVector[iline].size());
+		      obsWindowBuffer.push_back(obsLineVector[iline][isample]);
+		    }
 		  }
-		  if(obsmax_opt.size()){
-		    if(estWriteBuffer[icol]>obsmax_opt[0])
-		      estWriteBuffer[icol]=obsmax_opt[0];
+		  if(!modelIsNoData){//model is valid
+		    statfactory::StatFactory statobs;
+		    statobs.setNoDataValues(obsnodata_opt);
+		    double obsMeanValue=0;
+		    double obsVarValue=0;
+		    statobs.meanVar(obsWindowBuffer,obsMeanValue,obsVarValue);
+		    double difference=0;
+		    difference=obsMeanValue-modValue;
+		    // errObs=uncertObs_opt[0]*sqrt(difference*difference);
+		    errObs=uncertObs_opt[0]*difference*difference;//uncertainty of the observation (R in Kalman equations)
+		    // double errorCovariance=errMod;
+		    double errorCovariance=processNoise_opt[0]*obsVarValue;//assumed initial errorCovariance (P in Kalman equations)
+		    if(errorCovariance+errObs>eps_opt[0])
+		      kalmanGain=errorCovariance/(errorCovariance+errObs);
+		    else 
+		      kalmanGain=1;
+		    estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
+		    if(obsmin_opt.size()){
+		      if(estWriteBuffer[icol]<obsmin_opt[0])
+			estWriteBuffer[icol]=obsmin_opt[0];
+		    }
+		    if(obsmax_opt.size()){
+		      if(estWriteBuffer[icol]>obsmax_opt[0])
+			estWriteBuffer[icol]=obsmax_opt[0];
+		      if(uncertWriteBuffer[icol]>obsmax_opt[0])
+			uncertWriteBuffer[icol]=obsmax_opt[0];
+		    }
 		  }
-		  uncertWriteBuffer[icol]=uncertModel_opt[0];//*stdDev*stdDev;
-		  gainWriteBuffer[icol]=0;
+		  if(kalmanGain>=1)
+		    kalmanGain=1;
+		  //test
+		  gainWriteBuffer[icol]=kalmanGain;
 		}
 	      }
 	    }
 	    imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	    imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
+	    imgWriterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,0);
+	    //test
 	    if(gain_opt.size())
 	      imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);
 	  }
 	}
-	catch(string errorString){
-	  cerr << errorString << endl;
+	if(observation_opt.size()==nobs)
+	  imgReaderObs.close();
+	if(observationmask_opt.size()==nobs)
+	  imgReaderObsMask.close();
+	++obsindex;
+      }
+      if(model_opt.size()==nmodel)
+	imgReaderModel1.close();
+      if(modelmask_opt.size()==nmodel)
+	imgReaderModel1Mask.close();
+      imgWriterEst.close();
+      imgWriterUncert.close();
+
+      ImgUpdaterGdal imgUpdaterEst;
+      ImgUpdaterGdal imgUpdaterUncert;
+      for(int modindex=1;modindex<nmodel;++modindex){
+	imgUpdaterEst.open(outputfw_opt[0]);
+	imgUpdaterEst.setNoData(obsnodata_opt);
+	imgUpdaterUncert.open(uncertfw_opt[0]);
+	if(verbose_opt[0]){
+	  cout << "processing time " << tmodel_opt[modindex] << endl;
+	  if(obsindex<relobsindex.size())
+	    cout << "next observation " << tmodel_opt[relobsindex[obsindex]] << endl;
+	  else
+	    cout << "There is no next observation" << endl;
 	}
-	catch(...){
-	  cerr << "Error writing file " << imgWriterEst.getFileName() << endl;
+
+	//calculate regression between two subsequence model inputs
+	if(model_opt.size()==nmodel){
+	  imgReaderModel1.open(model_opt[modindex-1]);
+	  imgReaderModel1.setNoData(modnodata_opt);
+	  imgReaderModel2.open(model_opt[modindex]);
+	  imgReaderModel2.setNoData(modnodata_opt);
 	}
-      }
-    }
-    else{//we have a measurement
-      if(verbose_opt[0])
-	cout << "we have a measurement at initial time" << endl;
-      imgReaderObs.open(observation_opt[0]);
-      imgReaderObs.getGeoTransform(geotransform);
-      imgReaderObs.setNoData(obsnodata_opt);
-
-      vector< vector<double> > obsLineVector(down_opt[0]);
-      vector<double> obsLineBuffer;
-      vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
-      vector<double> estReadBuffer;
-      vector<double> estWriteBuffer(ncol);
-      vector<double> uncertWriteBuffer(ncol);
-      vector<double> uncertObsLineBuffer;
-      //test
-      vector<double> gainWriteBuffer(ncol);
+	if(modelmask_opt.size()==nmodel){
+	  imgReaderModel1Mask.open(modelmask_opt[modindex-1]);
+	  imgReaderModel1Mask.setNoData(msknodata_opt);
+	  imgReaderModel2Mask.open(modelmask_opt[modindex]);
+	  imgReaderModel2Mask.setNoData(msknodata_opt);
+	}
+	
+	pfnProgress(progress,pszMessage,pProgressArg);
 
-      if(verbose_opt[0])
-	cout << "initialize obsLineVector" << endl;
-      assert(down_opt[0]%2);//window size must be odd 
-      for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
-	if(iline<0)//replicate line 0
-	  imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);
-	else
-	  imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
-      }
-      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
-	for(int irow=jrow;irow<jrow+down_opt[0];++irow){
-	  imgWriterEst.image2geo(0,irow,geox,geoy);
-	  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	  assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	  imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);
-	  int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
-	  obsLineVector.erase(obsLineVector.begin());
-	  imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);
-	  obsLineVector.push_back(obsLineBuffer);
-	  // obsLineBuffer=obsLineVector[down_opt[0]/2];
-	  if(imgReaderObs.nrOfBand()>1)
-	    imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
-
-	  for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
-	    for(int icol=jcol;icol<jcol+down_opt[0];++icol){
-	      imgWriterEst.image2geo(icol,irow,geox,geoy);
+	bool update=false;
+	if(obsindex<relobsindex.size()){
+	  update=(relobsindex[obsindex]==modindex);
+	}
+	if(update){
+	  if(observation_opt.size()==nobs){
+	    if(verbose_opt[0])
+	      cout << "***update " << relobsindex[obsindex] << " = " << modindex << " " << observation_opt[obsindex] << " ***" << endl;
+	    imgReaderObs.open(observation_opt[obsindex]);
+	    imgReaderObs.getGeoTransform(geotransform);
+	    imgReaderObs.setNoData(obsnodata_opt);
+	  }
+	  if(observationmask_opt.size()==nobs){
+	    imgReaderObsMask.open(observationmask_opt[obsindex]);
+	    imgReaderObsMask.setNoData(msknodata_opt);
+	  }
+	}
+	//prediction (also to fill cloudy pixels in measurement update mode)
+	string input;
+	input=outputfw_opt[0];
+
+	vector< vector<double> > obsLineVector(down_opt[0]);
+	vector<double> obsLineBuffer;
+	vector<double> obsMaskLineBuffer;
+	vector<double> model1MaskLineBuffer;
+	vector<double> model2MaskLineBuffer;
+	vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
+	vector<double> model1LineBuffer;
+	vector<double> model2LineBuffer;
+	vector<double> model1buffer;//buffer for model 1 to calculate time regression based on window
+	vector<double> model2buffer;//buffer for model 2 to calculate time regression based on window
+	vector<double> uncertObsLineBuffer;
+	vector< vector<double> > estLineVector(down_opt[0]);
+	vector<double> estLineBuffer;
+	vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel
+	vector<double> uncertReadBuffer;
+	vector<double> estWriteBuffer(ncol);
+	vector<double> uncertWriteBuffer(ncol);
+	//test
+	vector<double> gainWriteBuffer(ncol);
+
+	int readObsBand=(observation_opt.size()==nobs)? 0:obsindex;
+	int readObsMaskBand=(observationmask_opt.size()==nobs)? mskband_opt[0]:obsindex;
+	int readModel1Band=(model_opt.size()==nmodel)? 0:modindex-1;
+	int readModel2Band=(model_opt.size()==nmodel)? 0:modindex;
+	int readModel1MaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:modindex-1;
+	int readModel2MaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:modindex;
+
+	//initialize obsLineVector if update
+	if(update){
+	  if(verbose_opt[0])
+	    cout << "initialize obsLineVector" << endl;
+	  assert(down_opt[0]%2);//window size must be odd 
+	  for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
+	    if(iline<0)//replicate line 0
+	      imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,readObsBand);
+	    else
+	      imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,readObsBand);
+	  }
+	}
+	//initialize estLineVector
+	if(verbose_opt[0])
+	  cout << "initialize estLineVector" << endl;
+	assert(down_opt[0]%2);//window size must be odd 
+
+	for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
+	  if(iline<0)//replicate line 0
+	    imgUpdaterEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,modindex-1);
+	  else
+	    imgUpdaterEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,modindex-1);
+	}
+	statfactory::StatFactory statobs;
+	statobs.setNoDataValues(obsnodata_opt);
+	for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+	  //todo: read entire window for uncertReadBuffer...
+	  for(int irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){
+	    imgUpdaterUncert.readData(uncertReadBuffer,GDT_Float64,irow,modindex-1);
+	    imgUpdaterUncert.image2geo(0,irow,geox,geoy);
+	    if(model_opt.size()==nmodel){
+	      imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
+	      assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
+	      imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,readModel2Band,theResample);
 	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	      assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	      lowerCol=modCol-0.5;
-	      lowerCol=static_cast<int>(lowerCol);
-	      upperCol=modCol+0.5;
-	      upperCol=static_cast<int>(upperCol);
-	      if(lowerCol<0)
-		lowerCol=0;
-	      if(upperCol>=imgReaderModel1.nrOfCol())
-		upperCol=imgReaderModel1.nrOfCol()-1;
-	      double modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];
-	      // double modValue=estReadBuffer[modCol];
-	      double errMod=uncertModel_opt[0];//*stdDev*stdDev;
-	      if(imgReaderModel1.isNoData(modValue)){//model is nodata: retain observation 
-		if(imgReaderObs.isNoData(obsLineBuffer[icol])){//both model and observation nodata
-		  estWriteBuffer[icol]=obsnodata_opt[0];
-		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
-		  gainWriteBuffer[icol]=obsnodata_opt[0];
-		}
-		else{
-		  estWriteBuffer[icol]=obsLineBuffer[icol];
-		  if(obsmin_opt.size()){
-		    if(estWriteBuffer[icol]<obsmin_opt[0])
-		      estWriteBuffer[icol]=obsmin_opt[0];
-		  }
-		  if(obsmax_opt.size()){
-		    if(estWriteBuffer[icol]>obsmax_opt[0])
-		      estWriteBuffer[icol]=obsmax_opt[0];
-		  }
-		  if(uncertObsLineBuffer.size()>icol)
-		    uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];
-		  else
-		    uncertWriteBuffer[icol]=uncertObs_opt[0];
-		}
-	      }
-	      else{//model is valid: calculate estimate from model
-		estWriteBuffer[icol]=modValue;
-		uncertWriteBuffer[icol]=errMod;//in case observation is not valid
-		gainWriteBuffer[icol]=0;
-	      }
-	      //measurement update
-	      if(!imgReaderObs.isNoData(obsLineBuffer[icol])){
-		// estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2
-		double kalmanGain=1;
+	    }
+	    else{
+	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+	      imgReaderModel1.readData(model2LineBuffer,GDT_Float64,modRow,readModel2Band,theResample);
+	    }
+	    assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+	    imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,readModel1Band,theResample);
+
+	    if(modelmask_opt.size()){
+	      imgReaderModel1Mask.readData(model1MaskLineBuffer,GDT_Float64,modRow,readModel1MaskBand);
+	      if(modelmask_opt.size()==nmodel)
+		imgReaderModel2Mask.readData(model2MaskLineBuffer,GDT_Float64,modRow,readModel2MaskBand);
+	      else
+		imgReaderModel1Mask.readData(model2MaskLineBuffer,GDT_Float64,modRow,readModel2MaskBand);
+	    }
+
+	    int maxRow=(irow+down_opt[0]/2<imgUpdaterEst.nrOfRow()) ? irow+down_opt[0]/2 : imgUpdaterEst.nrOfRow()-1;
+	    estLineVector.erase(estLineVector.begin());
+	    imgUpdaterEst.readData(estLineBuffer,GDT_Float64,maxRow,modindex-1);
+	    estLineVector.push_back(estLineBuffer);
+	    estLineBuffer=estLineVector[down_opt[0]/2];
+
+	    if(update){
+	      int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+	      obsLineVector.erase(obsLineVector.begin());
+	      imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,readObsBand);
+	      obsLineVector.push_back(obsLineBuffer);
+	      obsLineBuffer=obsLineVector[down_opt[0]/2];
+
+	      if(observationmask_opt.size())
+		imgReaderObsMask.readData(obsMaskLineBuffer,GDT_Float64,irow,readObsMaskBand);
+	    }
+
+	    for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
+	      for(int icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){
+		imgUpdaterEst.image2geo(icol,irow,geox,geoy);
 		int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
-		int maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;
+		int maxCol=(icol+down_opt[0]/2<imgUpdaterEst.nrOfCol()) ? icol+down_opt[0]/2 : imgUpdaterEst.nrOfCol()-1;
 		int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
-		int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
-		obsWindowBuffer.clear();
-		for(int iline=0;iline<obsLineVector.size();++iline){
+		int maxRow=(irow+down_opt[0]/2<imgUpdaterEst.nrOfRow()) ? irow+down_opt[0]/2 : imgUpdaterEst.nrOfRow()-1;
+		estWindowBuffer.clear();
+		for(int iline=0;iline<estLineVector.size();++iline){
 		  for(int isample=minCol;isample<=maxCol;++isample){
-		    assert(isample<obsLineVector[iline].size());
-		    obsWindowBuffer.push_back(obsLineVector[iline][isample]);
+		    assert(isample<estLineVector[iline].size());
+		    estWindowBuffer.push_back(estLineVector[iline][isample]);
 		  }
 		}
-		if(!imgReaderModel1.isNoData(modValue)){//model is valid
-		  statfactory::StatFactory statobs;
-		  statobs.setNoDataValues(obsnodata_opt);
-		  double obsMeanValue=statobs.mean(obsWindowBuffer);
-		  double difference=0;
-		  difference=obsMeanValue-modValue;
-		  errObs=uncertObs_opt[0]*sqrt(difference*difference);
-		  // errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)
-		  double errorCovariance=errMod;//assumed initial errorCovariance (P in Kalman equations)
-		  if(errorCovariance+errObs>eps_opt[0])
-		    kalmanGain=errorCovariance/(errorCovariance+errObs);
-		  else 
-		    kalmanGain=1;
-		  estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
+		if(update){
+		  obsWindowBuffer.clear();
+		  for(int iline=0;iline<obsLineVector.size();++iline){
+		    for(int isample=minCol;isample<=maxCol;++isample){
+		      assert(isample<obsLineVector[iline].size());
+		      obsWindowBuffer.push_back(obsLineVector[iline][isample]);
+		    }
+		  }
+		}
+		double estValue=estLineBuffer[icol];
+		imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+		bool model1IsNoData=false;
+		if(modelmask_opt.size())
+		  model1IsNoData=imgReaderModel1Mask.isNoData(model1MaskLineBuffer[modCol]);
+		lowerCol=modCol-0.5;
+		lowerCol=static_cast<int>(lowerCol);
+		upperCol=modCol+0.5;
+		upperCol=static_cast<int>(upperCol);
+		if(lowerCol<0)
+		  lowerCol=0;
+		if(upperCol>=imgReaderModel1.nrOfCol())
+		  upperCol=imgReaderModel1.nrOfCol()-1;
+		double modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];
+		model1IsNoData=model1IsNoData||imgReaderModel1.isNoData(modValue1);
+		if(model_opt.size()==nmodel)
+		  imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
+		else
+		  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+		bool model2IsNoData=false;
+		if(modelmask_opt.size())
+		  model2IsNoData=imgReaderModel1Mask.isNoData(model2MaskLineBuffer[modCol]);
+		lowerCol=modCol-0.5;
+		lowerCol=static_cast<int>(lowerCol);
+		upperCol=modCol+0.5;
+		upperCol=static_cast<int>(upperCol);
+		if(lowerCol<0)
+		  lowerCol=0;
+		if(upperCol>=imgReaderModel1.nrOfCol())
+		  upperCol=imgReaderModel1.nrOfCol()-1;
+		double modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];
+		model2IsNoData=model2IsNoData||imgReaderModel1.isNoData(modValue2);
+		bool obsIsNoData=false;
+		if(observationmask_opt.size())
+		  obsIsNoData=imgReaderObsMask.isNoData(obsMaskLineBuffer[icol]);
+		obsIsNoData=obsIsNoData||imgReaderObs.isNoData(obsLineBuffer[icol]);
+
+		if(imgUpdaterEst.isNoData(estValue)){
+		  //we have not found any valid data yet, better here to take the current model value if valid
+		  if(model2IsNoData){//if both estimate and model are no-data, set obs to nodata
+		    estWriteBuffer[icol]=obsnodata_opt[0];
+		    uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		    //test
+		    gainWriteBuffer[icol]=0;
+		  }
+		  else{
+		    estWriteBuffer[icol]=modValue2;
+		    uncertWriteBuffer[icol]=uncertModel_opt[0];//*stdDev*stdDev;
+		    if(obsmin_opt.size()){
+		      if(estWriteBuffer[icol]<obsmin_opt[0])
+			estWriteBuffer[icol]=obsmin_opt[0];
+		    }
+		    if(obsmax_opt.size()){
+		      if(estWriteBuffer[icol]>obsmax_opt[0])
+			estWriteBuffer[icol]=obsmax_opt[0];
+		      if(uncertWriteBuffer[icol]>obsmax_opt[0])
+			uncertWriteBuffer[icol]=obsmax_opt[0];
+		    }
+		    //test
+		    gainWriteBuffer[icol]=0;
+		  }
+		}
+		else{//previous estimate is valid
+		  double estMeanValue=0;
+		  double estVarValue=0;
+		  statobs.meanVar(estWindowBuffer,estMeanValue,estVarValue);
+		  double nvalid=0;
+		  //time update
+		  double processNoiseVariance=processNoise_opt[0]*estVarValue;
+		  //estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. 
+
+		  if(model1IsNoData||model2IsNoData){
+		    estWriteBuffer[icol]=estValue;
+		    // uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;
+		    //todo: check following line if makes sense
+		    uncertWriteBuffer[icol]=uncertReadBuffer[icol]+uncertObs_opt[0];
+		  }
+		  else{//model is good
+		    double modRatio=modValue2/modValue1;//transition matrix A in Kalman equations
+		    estWriteBuffer[icol]=estValue*modRatio;
+		    uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;
+		  }
 		  if(obsmin_opt.size()){
 		    if(estWriteBuffer[icol]<obsmin_opt[0])
 		      estWriteBuffer[icol]=obsmin_opt[0];
@@ -528,280 +973,209 @@ int main(int argc,char **argv) {
 		      uncertWriteBuffer[icol]=obsmax_opt[0];
 		  }
 		}
-		assert(kalmanGain<=1);
-		gainWriteBuffer[icol]=kalmanGain;
+		//measurement update
+		if(update&&!obsIsNoData){
+		  double kalmanGain=1;
+		  if(!model2IsNoData){//model is valid
+		    statfactory::StatFactory statobs;
+		    statobs.setNoDataValues(obsnodata_opt);
+		    double obsMeanValue=0;
+		    double obsVarValue=0;
+		    double difference=0;
+		    statobs.meanVar(obsWindowBuffer,obsMeanValue,obsVarValue);
+		    difference=obsMeanValue-modValue2;
+		    // errObs=uncertObs_opt[0]*sqrt(difference*difference);
+		    errObs=uncertObs_opt[0]*difference*difference;//uncertainty of the observation (R in Kalman equations)
+
+		    if(errObs<eps_opt[0])
+		      errObs=eps_opt[0];
+		    double errorCovariance=uncertWriteBuffer[icol];//P in Kalman equations
+
+		    if(errorCovariance+errObs>eps_opt[0])
+		      kalmanGain=errorCovariance/(errorCovariance+errObs);
+		    else 
+		      kalmanGain=1;
+		    estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
+		    uncertWriteBuffer[icol]*=(1-kalmanGain);
+		    if(obsmin_opt.size()){
+		      if(estWriteBuffer[icol]<obsmin_opt[0])
+			estWriteBuffer[icol]=obsmin_opt[0];
+		    }
+		    if(obsmax_opt.size()){
+		      if(estWriteBuffer[icol]>obsmax_opt[0])
+			estWriteBuffer[icol]=obsmax_opt[0];
+		      if(uncertWriteBuffer[icol]>obsmax_opt[0])
+			uncertWriteBuffer[icol]=obsmax_opt[0];
+		    }
+		  }
+		  if(kalmanGain>=1)
+		    kalmanGain=1;
+		  //test
+		  gainWriteBuffer[icol]=kalmanGain;
+		}
 	      }
 	    }
+
+	    //test
+	    if(gain_opt.size())
+	      imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,modindex);
+	    imgUpdaterEst.writeData(estWriteBuffer,GDT_Float64,irow,modindex);
+	    imgUpdaterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,modindex);
+	    progress=static_cast<float>((irow+1.0)/imgUpdaterEst.nrOfRow());
+	    pfnProgress(progress,pszMessage,pProgressArg);
 	  }
-	  if(gain_opt.size())
-	    imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);
-	  imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	  imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
+	}
+
+	//must close writers to ensure flush
+	imgUpdaterEst.close();
+	imgUpdaterUncert.close();
+	// imgWriterEst.close();
+	// imgReaderEst.close();
+
+	if(update){
+	  if(observation_opt.size()==nobs)
+	    imgReaderObs.close();
+	  if(observationmask_opt.size()==nobs)
+	    imgReaderObsMask.close();
+	  ++obsindex;
+	}
+	if(model_opt.size()==nmodel){
+	  imgReaderModel1.close();
+	  imgReaderModel2.close();
+	}
+	if(modelmask_opt.size()==nmodel){
+	  imgReaderModel1Mask.close();
+	  imgReaderModel2Mask.close();
 	}
       }
-      imgReaderObs.close();
-      ++obsindex;
+      //test
+      if(gain_opt.size())
+	imgWriterGain.close();
     }
-    imgReaderModel1.close();
-    imgWriterEst.close();
+  }
+  catch(string errorString){
+    cerr << errorString << endl;
+    exit(1);
+  }
+  catch(...){
+    cerr << "Error in forward direction " << endl;
+    exit(2);
+  }
+  try{
+    if(find(direction_opt.begin(),direction_opt.end(),"backward")!=direction_opt.end()){
+      ///////////////////////////// backward model /////////////////////////
+      cout << "Running backward model" << endl;
+      obsindex=relobsindex.size()-1;
+      if(verbose_opt[0])
+	cout << "Opening image " << outputbw_opt[0] << " for writing " << endl;
 
-    for(int modindex=1;modindex<model_opt.size();++modindex){
-      if(verbose_opt[0]){
-	cout << "processing time " << tmodel_opt[modindex] << endl;
-	if(obsindex<relobsindex.size())
-	  cout << "next observation " << tmodel_opt[relobsindex[obsindex]] << endl;
-	else
-	  cout << "There is no next observation" << endl;
-      }
-      string output;
-      if(outputfw_opt.size()==model_opt.size())
-	output=outputfw_opt[modindex];
-      else{
-	ostringstream outputstream;
-	outputstream << outputfw_opt[0] << "_";
-	outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex];
-	outputstream << ".tif";
-	// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";
-	output=outputstream.str();
-      }
-    
-      //two band output band0=estimation, band1=uncertainty
-      imgWriterEst.open(output,ncol,nrow,2,theType,imageType,option_opt);
+      // imgWriterEst.open(theOutput,ncol,nrow,2,theType,imageType,option_opt);
+      ImgWriterGdal imgWriterEst;
+      ImgWriterGdal imgWriterUncert;
+      imgWriterEst.open(outputbw_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);
       imgWriterEst.setProjectionProj4(projection_opt[0]);
       imgWriterEst.setGeoTransform(geotransform);
       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
-
-      //calculate regression between two subsequence model inputs
-      imgReaderModel1.open(model_opt[modindex-1]);
-      imgReaderModel1.setNoData(modnodata_opt);
-      imgReaderModel2.open(model_opt[modindex]);
-      imgReaderModel2.setNoData(modnodata_opt);
-      //calculate regression
-      //we could re-use the points from second image from last run, but
-      //to keep it general, we must redo it (overlap might have changed)
-    
-      pfnProgress(progress,pszMessage,pProgressArg);
-
-      bool update=false;
-      if(obsindex<relobsindex.size()){
-	update=(relobsindex[obsindex]==modindex);
+      imgWriterUncert.open(uncertbw_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);
+      imgWriterUncert.setProjectionProj4(projection_opt[0]);
+      imgWriterUncert.setGeoTransform(geotransform);
+
+      try{
+	// //test
+	// if(gain_opt.size()){
+	//   imgWriterGain.open(gain_opt[0],ncol,nrow,nmodel,GDT_Float64,imageType,option_opt);
+	//   imgWriterGain.setProjectionProj4(projection_opt[0]);
+	//   imgWriterGain.setGeoTransform(geotransform);
+	//   imgWriterGain.GDALSetNoDataValue(obsnodata_opt[0]);
+	// }
+
+	if(verbose_opt[0]){
+	  cout << "processing time " << tmodel_opt.back() << endl;
+	  if(obsindex<relobsindex.size()){
+	    assert(tmodel_opt.size()>relobsindex[obsindex]);
+	    cout << "next observation " << tmodel_opt[relobsindex[obsindex]] << endl;
+	  }
+	  else
+	    cout << "There is no next observation" << endl;
+	}
+	if(model_opt.size()==nmodel){
+	  imgReaderModel1.open(model_opt.back());
+	  imgReaderModel1.setNoData(modnodata_opt);
+	}
+	if(modelmask_opt.size()==nmodel){
+	  imgReaderModel1Mask.open(modelmask_opt[0]);
+	  imgReaderModel1Mask.setNoData(msknodata_opt);
+	}
       }
-      if(update){
-	if(verbose_opt[0])
-	  cout << "***update " << relobsindex[obsindex] << " = " << modindex << " " << observation_opt[obsindex] << " ***" << endl;
-
-	imgReaderObs.open(observation_opt[obsindex]);
-	imgReaderObs.getGeoTransform(geotransform);
-	imgReaderObs.setNoData(obsnodata_opt);
+      catch(string errorString){
+	cerr << errorString << endl;
       }
-      //prediction (also to fill cloudy pixels in measurement update mode)
-      string input;
-      if(outputfw_opt.size()==model_opt.size())
-	input=outputfw_opt[modindex-1];
-      else{
-	ostringstream outputstream;
-	outputstream << outputfw_opt[0] << "_";
-	outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex-1];
-	outputstream << ".tif";
-	// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex-1] << ".tif";
-	input=outputstream.str();
+      catch(...){
+	cerr << "Error opening file " << model_opt[0] << endl;
       }
-      if(verbose_opt[0])
-	cout << "opening " << input << endl;
-      ImgReaderGdal imgReaderEst(input);
-      imgReaderEst.setNoData(obsnodata_opt);
-
-      vector< vector<double> > obsLineVector(down_opt[0]);
-      vector<double> obsLineBuffer;
-      vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
-      vector<double> model1LineBuffer;
-      vector<double> model2LineBuffer;
-      vector<double> model1buffer;//buffer for model 1 to calculate time regression based on window
-      vector<double> model2buffer;//buffer for model 2 to calculate time regression based on window
-      vector<double> uncertObsLineBuffer;
-      vector< vector<double> > estLineVector(down_opt[0]);
-      vector<double> estLineBuffer;
-      vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel
-      vector<double> uncertReadBuffer;
-      vector<double> estWriteBuffer(ncol);
-      vector<double> uncertWriteBuffer(ncol);
-      vector<double> gainWriteBuffer(ncol);
 
-      //initialize obsLineVector if update
-      if(update){
+      double modRow=0;
+      double modCol=0;
+      double lowerCol=0;
+      double upperCol=0;
+      RESAMPLE theResample=BILINEAR;
+
+      if(relobsindex.back()<nmodel-1){//initialize output_opt.back() as last model
+	//write last model as output
 	if(verbose_opt[0])
-	  cout << "initialize obsLineVector" << endl;
-	assert(down_opt[0]%2);//window size must be odd 
-	for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
-	  if(iline<0)//replicate line 0
-	    imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);
-	  else
-	    imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
-	}
-      }
-      //initialize estLineVector
-      if(verbose_opt[0])
-	cout << "initialize estLineVector" << endl;
-      assert(down_opt[0]%2);//window size must be odd 
-      for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
-	if(iline<0)//replicate line 0
-	  imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);
-	else
-	  imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
-      }
-      statfactory::StatFactory statobs;
-      statobs.setNoDataValues(obsnodata_opt);
-
-      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
-	//todo: read entire window for uncertReadBuffer...
-	for(int irow=jrow;irow<jrow+down_opt[0];++irow){
-	  imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);
-	  imgReaderEst.image2geo(0,irow,geox,geoy);
-	  imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
-	  assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
-	  imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0,theResample);
-
-	  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	  assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	  imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0,theResample);
-
-	  int maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;
-	  estLineVector.erase(estLineVector.begin());
-	  imgReaderEst.readData(estLineBuffer,GDT_Float64,maxRow,0);
-	  estLineVector.push_back(estLineBuffer);
-	  estLineBuffer=estLineVector[down_opt[0]/2];
-
-	  if(update){
-	    int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
-	    obsLineVector.erase(obsLineVector.begin());
-	    imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);
-	    obsLineVector.push_back(obsLineBuffer);
-	    obsLineBuffer=obsLineVector[down_opt[0]/2];
-	    // imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);
-	    if(imgReaderObs.nrOfBand()>1)
-	      imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
-	  }
-	  for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
-	    for(int icol=jcol;icol<jcol+down_opt[0];++icol){
-	      imgReaderEst.image2geo(icol,irow,geox,geoy);
-	      int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
-	      int maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;
-	      int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
-	      int maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;
-	      estWindowBuffer.clear();
-	      for(int iline=0;iline<estLineVector.size();++iline){
-		for(int isample=minCol;isample<=maxCol;++isample){
-		  assert(isample<estLineVector[iline].size());
-		  estWindowBuffer.push_back(estLineVector[iline][isample]);
-		}
-	      }
-	      if(update){
-		obsWindowBuffer.clear();
-		for(int iline=0;iline<obsLineVector.size();++iline){
-		  for(int isample=minCol;isample<=maxCol;++isample){
-		    assert(isample<obsLineVector[iline].size());
-		    obsWindowBuffer.push_back(obsLineVector[iline][isample]);
-		  }
-		}
-	      }
-	      double estValue=estLineBuffer[icol];
+	  cout << "write last model as output" << endl;
+	for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+	  vector<double> estReadBuffer;
+	  vector<double> lineModelMask;
+	  vector<double> estWriteBuffer(ncol);
+	  vector<double> uncertWriteBuffer(ncol);
+	  // //test
+	  // vector<double> gainWriteBuffer(ncol);
+	  try{
+	    for(int irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){
+	      imgWriterEst.image2geo(0,irow,geox,geoy);
 	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	      assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
-	      lowerCol=modCol-0.5;
-	      lowerCol=static_cast<int>(lowerCol);
-	      upperCol=modCol+0.5;
-	      upperCol=static_cast<int>(upperCol);
-	      if(lowerCol<0)
-		lowerCol=0;
-	      if(upperCol>=imgReaderModel1.nrOfCol())
-		upperCol=imgReaderModel1.nrOfCol()-1;
-	      double modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];
-	      // double modValue1=model1LineBuffer[modCol];
-	      imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
-	      assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
-	      lowerCol=modCol-0.5;
-	      lowerCol=static_cast<int>(lowerCol);
-	      upperCol=modCol+0.5;
-	      upperCol=static_cast<int>(upperCol);
-	      if(lowerCol<0)
-		lowerCol=0;
-	      if(upperCol>=imgReaderModel1.nrOfCol())
-		upperCol=imgReaderModel1.nrOfCol()-1;
-	      double modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];
-	      // double modValue2=model2LineBuffer[modCol];
-	      if(imgReaderEst.isNoData(estValue)){
-		//we have not found any valid data yet, better here to take the current model value if valid
-		if(imgReaderModel2.isNoData(modValue2)){//if both estimate and model are no-data, set obs to nodata
-		  estWriteBuffer[icol]=obsnodata_opt[0];
-		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
-		  gainWriteBuffer[icol]=0;
-		}
-		else{
-		  estWriteBuffer[icol]=modValue2;
-		  uncertWriteBuffer[icol]=uncertModel_opt[0];//*stdDev*stdDev;
-		  if(obsmin_opt.size()){
-		    if(estWriteBuffer[icol]<obsmin_opt[0])
-		      estWriteBuffer[icol]=obsmin_opt[0];
+	      if(modRow<0||modRow>=imgReaderModel1.nrOfRow()){
+		cerr << "Error: geo coordinates (" << geox << "," << geoy << ") not covered in model image " << imgReaderModel1.getFileName() << endl;
+		assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+	      }
+	      // imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);
+	      int readModelBand=(model_opt.size()==nmodel)? 0:nmodel-1;
+	      int readModelMaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:0;
+	      imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,readModelBand,theResample);
+	      if(modelmask_opt.size())
+		imgReaderModel1Mask.readData(lineModelMask,GDT_Float64,modRow,readModelMaskBand,theResample);
+	      for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
+		for(int icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){
+		  imgWriterEst.image2geo(icol,irow,geox,geoy);
+		  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+		  if(lineModelMask.size()>modCol){
+		    if(imgReaderModel1Mask.isNoData(lineModelMask[modCol])){
+		      estWriteBuffer[icol]=obsnodata_opt[0];
+		      uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		      //test
+		      // gainWriteBuffer[icol]=obsnodata_opt[0];
+		      continue;
+		    }
 		  }
-		  if(obsmax_opt.size()){
-		    if(estWriteBuffer[icol]>obsmax_opt[0])
-		      estWriteBuffer[icol]=obsmax_opt[0];
-		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
-		      uncertWriteBuffer[icol]=obsmax_opt[0];
+		  lowerCol=modCol-0.5;
+		  lowerCol=static_cast<int>(lowerCol);
+		  upperCol=modCol+0.5;
+		  upperCol=static_cast<int>(upperCol);
+		  if(lowerCol<0)
+		    lowerCol=0;
+		  if(upperCol>=imgReaderModel1.nrOfCol())
+		    upperCol=imgReaderModel1.nrOfCol()-1;
+		  double modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];
+		  // double modValue=estReadBuffer[modCol];
+		  if(imgReaderModel1.isNoData(modValue)){
+		    estWriteBuffer[icol]=obsnodata_opt[0];
+		    uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		    //test
+		    // gainWriteBuffer[icol]=obsnodata_opt[0];
+		    continue;
 		  }
-		  gainWriteBuffer[icol]=0;
-		}
-	      }
-	      else{//previous estimate is valid
-		double estMeanValue=statobs.mean(estWindowBuffer);
-		double nvalid=0;
-		//time update
-		double processNoiseVariance=processNoise_opt[0];
-		//todo: estimate process noise variance expressing instability of weights over time
-		//estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. 
-
-		if(imgReaderModel1.isNoData(modValue1)||imgReaderModel2.isNoData(modValue2)){
-		  estWriteBuffer[icol]=estValue;
-		  uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;
-		}
-		else{//model is good
-		  double modRatio=modValue2/modValue1;//transition matrix A in Kalman equations
-		  estWriteBuffer[icol]=estValue*modRatio;
-		  uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;
-		}
-		if(obsmin_opt.size()){
-		  if(estWriteBuffer[icol]<obsmin_opt[0])
-		    estWriteBuffer[icol]=obsmin_opt[0];
-		}
-		if(obsmax_opt.size()){
-		  if(estWriteBuffer[icol]>obsmax_opt[0])
-		    estWriteBuffer[icol]=obsmax_opt[0];
-		  if(uncertWriteBuffer[icol]>obsmax_opt[0])
-		    uncertWriteBuffer[icol]=obsmax_opt[0];
-		}
-	      }
-	      //measurement update
-	      if(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){
-		double kalmanGain=1;
-		if(!imgReaderModel2.isNoData(modValue2)){//model is valid
-		  statfactory::StatFactory statobs;
-		  statobs.setNoDataValues(obsnodata_opt);
-		  double obsMeanValue=statobs.mean(obsWindowBuffer);
-		  double difference=0;
-		  difference=obsMeanValue-modValue2;
-		  errObs=uncertObs_opt[0]*sqrt(difference*difference);
-		  // errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)
-
-		  if(errObs<eps_opt[0])
-		    errObs=eps_opt[0];
-		  double errorCovariance=uncertWriteBuffer[icol];//P in Kalman equations
-
-		  if(errorCovariance+errObs>eps_opt[0])
-		    kalmanGain=errorCovariance/(errorCovariance+errObs);
-		  else 
-		    kalmanGain=1;
-		  estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
-		  uncertWriteBuffer[icol]*=(1-kalmanGain);
+		  estWriteBuffer[icol]=modValue;
 		  if(obsmin_opt.size()){
 		    if(estWriteBuffer[icol]<obsmin_opt[0])
 		      estWriteBuffer[icol]=obsmin_opt[0];
@@ -809,111 +1183,89 @@ int main(int argc,char **argv) {
 		  if(obsmax_opt.size()){
 		    if(estWriteBuffer[icol]>obsmax_opt[0])
 		      estWriteBuffer[icol]=obsmax_opt[0];
-		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
-		      uncertWriteBuffer[icol]=obsmax_opt[0];
 		  }
+		  uncertWriteBuffer[icol]=uncertModel_opt[0];//*stdDev*stdDev;
+		  //test
+		  // gainWriteBuffer[icol]=0;
 		}
-		assert(kalmanGain<=1);
-		gainWriteBuffer[icol]=kalmanGain;
 	      }
+	      imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,nmodel-1);
+	      imgWriterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,nmodel-1);
+	      // //test
+	      // if(gain_opt.size())
+	      //   imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);
 	    }
 	  }
-	  //test
-	  if(gain_opt.size()){
-	    imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,modindex);
+	  catch(string errorString){
+	    cerr << errorString << endl;
+	  }
+	  catch(...){
+	    cerr << "Error writing file " << imgWriterEst.getFileName() << endl;
 	  }
-	  imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	  imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
-	  progress=static_cast<float>((irow+1.0)/imgWriterEst.nrOfRow());
-	  pfnProgress(progress,pszMessage,pProgressArg);
 	}
       }
-      imgWriterEst.close();
-      imgReaderEst.close();
-
-      if(update){
-	imgReaderObs.close();
-	++obsindex;
-      }
-      imgReaderModel1.close();
-      imgReaderModel2.close();
-    }
-    if(gain_opt.size())
-      imgWriterGain.close();
-  }
-  if(find(direction_opt.begin(),direction_opt.end(),"backward")!=direction_opt.end()){
-    ///////////////////////////// backward model /////////////////////////
-    cout << "Running backward model" << endl;
-    obsindex=relobsindex.size()-1;
-    //initialization
-    string output;
-    if(outputbw_opt.size()==model_opt.size())
-      output=outputbw_opt.back();
-    else{
-      ostringstream outputstream;
-      outputstream << outputbw_opt[0] << "_";
-      outputstream << setfill('0') << setw(ndigit) << tmodel_opt.back();
-      outputstream << ".tif";
-      // outputstream << outputbw_opt[0] << "_" << tmodel_opt.back() << ".tif";
-      output=outputstream.str();
-    }
-    if(verbose_opt[0])
-      cout << "Opening image " << output << " for writing " << endl;
-
-    imgWriterEst.open(output,ncol,nrow,2,theType,imageType,option_opt);
-    imgWriterEst.setProjectionProj4(projection_opt[0]);
-    imgWriterEst.setGeoTransform(geotransform);
-    imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
-
-    if(verbose_opt[0]){
-      cout << "processing time " << tmodel_opt.back() << endl;
-      if(obsindex<relobsindex.size())
-	cout << "next observation " << tmodel_opt[relobsindex[obsindex]] << endl;
-      else
-	cout << "There is no next observation" << endl;
-    }
-
-    try{
-      imgReaderModel1.open(model_opt.back());
-      imgReaderModel1.setNoData(modnodata_opt);
-    }
-    catch(string errorString){
-      cerr << errorString << endl;
-    }
-    catch(...){
-      cerr << "Error opening file " << model_opt[0] << endl;
-    }
-
-    //calculate standard deviation of image to serve as model uncertainty
-    // GDALRasterBand* rasterBand;
-    // rasterBand=imgReaderModel1.getRasterBand(0);
-    // double minValue, maxValue, meanValue, stdDev;
-    // void* pProgressData;
-    // rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);
-    double modRow=0;
-    double modCol=0;
-    double lowerCol=0;
-    double upperCol=0;
-    RESAMPLE theResample=BILINEAR;
-
-    if(relobsindex.back()<model_opt.size()-1){//initialize output_opt.back() as model[0]
-      //write last model as output
-      if(verbose_opt[0])
-	cout << "write last model as output" << endl;
-      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+      else{//we have a measurement at end time
+	if(verbose_opt[0])
+	  cout << "we have a measurement at end time" << endl;
+	if(observation_opt.size()==nobs){
+	  imgReaderObs.open(observation_opt.back());
+	  imgReaderObs.setNoData(obsnodata_opt);
+	}
+	if(observationmask_opt.size()==nobs){
+	  imgReaderObsMask.open(observationmask_opt.back());
+	  imgReaderObsMask.setNoData(msknodata_opt);
+	}
+	imgReaderObs.getGeoTransform(geotransform);
+      
+	vector< vector<double> > obsLineVector(down_opt[0]);
+	vector<double> obsLineBuffer;
+	vector<double> obsMaskLineBuffer;
+	vector<double> modelMaskLineBuffer;
+	vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
 	vector<double> estReadBuffer;
 	vector<double> estWriteBuffer(ncol);
 	vector<double> uncertWriteBuffer(ncol);
-	try{
-	  for(int irow=jrow;irow<jrow+down_opt[0];++irow){
+	vector<double> uncertObsLineBuffer;
+	// //test
+	// vector<double> gainWriteBuffer(ncol);
+
+	if(verbose_opt[0])
+	  cout << "initialize obsLineVector" << endl;
+	assert(down_opt[0]%2);//window size must be odd 
+	int readObsBand=(observation_opt.size()==nobs)? 0:nobs-1;
+	int readObsMaskBand=(observationmask_opt.size()==nobs)? mskband_opt[0]:nobs-1;
+	int readModelBand=(model_opt.size()==nmodel)? 0:nmodel-1;
+	int readModelMaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:nmodel-1;
+	for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
+	  if(iline<0)//replicate line 0
+	    imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,readObsBand);
+	  else
+	    imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,readObsBand);
+	}
+	for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+	  for(int irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){
 	    imgWriterEst.image2geo(0,irow,geox,geoy);
 	    imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
 	    assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	    imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);
+	    imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,readModelBand,theResample);
+	    if(modelmask_opt.size())
+	      imgReaderModel1Mask.readData(modelMaskLineBuffer,GDT_Float64,modRow,readModelMaskBand);
+	    int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+	    obsLineVector.erase(obsLineVector.begin());
+	    imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,readObsBand);
+	    obsLineVector.push_back(obsLineBuffer);
+
+	    if(observationmask_opt.size())
+	      imgReaderObsMask.readData(obsMaskLineBuffer,GDT_Float64,irow,readObsMaskBand);
+
 	    for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
-	      for(int icol=icol;icol<icol+down_opt[0];++icol){
+	      for(int icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){
 		imgWriterEst.image2geo(icol,irow,geox,geoy);
 		imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+		assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+		bool modelIsNoData=false;
+		if(modelmask_opt.size())
+		  modelIsNoData=imgReaderModel1Mask.isNoData(modelMaskLineBuffer[modCol]);
 		lowerCol=modCol-0.5;
 		lowerCol=static_cast<int>(lowerCol);
 		upperCol=modCol+0.5;
@@ -923,428 +1275,364 @@ int main(int argc,char **argv) {
 		if(upperCol>=imgReaderModel1.nrOfCol())
 		  upperCol=imgReaderModel1.nrOfCol()-1;
 		double modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];
-
 		// double modValue=estReadBuffer[modCol];
-		if(imgReaderModel1.isNoData(modValue)){
-		  estWriteBuffer[icol]=obsnodata_opt[0];
-		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
-		}
-		else{
-		  estWriteBuffer[icol]=modValue;
-		  uncertWriteBuffer[icol]=uncertModel_opt[0];//*stdDev*stdDev;
-		  if(obsmin_opt.size()){
-		    if(estWriteBuffer[icol]<obsmin_opt[0])
-		      estWriteBuffer[icol]=obsmin_opt[0];
+		double errMod=uncertModel_opt[0];//*stdDev*stdDev;
+		modelIsNoData=modelIsNoData||imgReaderModel1.isNoData(modValue);
+		bool obsIsNoData=false;
+		if(observationmask_opt.size())
+		  obsIsNoData=imgReaderObsMask.isNoData(obsMaskLineBuffer[icol]);
+		obsIsNoData=obsIsNoData||imgReaderObs.isNoData(obsLineBuffer[icol]);
+		if(modelIsNoData){//model is nodata: retain observation 
+		  if(obsIsNoData){//both model and observation nodata
+		    estWriteBuffer[icol]=obsnodata_opt[0];
+		    uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		    //test
+		    // gainWriteBuffer[icol]=obsnodata_opt[0];
 		  }
-		  if(obsmax_opt.size()){
-		    if(estWriteBuffer[icol]>obsmax_opt[0])
-		      estWriteBuffer[icol]=obsmax_opt[0];
-		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
-		      uncertWriteBuffer[icol]=obsmax_opt[0];
-		  }
-		}
-	      }
-	    }
-	    imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	    imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
-	  }
-	}
-	catch(string errorString){
-	  cerr << errorString << endl;
-	}
-	catch(...){
-	  cerr << "Error writing file " << imgWriterEst.getFileName() << endl;
-	}
-      }
-    }
-    else{//we have a measurement at end time
-      if(verbose_opt[0])
-	cout << "we have a measurement at end time" << endl;
-      imgReaderObs.open(observation_opt.back());
-      imgReaderObs.getGeoTransform(geotransform);
-      imgReaderObs.setNoData(obsnodata_opt);
-      
-      vector< vector<double> > obsLineVector(down_opt[0]);
-      vector<double> obsLineBuffer;
-      vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
-      vector<double> estReadBuffer;
-      vector<double> estWriteBuffer(ncol);
-      vector<double> uncertWriteBuffer(ncol);
-      vector<double> uncertObsLineBuffer;
-
-      if(verbose_opt[0])
-	cout << "initialize obsLineVector" << endl;
-      assert(down_opt[0]%2);//window size must be odd 
-      for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
-	if(iline<0)//replicate line 0
-	  imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);
-	else
-	  imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
-      }
-      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
-	for(int irow=jrow;irow<jrow+down_opt[0];++irow){
-	  imgWriterEst.image2geo(0,irow,geox,geoy);
-	  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	  assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	  RESAMPLE theResample=BILINEAR;
-	  imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);
-	  int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
-	  obsLineVector.erase(obsLineVector.begin());
-	  imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);
-	  obsLineVector.push_back(obsLineBuffer);
-	  // obsLineBuffer=obsLineVector[down_opt[0]/2];
-	  if(imgReaderObs.nrOfBand()>1)
-	    imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
-
-	  for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
-	    for(int icol=jcol;icol<jcol+down_opt[0];++icol){
-	      imgWriterEst.image2geo(icol,irow,geox,geoy);
-	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	      assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	      lowerCol=modCol-0.5;
-	      lowerCol=static_cast<int>(lowerCol);
-	      upperCol=modCol+0.5;
-	      upperCol=static_cast<int>(upperCol);
-	      if(lowerCol<0)
-		lowerCol=0;
-	      if(upperCol>=imgReaderModel1.nrOfCol())
-		upperCol=imgReaderModel1.nrOfCol()-1;
-	      double modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];
-	      // double modValue=estReadBuffer[modCol];
-	      double errMod=uncertModel_opt[0];//*stdDev*stdDev;
-	      if(imgReaderModel1.isNoData(modValue)){//model is nodata: retain observation 
-		if(imgReaderObs.isNoData(obsLineBuffer[icol])){//both model and observation nodata
-		  estWriteBuffer[icol]=obsnodata_opt[0];
-		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
-		}
-		else{
-		  estWriteBuffer[icol]=obsLineBuffer[icol];
-		  if(uncertObsLineBuffer.size()>icol)
-		    uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];
-		  else
+		  else{
+		    estWriteBuffer[icol]=obsLineBuffer[icol];
+		    if(obsmin_opt.size()){
+		      if(estWriteBuffer[icol]<obsmin_opt[0])
+			estWriteBuffer[icol]=obsmin_opt[0];
+		    }
+		    if(obsmax_opt.size()){
+		      if(estWriteBuffer[icol]>obsmax_opt[0])
+			estWriteBuffer[icol]=obsmax_opt[0];
+		    }
 		    uncertWriteBuffer[icol]=uncertObs_opt[0];
-		  if(obsmin_opt.size()){
-		    if(estWriteBuffer[icol]<obsmin_opt[0])
-		      estWriteBuffer[icol]=obsmin_opt[0];
-		  }
-		  if(obsmax_opt.size()){
-		    if(estWriteBuffer[icol]>obsmax_opt[0])
-		      estWriteBuffer[icol]=obsmax_opt[0];
-		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
-		      uncertWriteBuffer[icol]=obsmax_opt[0];
 		  }
 		}
-	      }
-	      else{//model is valid: calculate estimate from model
-		estWriteBuffer[icol]=modValue;
-		uncertWriteBuffer[icol]=errMod;//in case observation is not valid
-	      }
-	      //measurement update
-	      if(!imgReaderObs.isNoData(obsLineBuffer[icol])){
-		// estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2
-		double kalmanGain=1;
-		int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
-		int maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;
-		int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
-		int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
-		obsWindowBuffer.clear();
-		for(int iline=0;iline<obsLineVector.size();++iline){
-		  for(int isample=minCol;isample<=maxCol;++isample){
-		    assert(isample<obsLineVector[iline].size());
-		    obsWindowBuffer.push_back(obsLineVector[iline][isample]);
-		  }
+		else{//model is valid: calculate estimate from model
+		  estWriteBuffer[icol]=modValue;
+		  uncertWriteBuffer[icol]=errMod;//in case observation is not valid
+		  //test
+		  // gainWriteBuffer[icol]=0;
 		}
-		if(!imgReaderModel1.isNoData(modValue)){//model is valid
-		  statfactory::StatFactory statobs;
-		  statobs.setNoDataValues(obsnodata_opt);
-		  double obsMeanValue=statobs.mean(obsWindowBuffer);
-		  double difference=0;
-		  difference=obsMeanValue-modValue;
-		  errObs=uncertObs_opt[0]*sqrt(difference*difference);
-		  // errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)
-		  double errorCovariance=errMod;//assumed initial errorCovariance (P in Kalman equations)
-		  if(errorCovariance+errObs>eps_opt[0])
-		    kalmanGain=errorCovariance/(errorCovariance+errObs);
-		  else 
-		    kalmanGain=1;
-		  estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
-		  if(obsmin_opt.size()){
-		    if(estWriteBuffer[icol]<obsmin_opt[0])
-		      estWriteBuffer[icol]=obsmin_opt[0];
+		//measurement update
+		if(!obsIsNoData){
+		  // estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2
+		  double kalmanGain=1;
+		  int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
+		  int maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;
+		  int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
+		  int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+		  obsWindowBuffer.clear();
+		  for(int iline=0;iline<obsLineVector.size();++iline){
+		    for(int isample=minCol;isample<=maxCol;++isample){
+		      assert(isample<obsLineVector[iline].size());
+		      obsWindowBuffer.push_back(obsLineVector[iline][isample]);
+		    }
 		  }
-		  if(obsmax_opt.size()){
-		    if(estWriteBuffer[icol]>obsmax_opt[0])
-		      estWriteBuffer[icol]=obsmax_opt[0];
-		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
-		      uncertWriteBuffer[icol]=obsmax_opt[0];
+		  if(!modelIsNoData){//model is valid
+		    statfactory::StatFactory statobs;
+		    statobs.setNoDataValues(obsnodata_opt);
+		    double obsMeanValue=0;
+		    double obsVarValue=0;
+		    statobs.meanVar(obsWindowBuffer,obsMeanValue,obsVarValue);
+		    double difference=0;
+		    difference=obsMeanValue-modValue;
+		    // errObs=uncertObs_opt[0]*sqrt(difference*difference);
+		    errObs=uncertObs_opt[0]*difference*difference;//uncertainty of the observation (R in Kalman equations)
+		    // double errorCovariance=errMod;
+		    double errorCovariance=processNoise_opt[0]*obsVarValue;//assumed initial errorCovariance (P in Kalman equations)
+		    if(errorCovariance+errObs>eps_opt[0])
+		      kalmanGain=errorCovariance/(errorCovariance+errObs);
+		    else 
+		      kalmanGain=1;
+		    estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
+		    if(obsmin_opt.size()){
+		      if(estWriteBuffer[icol]<obsmin_opt[0])
+			estWriteBuffer[icol]=obsmin_opt[0];
+		    }
+		    if(obsmax_opt.size()){
+		      if(estWriteBuffer[icol]>obsmax_opt[0])
+			estWriteBuffer[icol]=obsmax_opt[0];
+		      if(uncertWriteBuffer[icol]>obsmax_opt[0])
+			uncertWriteBuffer[icol]=obsmax_opt[0];
+		    }
 		  }
+		  if(kalmanGain>=1)
+		    kalmanGain=1;
+		  //test
+		  // gainWriteBuffer[icol]=kalmanGain;
 		}
-		assert(kalmanGain<=1);
 	      }
 	    }
+	    imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,nmodel-1);
+	    imgWriterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,nmodel-1);
+	    // //test
+	    // if(gain_opt.size())
+	    //   imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);
 	  }
-	  imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	  imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
 	}
-      }
-      imgReaderObs.close();
-      --obsindex;
-    }
-    
-    imgReaderModel1.close();
-    imgWriterEst.close();
-
-    for(int modindex=model_opt.size()-2;modindex>=0;--modindex){
-      if(verbose_opt[0]){
-	cout << "processing time " << tmodel_opt[modindex] << endl;
-	if(obsindex<relobsindex.size())
-	  cout << "next observation " << tmodel_opt[relobsindex[obsindex]] << endl;
-	else
-	  cout << "There is no next observation" << endl;
-      }
-      string output;
-      if(outputbw_opt.size()==model_opt.size())
-	output=outputbw_opt[modindex];
-      else{
-	ostringstream outputstream;
-	outputstream << outputbw_opt[0] << "_";
-	outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex];
-	outputstream << ".tif";
-	// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";
-	output=outputstream.str();
+	if(observation_opt.size()==nobs)
+	  imgReaderObs.close();
+	if(observationmask_opt.size()==nobs)
+	  imgReaderObsMask.close();
+	--obsindex;
       }
 
-      //two band output band0=estimation, band1=uncertainty
-      imgWriterEst.open(output,ncol,nrow,2,theType,imageType,option_opt);
-      imgWriterEst.setProjectionProj4(projection_opt[0]);
-      imgWriterEst.setGeoTransform(geotransform);
-      imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
+      if(model_opt.size()==nmodel)
+	imgReaderModel1.close();
+      if(modelmask_opt.size()==nmodel)
+	imgReaderModel1Mask.close();
+      imgWriterEst.close();
+      imgWriterUncert.close();
+
+      ImgUpdaterGdal imgUpdaterEst;
+      ImgUpdaterGdal imgUpdaterUncert;
+      for(int modindex=nmodel-2;modindex>=0;--modindex){
+	imgUpdaterEst.open(outputbw_opt[0]);
+	imgUpdaterEst.setNoData(obsnodata_opt);
+	imgUpdaterUncert.open(uncertbw_opt[0]);
+	if(verbose_opt[0]){
+	  cout << "processing time " << tmodel_opt[modindex] << endl;
+	  if(obsindex<relobsindex.size())
+	    cout << "next observation " << tmodel_opt[relobsindex[obsindex]] << endl;
+	  else
+	    cout << "There is no next observation" << endl;
+	}
 
-      //calculate regression between two subsequence model inputs
-      imgReaderModel1.open(model_opt[modindex+1]);
-      imgReaderModel1.setNoData(modnodata_opt);
-      imgReaderModel2.open(model_opt[modindex]);
-      imgReaderModel2.setNoData(modnodata_opt);
-      //calculate regression
-      //we could re-use the points from second image from last run, but
-      //to keep it general, we must redo it (overlap might have changed)
+	//calculate regression between two subsequence model inputs
+	if(model_opt.size()==nmodel){
+	  imgReaderModel1.open(model_opt[modindex+1]);
+	  imgReaderModel1.setNoData(modnodata_opt);
+	  imgReaderModel2.open(model_opt[modindex]);
+	  imgReaderModel2.setNoData(modnodata_opt);
+	}
+	if(modelmask_opt.size()==nmodel){
+	  imgReaderModel1Mask.open(modelmask_opt[modindex-1]);
+	  imgReaderModel1Mask.setNoData(msknodata_opt);
+	  imgReaderModel2Mask.open(modelmask_opt[modindex]);
+	  imgReaderModel2Mask.setNoData(msknodata_opt);
+	}
     
-      pfnProgress(progress,pszMessage,pProgressArg);
-
-      bool update=false;
-      if(obsindex<relobsindex.size()){
-	update=(relobsindex[obsindex]==modindex);
-      }
-      if(update){
-	if(verbose_opt[0])
-	  cout << "***update " << relobsindex[obsindex] << " = " << modindex << " " << observation_opt[obsindex] << " ***" << endl;
+	pfnProgress(progress,pszMessage,pProgressArg);
 
-	imgReaderObs.open(observation_opt[obsindex]);
-	imgReaderObs.getGeoTransform(geotransform);
-	imgReaderObs.setNoData(obsnodata_opt);
-      }
-      //prediction (also to fill cloudy pixels in update mode)
-      string input;
-      if(outputbw_opt.size()==model_opt.size())
-	input=outputbw_opt[modindex+1];
-      else{
-	ostringstream outputstream;
-	outputstream << outputbw_opt[0] << "_";
-	outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex+1];
-	outputstream << ".tif";
-	// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex+1] << ".tif";
-	input=outputstream.str();
-      }
-      if(verbose_opt[0])
-	cout << "opening " << input << endl;
-      ImgReaderGdal imgReaderEst(input);
-      imgReaderEst.setNoData(obsnodata_opt);
+	bool update=false;
+	if(obsindex<relobsindex.size()){
+	  update=(relobsindex[obsindex]==modindex);
+	}
+	if(update){
+	  if(observation_opt.size()==nobs){
+	    if(verbose_opt[0])
+	      cout << "***update " << relobsindex[obsindex] << " = " << modindex << " " << observation_opt[obsindex] << " ***" << endl;
+	    imgReaderObs.open(observation_opt[obsindex]);
+	    imgReaderObs.getGeoTransform(geotransform);
+	    imgReaderObs.setNoData(obsnodata_opt);
+	  }
+	  if(observationmask_opt.size()==nobs){
+	    imgReaderObsMask.open(observationmask_opt[obsindex]);
+	    imgReaderObsMask.setNoData(msknodata_opt);
+	  }
+	}
+	//prediction (also to fill cloudy pixels in update mode)
+	string input;
+	input=outputbw_opt[0];
       
-      vector< vector<double> > obsLineVector(down_opt[0]);
-      vector<double> obsLineBuffer;
-      vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
-      vector<double> model1LineBuffer;
-      vector<double> model2LineBuffer;
-      vector<double> model1buffer;//buffer for model 1 to calculate time regression based on window
-      vector<double> model2buffer;//buffer for model 2 to calculate time regression based on window
-      vector<double> uncertObsLineBuffer;
-      vector< vector<double> > estLineVector(down_opt[0]);
-      vector<double> estLineBuffer;
-      vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel
-      vector<double> uncertReadBuffer;
-      vector<double> estWriteBuffer(ncol);
-      vector<double> uncertWriteBuffer(ncol);
+	vector< vector<double> > obsLineVector(down_opt[0]);
+	vector<double> obsLineBuffer;
+	vector<double> obsMaskLineBuffer;
+	vector<double> model1MaskLineBuffer;
+	vector<double> model2MaskLineBuffer;
+	vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
+	vector<double> model1LineBuffer;
+	vector<double> model2LineBuffer;
+	vector<double> model1buffer;//buffer for model 1 to calculate time regression based on window
+	vector<double> model2buffer;//buffer for model 2 to calculate time regression based on window
+	vector<double> uncertObsLineBuffer;
+	vector< vector<double> > estLineVector(down_opt[0]);
+	vector<double> estLineBuffer;
+	vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel
+	vector<double> uncertReadBuffer;
+	vector<double> estWriteBuffer(ncol);
+	vector<double> uncertWriteBuffer(ncol);
+	//test
+	// vector<double> gainWriteBuffer(ncol);
 
-      //initialize obsLineVector
-      if(update){
+	int readObsBand=(observation_opt.size()==nobs)? 0:obsindex;
+	int readObsMaskBand=(observationmask_opt.size()==nobs)? mskband_opt[0]:obsindex;
+	int readModel1Band=(model_opt.size()==nmodel)? 0:modindex+1;
+	int readModel2Band=(model_opt.size()==nmodel)? 0:modindex;
+	int readModel1MaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:modindex+1;
+	int readModel2MaskBand=(modelmask_opt.size()==nmodel)? mskband_opt[0]:modindex;
+
+	//initialize obsLineVector
+	if(update){
+	  if(verbose_opt[0])
+	    cout << "initialize obsLineVector" << endl;
+	  assert(down_opt[0]%2);//window size must be odd 
+	  for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
+	    if(iline<0)//replicate line 0
+	      imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,readObsBand);
+	    else
+	      imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,readObsBand);
+	  }
+	}
+	//initialize estLineVector
 	if(verbose_opt[0])
-	  cout << "initialize obsLineVector" << endl;
+	  cout << "initialize estLineVector" << endl;
 	assert(down_opt[0]%2);//window size must be odd 
+
 	for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
 	  if(iline<0)//replicate line 0
-	    imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);
+	    imgUpdaterEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,modindex+1);
 	  else
-	    imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
+	    imgUpdaterEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,modindex+1);
 	}
-      }
-      //initialize estLineVector
-      if(verbose_opt[0])
-	cout << "initialize estLineVector" << endl;
-      assert(down_opt[0]%2);//window size must be odd 
-      for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
-	if(iline<0)//replicate line 0
-	  imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);
-	else
-	  imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
-      }
-      statfactory::StatFactory statobs;
-      statobs.setNoDataValues(obsnodata_opt);
-
-      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
-	//todo: read entire window for uncertReadBuffer...
-	for(int irow=jrow;irow<jrow+down_opt[0];++irow){
-	  imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);
-	  imgReaderEst.image2geo(0,irow,geox,geoy);
-	  imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
-	  assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
-	  imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0,theResample);
-
-	  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	  assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	  imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0,theResample);
-
-	  int maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;
-	  estLineVector.erase(estLineVector.begin());
-	  imgReaderEst.readData(estLineBuffer,GDT_Float64,maxRow,0);
-	  estLineVector.push_back(estLineBuffer);
-	  estLineBuffer=estLineVector[down_opt[0]/2];
-
-	  if(update){
-	    int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
-	    obsLineVector.erase(obsLineVector.begin());
-	    imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);
-	    obsLineVector.push_back(obsLineBuffer);
-	    obsLineBuffer=obsLineVector[down_opt[0]/2];
-	    // imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);
-	    if(imgReaderObs.nrOfBand()>1)
-	      imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
-	  }
-	  for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
-	    for(int icol=jcol;icol<jcol+down_opt[0];++icol){
-	      imgReaderEst.image2geo(icol,irow,geox,geoy);
-	      int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
-	      int maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;
-	      int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
-	      int maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;
-	      estWindowBuffer.clear();
-	      for(int iline=0;iline<estLineVector.size();++iline){
-		for(int isample=minCol;isample<=maxCol;++isample){
-		  assert(isample<estLineVector[iline].size());
-		  estWindowBuffer.push_back(estLineVector[iline][isample]);
-		}
-	      }
-	      if(update){
-		obsWindowBuffer.clear();
-		for(int iline=0;iline<obsLineVector.size();++iline){
+	statfactory::StatFactory statobs;
+	statobs.setNoDataValues(obsnodata_opt);
+
+	for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+	  //todo: read entire window for uncertReadBuffer...
+	  for(int irow=jrow;irow<jrow+down_opt[0]&&irow<nrow;++irow){
+	    imgUpdaterUncert.readData(uncertReadBuffer,GDT_Float64,irow,modindex+1);
+	    imgUpdaterUncert.image2geo(0,irow,geox,geoy);
+	    if(model_opt.size()==nmodel){
+	      imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
+	      assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
+	      imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,readModel2Band,theResample);
+	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+	    }
+	    else{
+	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+	      imgReaderModel1.readData(model2LineBuffer,GDT_Float64,modRow,readModel2Band,theResample);
+	    }
+
+	    assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+	    imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,readModel1Band,theResample);
+	    if(modelmask_opt.size()){
+	      imgReaderModel1Mask.readData(model1MaskLineBuffer,GDT_Float64,modRow,readModel1MaskBand);
+	      if(modelmask_opt.size()==nmodel)
+		imgReaderModel2Mask.readData(model2MaskLineBuffer,GDT_Float64,modRow,readModel2MaskBand);
+	      else
+		imgReaderModel1Mask.readData(model2MaskLineBuffer,GDT_Float64,modRow,readModel2MaskBand);
+	    }
+	    int maxRow=(irow+down_opt[0]/2<imgUpdaterEst.nrOfRow()) ? irow+down_opt[0]/2 : imgUpdaterEst.nrOfRow()-1;
+	    estLineVector.erase(estLineVector.begin());
+	    imgUpdaterEst.readData(estLineBuffer,GDT_Float64,maxRow,modindex+1);
+	    estLineVector.push_back(estLineBuffer);
+	    estLineBuffer=estLineVector[down_opt[0]/2];
+
+	    if(update){
+	      int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+	      obsLineVector.erase(obsLineVector.begin());
+	      imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,readObsBand);
+	      obsLineVector.push_back(obsLineBuffer);
+	      obsLineBuffer=obsLineVector[down_opt[0]/2];
+
+	      if(observationmask_opt.size())
+		imgReaderObsMask.readData(obsMaskLineBuffer,GDT_Float64,irow,readObsBand);
+	    }
+	    for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
+	      for(int icol=jcol;icol<jcol+down_opt[0]&&icol<ncol;++icol){
+		imgUpdaterEst.image2geo(icol,irow,geox,geoy);
+		int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
+		int maxCol=(icol+down_opt[0]/2<imgUpdaterEst.nrOfCol()) ? icol+down_opt[0]/2 : imgUpdaterEst.nrOfCol()-1;
+		int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
+		int maxRow=(irow+down_opt[0]/2<imgUpdaterEst.nrOfRow()) ? irow+down_opt[0]/2 : imgUpdaterEst.nrOfRow()-1;
+		estWindowBuffer.clear();
+		for(int iline=0;iline<estLineVector.size();++iline){
 		  for(int isample=minCol;isample<=maxCol;++isample){
-		    assert(isample<obsLineVector[iline].size());
-		    obsWindowBuffer.push_back(obsLineVector[iline][isample]);
+		    assert(isample<estLineVector[iline].size());
+		    estWindowBuffer.push_back(estLineVector[iline][isample]);
 		  }
 		}
-	      }
-	      double estValue=estLineBuffer[icol];
-	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	      assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
-	      lowerCol=modCol-0.5;
-	      lowerCol=static_cast<int>(lowerCol);
-	      upperCol=modCol+0.5;
-	      upperCol=static_cast<int>(upperCol);
-	      if(lowerCol<0)
-		lowerCol=0;
-	      if(upperCol>=imgReaderModel1.nrOfCol())
-		upperCol=imgReaderModel1.nrOfCol()-1;
-	      double modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];
-	      // double modValue1=model1LineBuffer[modCol];
-	      imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
-	      assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
-	      lowerCol=modCol-0.5;
-	      lowerCol=static_cast<int>(lowerCol);
-	      upperCol=modCol+0.5;
-	      upperCol=static_cast<int>(upperCol);
-	      if(lowerCol<0)
-		lowerCol=0;
-	      if(upperCol>=imgReaderModel1.nrOfCol())
-		upperCol=imgReaderModel1.nrOfCol()-1;
-	      double modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];
-	      // double modValue2=model2LineBuffer[modCol];
-	      if(imgReaderEst.isNoData(estValue)){
-		//we have not found any valid data yet, better here to take the current model value if valid
-		if(imgReaderModel2.isNoData(modValue2)){//if both estimate and model are no-data, set obs to nodata
-		  estWriteBuffer[icol]=obsnodata_opt[0];
-		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		if(update){
+		  obsWindowBuffer.clear();
+		  for(int iline=0;iline<obsLineVector.size();++iline){
+		    for(int isample=minCol;isample<=maxCol;++isample){
+		      assert(isample<obsLineVector[iline].size());
+		      obsWindowBuffer.push_back(obsLineVector[iline][isample]);
+		    }
+		  }
 		}
-		else{
-		  estWriteBuffer[icol]=modValue2;
-		  uncertWriteBuffer[icol]=uncertModel_opt[0];//*stdDev*stdDev;
-		  if(obsmin_opt.size()){
-		    if(estWriteBuffer[icol]<obsmin_opt[0])
-		      estWriteBuffer[icol]=obsmin_opt[0];
+
+		double estValue=estLineBuffer[icol];
+		imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+		bool model1IsNoData=false;
+
+		if(modelmask_opt.size())
+		  model1IsNoData=imgReaderModel1Mask.isNoData(model1MaskLineBuffer[modCol]);
+
+		lowerCol=modCol-0.5;
+		lowerCol=static_cast<int>(lowerCol);
+		upperCol=modCol+0.5;
+		upperCol=static_cast<int>(upperCol);
+		if(lowerCol<0)
+		  lowerCol=0;
+		if(upperCol>=imgReaderModel1.nrOfCol())
+		  upperCol=imgReaderModel1.nrOfCol()-1;
+		double modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];
+		model1IsNoData=model1IsNoData||imgReaderModel1.isNoData(modValue1);
+		if(model_opt.size()==nmodel)
+		  imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
+		else
+		  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+		bool model2IsNoData=false;
+
+		if(modelmask_opt.size())
+		  model2IsNoData=imgReaderModel1Mask.isNoData(model2MaskLineBuffer[modCol]);
+		lowerCol=modCol-0.5;
+		lowerCol=static_cast<int>(lowerCol);
+		upperCol=modCol+0.5;
+		upperCol=static_cast<int>(upperCol);
+		if(lowerCol<0)
+		  lowerCol=0;
+		if(upperCol>=imgReaderModel1.nrOfCol())
+		  upperCol=imgReaderModel1.nrOfCol()-1;
+		double modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];
+		model2IsNoData=model2IsNoData||imgReaderModel1.isNoData(modValue2);
+		bool obsIsNoData=false;
+		if(observationmask_opt.size())
+		  obsIsNoData=imgReaderObsMask.isNoData(obsMaskLineBuffer[icol]);
+		obsIsNoData=obsIsNoData||imgReaderObs.isNoData(obsLineBuffer[icol]);
+
+		if(imgUpdaterEst.isNoData(estValue)){
+		  //we have not found any valid data yet, better here to take the current model value if valid
+		  if(model2IsNoData){//if both estimate and model are no-data, set obs to nodata
+		    estWriteBuffer[icol]=obsnodata_opt[0];
+		    uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		    //test
+		    // gainWriteBuffer[icol]=0;
 		  }
-		  if(obsmax_opt.size()){
-		    if(estWriteBuffer[icol]>obsmax_opt[0])
-		      estWriteBuffer[icol]=obsmax_opt[0];
-		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
-		      uncertWriteBuffer[icol]=obsmax_opt[0];
+		  else{
+		    estWriteBuffer[icol]=modValue2;
+		    uncertWriteBuffer[icol]=uncertModel_opt[0];//*stdDev*stdDev;
+		    if(obsmin_opt.size()){
+		      if(estWriteBuffer[icol]<obsmin_opt[0])
+			estWriteBuffer[icol]=obsmin_opt[0];
+		    }
+		    if(obsmax_opt.size()){
+		      if(estWriteBuffer[icol]>obsmax_opt[0])
+			estWriteBuffer[icol]=obsmax_opt[0];
+		      if(uncertWriteBuffer[icol]>obsmax_opt[0])
+			uncertWriteBuffer[icol]=obsmax_opt[0];
+		    }
+		    //test
+		    // gainWriteBuffer[icol]=0;
 		  }
 		}
-	      }
-	      else{//previous estimate is valid
-		double estMeanValue=statobs.mean(estWindowBuffer);
-		double nvalid=0;
-		//time update
-		double processNoiseVariance=processNoise_opt[0];
-		//todo: estimate process noise variance expressing instabilityof weights over time
-		//estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. 
-
-		if(imgReaderModel1.isNoData(modValue1)||imgReaderModel2.isNoData(modValue2)){
-		  estWriteBuffer[icol]=estValue;
-		  uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;
-		}
-		else{//model is good
-		  double modRatio=modValue2/modValue1;//transition matrix A in Kalman equations
-		  estWriteBuffer[icol]=estValue*modRatio;
-		  uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;
-		}
-		if(obsmin_opt.size()){
-		  if(estWriteBuffer[icol]<obsmin_opt[0])
-		    estWriteBuffer[icol]=obsmin_opt[0];
-		}
-		if(obsmax_opt.size()){
-		  if(estWriteBuffer[icol]>obsmax_opt[0])
-		    estWriteBuffer[icol]=obsmax_opt[0];
-		  if(uncertWriteBuffer[icol]>obsmax_opt[0])
-		    uncertWriteBuffer[icol]=obsmax_opt[0];
-		}
-	      }
-	      //measurement update
-	      if(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){
-		double kalmanGain=1;
-		if(!imgReaderModel2.isNoData(modValue2)){//model is valid
-		  statfactory::StatFactory statobs;
-		  statobs.setNoDataValues(obsnodata_opt);
-		  double obsMeanValue=statobs.mean(obsWindowBuffer);
-		  double difference=0;
-		  difference=obsMeanValue-modValue2;
-		  errObs=uncertObs_opt[0]*sqrt(difference*difference);
-		  // errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)
-		  double errorCovariance=uncertWriteBuffer[icol];//P in Kalman equations
-
-		  if(errorCovariance+errObs>eps_opt[0])
-		    kalmanGain=errorCovariance/(errorCovariance+errObs);
-		  else 
-		    kalmanGain=1;
-		  estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
-		  uncertWriteBuffer[icol]*=(1-kalmanGain);
+		else{//previous estimate is valid
+		  double estMeanValue=0;
+		  double estVarValue=0;
+		  statobs.meanVar(estWindowBuffer,estMeanValue,estVarValue);
+		  double nvalid=0;
+		  //time update
+		  double processNoiseVariance=processNoise_opt[0]*estVarValue;
+		  //estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. 
+
+		  if(model1IsNoData||model2IsNoData){
+		    estWriteBuffer[icol]=estValue;
+		    // uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;
+		    //todo: check following line if makes sense
+		    uncertWriteBuffer[icol]=uncertReadBuffer[icol]+uncertObs_opt[0];
+		  }
+		  else{//model is good
+		    double modRatio=modValue2/modValue1;//transition matrix A in Kalman equations
+		    estWriteBuffer[icol]=estValue*modRatio;
+		    uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;
+		  }
 		  if(obsmin_opt.size()){
 		    if(estWriteBuffer[icol]<obsmin_opt[0])
 		      estWriteBuffer[icol]=obsmin_opt[0];
@@ -1356,32 +1644,120 @@ int main(int argc,char **argv) {
 		      uncertWriteBuffer[icol]=obsmax_opt[0];
 		  }
 		}
-		assert(kalmanGain<=1);
+		//measurement update
+		if(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){
+		  double kalmanGain=1;
+		  if(!imgReaderModel1.isNoData(modValue2)){//model is valid
+		    statfactory::StatFactory statobs;
+		    statobs.setNoDataValues(obsnodata_opt);
+		    double obsMeanValue=0;
+		    double obsVarValue=0;
+		    double difference=0;
+		    statobs.meanVar(obsWindowBuffer,obsMeanValue,obsVarValue);
+		    difference=obsMeanValue-modValue2;
+		    // errObs=uncertObs_opt[0]*sqrt(difference*difference);
+		    errObs=uncertObs_opt[0]*difference*difference;//uncertainty of the observation (R in Kalman equations)
+
+		    if(errObs<eps_opt[0])
+		      errObs=eps_opt[0];
+		    double errorCovariance=uncertWriteBuffer[icol];//P in Kalman equations
+
+		    if(errorCovariance+errObs>eps_opt[0])
+		      kalmanGain=errorCovariance/(errorCovariance+errObs);
+		    else 
+		      kalmanGain=1;
+		    estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
+		    uncertWriteBuffer[icol]*=(1-kalmanGain);
+		    if(obsmin_opt.size()){
+		      if(estWriteBuffer[icol]<obsmin_opt[0])
+			estWriteBuffer[icol]=obsmin_opt[0];
+		    }
+		    if(obsmax_opt.size()){
+		      if(estWriteBuffer[icol]>obsmax_opt[0])
+			estWriteBuffer[icol]=obsmax_opt[0];
+		      if(uncertWriteBuffer[icol]>obsmax_opt[0])
+			uncertWriteBuffer[icol]=obsmax_opt[0];
+		    }
+		  }
+		  if(kalmanGain>=1)
+		    kalmanGain=1;
+		  //test
+		  // gainWriteBuffer[icol]=kalmanGain;
+		}
 	      }
 	    }
+	    // //test
+	    // if(gain_opt.size())
+	    //   imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,modindex);
+	    imgUpdaterEst.writeData(estWriteBuffer,GDT_Float64,irow,modindex);
+	    imgUpdaterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,modindex);
+	    progress=static_cast<float>((irow+1.0)/imgUpdaterEst.nrOfRow());
+	    pfnProgress(progress,pszMessage,pProgressArg);
 	  }
-	  imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	  imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
-	  progress=static_cast<float>((irow+1.0)/imgWriterEst.nrOfRow());
-	  pfnProgress(progress,pszMessage,pProgressArg);
 	}
-      }
-      imgWriterEst.close();
-      imgReaderEst.close();
+	//must close writers to ensure flush
+	imgUpdaterEst.close();
+	imgUpdaterUncert.close();
+	// imgWriterEst.close();
+	// imgReaderEst.close();
 
-      if(update){
-	imgReaderObs.close();
-	--obsindex;
+	if(update){
+	  if(observation_opt.size()==nobs)
+	    imgReaderObs.close();
+	  if(observationmask_opt.size()==nobs)
+	    imgReaderObsMask.close();
+	  --obsindex;
+	}
+	if(model_opt.size()==nmodel){
+	  imgReaderModel1.close();
+	  imgReaderModel2.close();
+	}
+	if(modelmask_opt.size()==nmodel){
+	  imgReaderModel1Mask.close();
+	  imgReaderModel2Mask.close();
+	}
       }
-      imgReaderModel1.close();
-      imgReaderModel2.close();
+      // //test
+      // if(gain_opt.size())
+      // 	imgWriterGain.close();
     }
   }
+  catch(string errorString){
+    cerr << errorString << endl;
+    exit(1);
+  }
+  catch(...){
+    cerr << "Error in backward direction " << endl;
+    exit(2);
+  }
   if(find(direction_opt.begin(),direction_opt.end(),"smooth")!=direction_opt.end()){
     ///////////////////////////// smooth model /////////////////////////
     cout << "Running smooth model" << endl;
     obsindex=0;
-    for(int modindex=0;modindex<model_opt.size();++modindex){
+
+    ImgReaderGdal imgReaderForward(outputfw_opt[0]);
+    ImgReaderGdal imgReaderBackward(outputbw_opt[0]);
+    ImgReaderGdal imgReaderForwardUncert(uncertfw_opt[0]);
+    ImgReaderGdal imgReaderBackwardUncert(uncertbw_opt[0]);
+    imgReaderForward.setNoData(obsnodata_opt);
+    imgReaderBackward.setNoData(obsnodata_opt);
+      
+    assert(imgReaderForward.nrOfBand()==nmodel);
+    assert(imgReaderForwardUncert.nrOfBand()==nmodel);
+    assert(imgReaderBackward.nrOfBand()==nmodel);
+    assert(imgReaderBackwardUncert.nrOfBand()==nmodel);
+    ImgWriterGdal imgWriterEst;
+    imgWriterEst.setNoData(obsnodata_opt);
+    ImgWriterGdal imgWriterUncert;
+    imgWriterEst.open(outputfb_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);
+    imgWriterEst.setProjectionProj4(projection_opt[0]);
+    imgWriterEst.setGeoTransform(geotransform);
+    imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
+
+    imgWriterUncert.open(uncertfb_opt[0],ncol,nrow,nmodel,theType,imageType,option_opt);
+    imgWriterUncert.setProjectionProj4(projection_opt[0]);
+    imgWriterUncert.setGeoTransform(geotransform);
+    for(int modindex=0;modindex<nmodel;++modindex){
       if(verbose_opt[0]){
 	cout << "processing time " << tmodel_opt[modindex] << endl;
 	if(obsindex<relobsindex.size())
@@ -1389,54 +1765,44 @@ int main(int argc,char **argv) {
 	else
 	  cout << "There is no next observation" << endl;
       }
-      string output;
-      if(outputfb_opt.size()==model_opt.size())
-	output=outputfb_opt[modindex];
-      else{
-	ostringstream outputstream;
-	outputstream << outputfb_opt[0] << "_";
-	outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex];
-	outputstream << ".tif";
-	// outputstream << outputfb_opt[0] << "_" << tmodel_opt[modindex] << ".tif";
-	output=outputstream.str();
-      }
+      // if(outputfb_opt.size()==model_opt.size())
+      // 	theOutput=outputfb_opt[modindex];
+      // else{
+      // 	ostringstream outputstream;
+      // 	outputstream << outputfb_opt[0] << "_";
+      // 	outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex];
+      // 	outputstream << ".tif";
+      // 	// outputstream << outputfb_opt[0] << "_" << tmodel_opt[modindex] << ".tif";
+      // 	theOutput=outputstream.str();
+      // }
     
       //two band output band0=estimation, band1=uncertainty
-      imgWriterEst.open(output,ncol,nrow,2,theType,imageType,option_opt);
-      imgWriterEst.setProjectionProj4(projection_opt[0]);
-      imgWriterEst.setGeoTransform(geotransform);
-      imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
 
       //open forward and backward estimates
       //we assume forward in model and backward in observation...
 
-      string inputfw;
-      string inputbw;
-      if(outputfw_opt.size()==model_opt.size())
-	inputfw=outputfw_opt[modindex];
-      else{
-	ostringstream outputstream;
-	outputstream << outputfw_opt[0] << "_";
-	outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex];
-	outputstream << ".tif";
-	// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";
-	inputfw=outputstream.str();
-      }
-      if(outputbw_opt.size()==model_opt.size())
-	inputbw=outputbw_opt[modindex];
-      else{
-	ostringstream outputstream;
-	outputstream << outputbw_opt[0] << "_";
-	outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex];
-	outputstream << ".tif";
-	// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";
-	inputbw=outputstream.str();
-      }
-      ImgReaderGdal imgReaderForward(inputfw);
-      ImgReaderGdal imgReaderBackward(inputbw);
-      imgReaderForward.setNoData(obsnodata_opt);
-      imgReaderBackward.setNoData(obsnodata_opt);
-      
+      // string inputfw;
+      // string inputbw;
+      // if(outputfw_opt.size()==model_opt.size())
+      // 	inputfw=outputfw_opt[modindex];
+      // else{
+      // 	ostringstream outputstream;
+      // 	outputstream << outputfw_opt[0] << "_";
+      // 	outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex];
+      // 	outputstream << ".tif";
+      // 	// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";
+      // 	inputfw=outputstream.str();
+      // }
+      // if(outputbw_opt.size()==model_opt.size())
+      // 	inputbw=outputbw_opt[modindex];
+      // else{
+      // 	ostringstream outputstream;
+      // 	outputstream << outputbw_opt[0] << "_";
+      // 	outputstream << setfill('0') << setw(ndigit) << tmodel_opt[modindex];
+      // 	outputstream << ".tif";
+      // 	// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";
+      // 	inputbw=outputstream.str();
+      // }
       vector<double> estForwardBuffer;
       vector<double> estBackwardBuffer;
       vector<double> uncertObsLineBuffer;
@@ -1452,12 +1818,23 @@ int main(int argc,char **argv) {
 	update=(relobsindex[obsindex]==modindex);
       }
 
+      int readObsBand=(observation_opt.size()==nobs)? 0:obsindex;
+
       if(update){
-	if(verbose_opt[0])
-	  cout << "***update " << relobsindex[obsindex] << " = " << modindex << " " << observation_opt[obsindex] << " ***" << endl;
-	imgReaderObs.open(observation_opt[obsindex]);
-	imgReaderObs.getGeoTransform(geotransform);
-	imgReaderObs.setNoData(obsnodata_opt);
+	if(observation_opt.size()==nobs){
+	  if(verbose_opt[0])
+	    cout << "***update " << relobsindex[obsindex] << " = " << modindex << " " << observation_opt[obsindex] << " ***" << endl;
+	  imgReaderObs.open(observation_opt[obsindex]);
+	  imgReaderObs.setNoData(obsnodata_opt);
+	  imgReaderObs.getGeoTransform(geotransform);
+	}
+	if(observationmask_opt.size()==nobs){
+	  imgReaderObsMask.open(observationmask_opt[obsindex]);
+	  imgReaderObsMask.setNoData(msknodata_opt);
+	}
+	// imgReaderObs.open(observation_opt[obsindex]);
+	// imgReaderObs.getGeoTransform(geotransform);
+	// imgReaderObs.setNoData(obsnodata_opt);
 	//calculate regression between model and observation
       }
 
@@ -1466,15 +1843,20 @@ int main(int argc,char **argv) {
       for(int irow=0;irow<imgWriterEst.nrOfRow();++irow){
 	assert(irow<imgReaderForward.nrOfRow());
 	assert(irow<imgReaderBackward.nrOfRow());
-	imgReaderForward.readData(estForwardBuffer,GDT_Float64,irow,0);
-	imgReaderBackward.readData(estBackwardBuffer,GDT_Float64,irow,0);
-	imgReaderForward.readData(uncertForwardBuffer,GDT_Float64,irow,1);
-	imgReaderBackward.readData(uncertBackwardBuffer,GDT_Float64,irow,1);
+	imgReaderForward.readData(estForwardBuffer,GDT_Float64,irow,modindex);
+	imgReaderBackward.readData(estBackwardBuffer,GDT_Float64,irow,modindex);
+	imgReaderForwardUncert.readData(uncertForwardBuffer,GDT_Float64,irow,modindex);
+	imgReaderBackwardUncert.readData(uncertBackwardBuffer,GDT_Float64,irow,modindex);
+	// imgReaderForward.readData(estForwardBuffer,GDT_Float64,irow,0);
+	// imgReaderBackward.readData(estBackwardBuffer,GDT_Float64,irow,0);
+	// imgReaderForward.readData(uncertForwardBuffer,GDT_Float64,irow,1);
+	// imgReaderBackward.readData(uncertBackwardBuffer,GDT_Float64,irow,1);
 
 	if(update){
-	  imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);
-	  if(imgReaderObs.nrOfBand()>1)
-	    imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
+	  if(observation_opt.size()==nobs)
+	    imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,readObsBand);
+	  if(observationmask_opt.size())
+	    imgReaderObsMask.readData(uncertObsLineBuffer,GDT_Float64,irow,readObsBand);
 	}
 
 	// double oldRowMask=-1;//keep track of row mask to optimize number of line readings
@@ -1538,21 +1920,26 @@ int main(int argc,char **argv) {
 	    }
 	  }
 	}
-	imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
+	imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,modindex);
+	imgWriterUncert.writeData(uncertWriteBuffer,GDT_Float64,irow,modindex);
 	progress=static_cast<float>((irow+1.0)/imgWriterEst.nrOfRow());
 	pfnProgress(progress,pszMessage,pProgressArg);
       }
-
-      imgWriterEst.close();
-      imgReaderForward.close();
-      imgReaderBackward.close();
       if(update){
-	imgReaderObs.close();
+	if(observation_opt.size()==nobs)
+	  imgReaderObs.close();
 	++obsindex;
       }
     }
+    imgReaderForward.close();
+    imgReaderBackward.close();
+    imgWriterEst.close();
+    imgWriterUncert.close();
   }
+  if(observation_opt.size()<nobs)
+    imgReaderObs.close();
+  if(model_opt.size()<nmodel)
+    imgReaderModel1.close();
   // if(mask_opt.size())
   //   maskReader.close();
 }
diff --git a/src/apps/pkoptsvm.cc b/src/apps/pkoptsvm.cc
index 9500422..5db30de 100644
--- a/src/apps/pkoptsvm.cc
+++ b/src/apps/pkoptsvm.cc
@@ -389,7 +389,7 @@ int main(int argc, char *argv[])
     exit(1);
   }
   catch(...){
-    cerr << "error catched" << std::endl;
+    cerr << "error caught" << std::endl;
     exit(1);
   }
   //todo delete class 0 ?
@@ -674,7 +674,7 @@ int main(int argc, char *argv[])
   //    cout << e.what() << endl;
   //  }
   //  catch(...){
-  //    cerr << "error catched" << std::endl;
+  //    cerr << "error caught" << std::endl;
   //    exit(1);
   //  }
 
diff --git a/src/apps/pkstatprofile.cc b/src/apps/pkstatprofile.cc
index 1e02188..b9e59e4 100644
--- a/src/apps/pkstatprofile.cc
+++ b/src/apps/pkstatprofile.cc
@@ -1,5 +1,5 @@
 /**********************************************************************
-pkstatz.cc: program to calculate statistics in temporal or spectral profile
+pkstatprofile.cc: program to calculate statistics in temporal or spectral profile
 Copyright (C) 2008-2015 Pieter Kempeneers
 
 This file is part of pktools
@@ -33,12 +33,12 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 #include "algorithms/StatFactory.h"
 
 /******************************************************************************/
-/*! \page pkstatz pkstatz
+/*! \page pkstatprofile pkstatprofile
  program to calculate statistics in temporal or spectral profile
 ## SYNOPSIS
 
 <code>
-  Usage: pkstatz -i input -o output [-f function]*
+  Usage: pkstatprofile -i input -o output [-f function]*
 </code>
 
 <code>
@@ -47,11 +47,11 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
   Advanced options: check table
 </code>
 
-\section pkstatz_description Description
+\section pkstatprofile_description Description
 
 This utility calculates statistics for a temporal (time series) or spectral profile
 
-\anchor pkstatz_functions
+\anchor pkstatprofile_functions
 
 |function | description|
 |-------------|-------------|
@@ -72,7 +72,7 @@ nvalid | report number of valid observations
 Example: Calculate min and max NDVI in time series
 
 \code
-pkstatz -i modis_ndvi_2010.tif -o modis_stats_2010.tif -f min -f max
+pkstatprofile -i modis_ndvi_2010.tif -o modis_stats_2010.tif -f min -f max
 \endcode
 
 \section pkfilter_options Options
@@ -87,12 +87,8 @@ pkstatz -i modis_ndvi_2010.tif -o modis_stats_2010.tif -f min -f max
  |class | class | std::string | | class value(s) to use for mode, proportion |
  |nodata | nodata | double | | nodata value(s) |
 
-Usage: pkstatz -i input -o ouptut [-f function]*
+Usage: pkstatprofile -i input -o ouptut [-f function]*
 
-
-Examples
-========
-Some examples how to use pkstatz can be found \ref examples_pkstatz "here"
 **/
 
 using namespace std;
@@ -137,7 +133,7 @@ int main(int argc,char **argv) {
   }
   if(!doProcess){
     cout << endl;
-    cout << "Usage: pkstatz -i input -o ouptut [-function]*" << endl;
+    cout << "Usage: pkstatprofile -i input -o ouptut [-function]*" << endl;
     cout << endl;
     std::cout << "short option -h shows basic options only, use long option --help to show all options" << std::endl;
     exit(0);//help was invoked, stop processing
diff --git a/src/apps/pksvm.cc b/src/apps/pksvm.cc
index df1e74d..a326762 100644
--- a/src/apps/pksvm.cc
+++ b/src/apps/pksvm.cc
@@ -77,7 +77,7 @@ Both raster and vector files are supported as input. The output will contain the
  | g      | gamma                | float | 1     |Gamma in kernel function | 
  | cc     | ccost                | float | 1000  |The parameter C of C_SVC, epsilon_SVR, and nu_SVR | 
  | m      | mask                 | std::string |       |Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata. | 
- | msknodata | msknodata            | short | 0     |Mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. | 
+ | msknodata | msknodata            | short | 0     |Mask value(s) not to consider for classification. Values will be taken over in classification image. | 
  | nodata | nodata               | unsigned short | 0     |Nodata value to put where image is masked as nodata | 
  | b      | band                 | short |       |Band index (starting from 0, either use band option or use start to end) | 
  | sband  | startband            | unsigned short |      |Start band sequence number | 
@@ -163,7 +163,7 @@ int main(int argc, char *argv[])
   Optionpk<int> bagSize_opt("bagsize", "bagsize", "Percentage of features used from available training features for each bootstrap aggregation (one size for all classes, or a different size for each class respectively", 100);
   Optionpk<string> classBag_opt("cb", "classbag", "Output for each individual bootstrap aggregation");
   Optionpk<string> mask_opt("m", "mask", "Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata.");
-  Optionpk<short> msknodata_opt("msknodata", "msknodata", "Mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image.", 0);
+  Optionpk<short> msknodata_opt("msknodata", "msknodata", "Mask value(s) not to consider for classification. Values will be taken over in classification image.", 0);
   Optionpk<unsigned short> nodata_opt("nodata", "nodata", "Nodata value to put where image is masked as nodata", 0);
   Optionpk<string> output_opt("o", "output", "Output classification image"); 
   Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff");
@@ -428,6 +428,7 @@ int main(int argc, char *argv[])
       try{
 	ImgReaderOgr trainingReaderBag(training_opt[ibag]);
         if(band_opt.size())
+	  //todo: when tlayer_opt is provided, readDataImageOgr does not read any layer
           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);
         else
           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);
@@ -448,7 +449,7 @@ int main(int argc, char *argv[])
         exit(1);
       }
       catch(...){
-        cerr << "error catched" << std::endl;
+        cerr << "error caught" << std::endl;
         exit(1);
       }
 
@@ -784,7 +785,7 @@ int main(int argc, char *argv[])
         exit(2);
       }
       catch(...){
-        cerr << "error catched" << std::endl;
+        cerr << "error caught" << std::endl;
         exit(1);
       }
     }
@@ -858,7 +859,7 @@ int main(int argc, char *argv[])
         exit(2);
       }
       catch(...){
-        cerr << "error catched" << std::endl;
+        cerr << "error caught" << std::endl;
         exit(1);
       }
       mask_opt.clear();
@@ -876,7 +877,7 @@ int main(int argc, char *argv[])
         exit(2);
       }
       catch(...){
-        cerr << "error catched" << std::endl;
+        cerr << "error caught" << std::endl;
         exit(1);
       }
     }
@@ -922,7 +923,7 @@ int main(int argc, char *argv[])
         exit(3);
       }
       catch(...){
-        cerr << "error catched" << std::endl;
+        cerr << "error caught" << std::endl;
         exit(3);
       }
       assert(nband==hpixel[0].size());
@@ -942,7 +943,7 @@ int main(int argc, char *argv[])
           exit(3);
         }
         catch(...){
-          cerr << "error catched" << std::endl;
+          cerr << "error caught" << std::endl;
           exit(3);
         }
       }
@@ -983,30 +984,30 @@ int main(int argc, char *argv[])
 		exit(1);
 	      }
 	      catch(...){
-		cerr << "error catched" << std::endl;
+		cerr << "error caught" << std::endl;
 		exit(3);
 	      }
 	      oldRowMask=rowMask;
 	    }
 	    short theMask=0;
 	    for(short ivalue=0;ivalue<msknodata_opt.size();++ivalue){
-	      if(msknodata_opt[ivalue]>=0){//values set in msknodata_opt are invalid
+	      // if(msknodata_opt[ivalue]>=0){//values set in msknodata_opt are invalid
 		if(lineMask[colMask]==msknodata_opt[ivalue]){
 		  theMask=lineMask[colMask];
 		  masked=true;
 		  break;
 		}
-	      }
-	      else{//only values set in msknodata_opt are valid
-		if(lineMask[colMask]!=-msknodata_opt[ivalue]){
-		  theMask=lineMask[colMask];
-		  masked=true;
-		}
-		else{
-		  masked=false;
-		  break;
-		}
-	      }
+	      // }
+	      // else{//only values set in msknodata_opt are valid
+	      // 	if(lineMask[colMask]!=-msknodata_opt[ivalue]){
+	      // 	  theMask=lineMask[colMask];
+	      // 	  masked=true;
+	      // 	}
+	      // 	else{
+	      // 	  masked=false;
+	      // 	  break;
+	      // 	}
+	      // }
 	    }
 	    if(masked){
 	      if(classBag_opt.size())
diff --git a/src/imageclasses/ImgRasterGdal.cc b/src/imageclasses/ImgRasterGdal.cc
new file mode 100644
index 0000000..d645d60
--- /dev/null
+++ b/src/imageclasses/ImgRasterGdal.cc
@@ -0,0 +1,342 @@
+/**********************************************************************
+ImgRasterGdal.cc: class to read raster files using GDAL API library
+Copyright (C) 2008-2012 Pieter Kempeneers
+
+This file is part of pktools
+
+pktools is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+pktools is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with pktools.  If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+#include <iostream>
+#include "ImgRasterGdal.h"
+
+ImgRasterGdal::ImgRasterGdal(void)
+  : m_gds(NULL), m_ncol(0), m_nrow(0), m_nband(0)
+{}
+
+//--------------------------------------------------------------------------
+void ImgRasterGdal::close(void)
+{
+  GDALClose(m_gds);
+}
+
+std::string ImgRasterGdal::getProjection(void) const 
+{
+  std::string theProjection=m_gds->GetProjectionRef();
+  // size_t startpos,endpos;
+  // while((startpos=theProjection.find(",AUTHORITY"))!=std::string::npos){
+  //   endpos=theProjection.find("]",startpos+1,1)+1;
+  //   theProjection.erase(startpos,endpos-startpos);
+  // }
+  return theProjection;
+}
+
+std::string ImgRasterGdal::getProjectionRef(void) const 
+{
+  std::string theProjection;
+  if(m_gds->GetProjectionRef())
+    return(m_gds->GetProjectionRef());
+  else
+    return "";
+}
+
+GDALDataType ImgRasterGdal::getDataType(int band) const
+{
+  assert(band<m_nband+1);
+  return (m_gds->GetRasterBand(band+1))->GetRasterDataType();
+}
+
+GDALRasterBand* ImgRasterGdal::getRasterBand(int band)
+{
+  assert(band<m_nband+1);
+  return (m_gds->GetRasterBand(band+1));
+}
+
+GDALColorTable* ImgRasterGdal::getColorTable(int band) const
+{
+  assert(band<m_nband+1);
+  return (m_gds->GetRasterBand(band+1))->GetColorTable();
+}
+
+std::string ImgRasterGdal::getDriverDescription() const
+{
+  return m_gds->GetDriver()->GetDescription();
+}
+
+void ImgRasterGdal::getGeoTransform(double* gt) const{
+  m_gds->GetGeoTransform(gt);
+}
+
+// void ImgRasterGdal::getGeoTransform(double& ulx, double& uly, double& deltaX, double& deltaY, double& rot1, double& rot2) const
+// {
+//   double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };
+//   m_gds->GetGeoTransform(adfGeoTransform);
+//   ulx=adfGeoTransform[0];
+//   deltaX=adfGeoTransform[1];
+//   rot1=adfGeoTransform[2];
+//   uly=adfGeoTransform[3];
+//   rot2=adfGeoTransform[4];
+//   deltaY=-adfGeoTransform[5];//convention of GDAL!
+// }
+
+std::string ImgRasterGdal::getGeoTransform() const
+{
+  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
+  m_gds->GetGeoTransform(gt);
+  std::ostringstream s;
+  s << "[" << gt[0] << "," << gt[1] << "," << gt[2] << "," << gt[3] << "," << gt[4] << "," << gt[5] << "]";
+  return(s.str());
+  // if(!isGeoRef())
+  //   return("");
+  // else{
+  //   double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };
+  //   m_gds->GetGeoTransform(adfGeoTransform);
+  //   double ulx=adfGeoTransform[0];
+  //   double deltaX=adfGeoTransform[1];
+  //   double rot1=adfGeoTransform[2];
+  //   double uly=adfGeoTransform[3];
+  //   double rot2=adfGeoTransform[4];
+  //   double deltaY=-adfGeoTransform[5];//convention of GDAL!
+  //   std::ostringstream s;
+  //   s << "[" << ulx << "," << deltaX << "," << rot1 << "," << uly << "," << rot2 << "," << -deltaY << "]";
+  //   return(s.str());
+  // }
+}
+
+char** ImgRasterGdal::getMetadata()
+{
+  if(m_gds->GetMetadata()!=NULL)
+    return(m_gds->GetMetadata());
+  else
+    return (char**)"";
+}
+
+char** ImgRasterGdal::getMetadata() const
+{
+  if(m_gds->GetMetadata()!=NULL)
+    return(m_gds->GetMetadata());
+  else 
+    return (char**)"";
+}
+
+void ImgRasterGdal::getMetadata(std::list<std::string>& metadata) const
+{
+  char** cmetadata=m_gds->GetMetadata();
+  while(*cmetadata!=NULL){
+    metadata.push_back(*(cmetadata));
+    ++cmetadata;
+  }
+}
+
+std::string ImgRasterGdal::getDescription() const
+{
+  if(m_gds->GetDriver()->GetDescription()!=NULL)
+    return m_gds->GetDriver()->GetDescription();
+  else
+    return "";
+}
+
+std::string ImgRasterGdal::getMetadataItem() const 
+{
+  if(m_gds->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME )!=NULL)
+    return m_gds->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME );
+  else
+    return "";
+}
+std::string ImgRasterGdal::getImageDescription() const 
+{
+  if(m_gds->GetDriver()->GetMetadataItem("TIFFTAG_IMAGEDESCRIPTION")!=NULL)
+    return m_gds->GetDriver()->GetMetadataItem("TIFFTAG_IMAGEDESCRIPTION");
+  else
+    return "";
+}
+
+std::string ImgRasterGdal::getInterleave() const
+{
+  if(m_gds->GetMetadataItem( "INTERLEAVE", "IMAGE_STRUCTURE"))
+    return m_gds->GetMetadataItem( "INTERLEAVE", "IMAGE_STRUCTURE");
+  else
+    return("BAND");
+}
+
+std::string ImgRasterGdal::getCompression() const
+{
+  if(m_gds->GetMetadataItem( "COMPRESSION", "IMAGE_STRUCTURE"))
+    return m_gds->GetMetadataItem( "COMPRESSION", "IMAGE_STRUCTURE");
+  else
+    return("NONE");
+}
+
+bool ImgRasterGdal::getBoundingBox(double& ulx, double& uly, double& lrx, double& lry) const
+{
+  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
+  m_gds->GetGeoTransform(gt);
+
+  //assuming
+  //adfGeotransform[0]: ULX (upper left X coordinate)
+  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
+  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
+  //adfGeotransform[3]: ULY (upper left Y coordinate)
+  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
+  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
+  ulx=gt[0];
+  uly=gt[3];
+  lrx=gt[0]+nrOfCol()*gt[1]+nrOfRow()*gt[2];
+  lry=gt[3]+nrOfCol()*gt[4]+nrOfRow()*gt[5];
+  if(isGeoRef()){
+    // ulx=m_ulx;
+    // uly=m_uly;
+    // lrx=ulx+nrOfCol()*m_delta_x;
+    // lry=uly-nrOfRow()*m_delta_y;
+    return true;
+  }
+  else{
+    // ulx=0;
+    // uly=nrOfRow()-1;
+    // lrx=nrOfCol()-1;
+    // lry=0;
+    return false;
+  }
+}
+
+bool ImgRasterGdal::getCenterPos(double& x, double& y) const
+{
+  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
+  m_gds->GetGeoTransform(gt);
+
+  //assuming
+  //adfGeotransform[0]: ULX (upper left X coordinate)
+  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
+  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
+  //adfGeotransform[3]: ULY (upper left Y coordinate)
+  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
+  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
+  x=gt[0]+(nrOfCol()/2.0)*gt[1]+(nrOfRow()/2.0)*gt[2];
+  y=gt[3]+(nrOfCol()/2.0)*gt[4]+(nrOfRow()/2.0)*gt[5];
+  if(isGeoRef()){
+    // x=m_ulx+(nrOfCol()/2.0)*m_delta_x;
+    // y=m_uly-(nrOfRow()/2.0)*m_delta_y;
+    return true;
+  }
+  else{
+    // x=nrOfCol()/2.0;
+    // y=nrOfRow()/2.0;
+    return false;
+  }
+}
+
+//i and j represent fraction of pixels, return true if image is georeferenced
+bool ImgRasterGdal::geo2image(double x, double y, double& i, double& j) const
+{
+  //double values are returned, caller is responsible for interpolation step
+  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
+  m_gds->GetGeoTransform(gt);
+  //assuming
+  //adfGeotransform[0]: ULX (upper left X coordinate)
+  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
+  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
+  //adfGeotransform[3]: ULY (upper left Y coordinate)
+  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
+  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
+
+  double denom=(gt[1]-gt[2]*gt[4]/gt[5]);
+  double eps=0.00001;
+  if(fabs(denom)>eps){
+    i=(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom;
+    j=(y-gt[3]-gt[4]*(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom)/gt[5];
+  }
+  if(isGeoRef()){
+    // double ulx=m_ulx;
+    // double uly=m_uly;
+    // i=(x-ulx)/m_delta_x;
+    // j=(uly-y)/m_delta_y;
+    return true;
+  }
+  else{
+    // i=x;
+    // j=nrOfRow()-y;
+    return false;
+  }
+}
+
+//x and y represent center of pixel, return true if image is georeferenced
+bool ImgRasterGdal::image2geo(double i, double j, double& x, double& y) const
+{
+  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
+  m_gds->GetGeoTransform(gt);
+
+  //assuming
+  //adfGeotransform[0]: ULX (upper left X coordinate)
+  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
+  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
+  //adfGeotransform[3]: ULY (upper left Y coordinate)
+  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
+  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
+
+  x=gt[0]+(0.5+i)*gt[1]+(0.5+j)*gt[2];
+  y=gt[3]+(0.5+i)*gt[4]+(0.5+j)*gt[5];
+  if(isGeoRef()){
+    // x=m_ulx+(0.5+i)*m_delta_x;
+    // y=m_uly-(0.5+j)*m_delta_y;
+    return true;
+  }
+  else{
+    // x=0.5+i;
+    // y=nrOfRow()-(0.5+j);
+    return false;
+  }
+}
+
+bool ImgRasterGdal::covers(double x, double  y) const
+{
+  double theULX, theULY, theLRX, theLRY;
+  getBoundingBox(theULX,theULY,theLRX,theLRY);
+  return((x > theULX)&&
+         (x < theLRX)&&
+         (y < theULY)&&
+         (y >theLRY));
+}
+
+bool ImgRasterGdal::covers(double ulx, double  uly, double lrx, double lry) const
+{
+  double theULX, theULY, theLRX, theLRY;
+  getBoundingBox(theULX,theULY,theLRX,theLRY);
+  return((ulx < theLRX)&&(lrx > theULX)&&(lry < theULY)&&(uly > theLRY));
+}
+
+int ImgRasterGdal::getNoDataValues(std::vector<double>& noDataValues) const
+{
+  if(m_noDataValues.size()){
+    noDataValues=m_noDataValues;
+    return m_noDataValues.size();
+  }
+  else
+    return 0;
+}
+
+int ImgRasterGdal::pushNoDataValue(double noDataValue)
+{
+  if(find(m_noDataValues.begin(),m_noDataValues.end(),noDataValue)==m_noDataValues.end())
+    m_noDataValues.push_back(noDataValue);
+  return(m_noDataValues.size());
+}
+
+// bool ImgRasterGdal::setNoDataValue(double noDataValue,int band)
+// {
+//   GDALRasterBand  *poBand;
+//   poBand = m_gds->GetRasterBand(band+1);
+//   if(poBand->SetNoDataValue(noDataValue)!=CE_None)
+//     return false;
+//   else
+//     return true;
+// }
diff --git a/src/imageclasses/ImgRasterGdal.h b/src/imageclasses/ImgRasterGdal.h
new file mode 100644
index 0000000..01c28fc
--- /dev/null
+++ b/src/imageclasses/ImgRasterGdal.h
@@ -0,0 +1,100 @@
+/**********************************************************************
+ImgRasterGdal.h: class to read raster files using GDAL API library
+Copyright (C) 2008-2012 Pieter Kempeneers
+
+This file is part of pktools
+
+pktools is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+pktools is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with pktools.  If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+#ifndef _IMGRASTERGDAL_H_
+#define _IMGRASTERGDAL_H_
+
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <vector>
+#include <list>
+#include <algorithm>
+#include <assert.h>
+#include "gdal_priv.h"
+
+enum RESAMPLE { NEAR = 0, BILINEAR = 1, BICUBIC = 2 };
+
+//--------------------------------------------------------------------------
+class ImgRasterGdal
+{
+public:
+  ImgRasterGdal(void);
+  virtual ~ImgRasterGdal(void){};
+
+  virtual void close(void);
+  std::string getFileName() const {return m_filename;};
+  int nrOfCol(void) const { return m_ncol;};
+  int nrOfRow(void) const { return m_nrow;};
+  int nrOfBand(void) const { return m_nband;};
+  bool isGeoRef() const {double gt[6];getGeoTransform(gt);if(gt[5]<0) return true;else return false;};
+  std::string getProjection(void) const;
+  std::string getProjectionRef(void) const;
+  std::string getGeoTransform() const;
+  void getGeoTransform(double* gt) const;
+  bool getBoundingBox (double& ulx, double& uly, double& lrx, double& lry) const;
+  bool getCenterPos(double& x, double& y) const;
+  double getUlx() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(ulx);};
+  double getUly() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(uly);};
+  double getLrx() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(lrx);};
+  double getLry() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(lry);};
+
+  int getNoDataValues(std::vector<double>& noDataValues) const;
+  bool isNoData(double value) const{if(m_noDataValues.empty()) return false;else return find(m_noDataValues.begin(),m_noDataValues.end(),value)!=m_noDataValues.end();};
+  int pushNoDataValue(double noDataValue);
+  int setNoData(const std::vector<double> nodata){m_noDataValues=nodata; return(m_noDataValues.size());};
+  CPLErr GDALSetNoDataValue(double noDataValue, int band=0) {return getRasterBand(band)->SetNoDataValue(noDataValue);};
+  bool covers(double x, double y) const;
+  bool covers(double ulx, double  uly, double lrx, double lry) const;
+  bool geo2image(double x, double y, double& i, double& j) const;
+  bool image2geo(double i, double j, double& x, double& y) const;
+  double getDeltaX(void) const {double gt[6];getGeoTransform(gt);return gt[1];};
+  double getDeltaY(void) const {double gt[6];getGeoTransform(gt);return -gt[5];};
+
+  GDALDataType getDataType(int band=0) const;
+  GDALRasterBand* getRasterBand(int band=0);
+  GDALColorTable* getColorTable(int band=0) const;
+  std::string getDriverDescription() const;
+  std::string getImageType() const{return getDriverDescription();};
+//   std::string getImageType() const{return "GTiff";};
+  std::string getInterleave() const;
+  std::string getCompression() const;
+  GDALDataset* getDataset(){return m_gds;};
+  char** getMetadata();
+  char** getMetadata() const;
+  void getMetadata(std::list<std::string>& metadata) const;
+
+  std::string getDescription() const;
+  std::string getMetadataItem() const;
+  std::string getImageDescription() const;
+
+  friend class ImgReaderGdal;
+  friend class ImgWriterGdal;
+
+protected:
+  std::string m_filename;
+  GDALDataset *m_gds;
+  int m_ncol;
+  int m_nrow;
+  int m_nband;
+  double m_gt[6];
+  std::vector<double> m_noDataValues;
+};
+
+#endif // _IMGRASTERGDAL_H_
diff --git a/src/imageclasses/ImgReaderGdal.cc b/src/imageclasses/ImgReaderGdal.cc
index d03860b..f284b69 100644
--- a/src/imageclasses/ImgReaderGdal.cc
+++ b/src/imageclasses/ImgReaderGdal.cc
@@ -23,15 +23,7 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 #include <iostream>
 #include <gsl/gsl_cdf.h>
 
-ImgReaderGdal::ImgReaderGdal(void)
-  : m_gds(NULL), m_ncol(0), m_nrow(0), m_nband(0)
-{}
-
-void ImgReaderGdal::open(const std::string& filename)//, double magicX, double magicY)
-{
-  m_filename = filename;
-  setCodec();//magicX,magicY);
-}
+ImgReaderGdal::ImgReaderGdal(void){};
 
 ImgReaderGdal::~ImgReaderGdal(void)
 {
@@ -41,15 +33,21 @@ ImgReaderGdal::~ImgReaderGdal(void)
 }
 
 //--------------------------------------------------------------------------
+void ImgReaderGdal::open(const std::string& filename, const GDALAccess& readMode)
+{
+  m_filename = filename;
+  setCodec(readMode);
+}
+
 void ImgReaderGdal::close(void)
 {
-  GDALClose(m_gds);
+  ImgRasterGdal::close();
 }
 
-void ImgReaderGdal::setCodec()//double magicX, double magicY)
+void ImgReaderGdal::setCodec(const GDALAccess& readMode)
 {
   GDALAllRegister();
-  m_gds = (GDALDataset *) GDALOpen(m_filename.c_str(), GA_ReadOnly );
+  m_gds = (GDALDataset *) GDALOpen(m_filename.c_str(), readMode );
   if(m_gds == NULL){
     std::string errorString="FileOpenError";
     throw(errorString);
@@ -80,289 +78,6 @@ void ImgReaderGdal::setCodec()//double magicX, double magicY)
   // }
 }
 
-std::string ImgReaderGdal::getProjection(void) const 
-{
-  std::string theProjection=m_gds->GetProjectionRef();
-  // size_t startpos,endpos;
-  // while((startpos=theProjection.find(",AUTHORITY"))!=std::string::npos){
-  //   endpos=theProjection.find("]",startpos+1,1)+1;
-  //   theProjection.erase(startpos,endpos-startpos);
-  // }
-  return theProjection;
-}
-
-std::string ImgReaderGdal::getProjectionRef(void) const 
-{
-  std::string theProjection;
-  if(m_gds->GetProjectionRef())
-    return(m_gds->GetProjectionRef());
-  else
-    return "";
-}
-
-GDALDataType ImgReaderGdal::getDataType(int band) const
-{
-  assert(band<m_nband+1);
-  return (m_gds->GetRasterBand(band+1))->GetRasterDataType();
-}
-
-GDALRasterBand* ImgReaderGdal::getRasterBand(int band)
-{
-  assert(band<m_nband+1);
-  return (m_gds->GetRasterBand(band+1));
-}
-
-GDALColorTable* ImgReaderGdal::getColorTable(int band) const
-{
-  assert(band<m_nband+1);
-  return (m_gds->GetRasterBand(band+1))->GetColorTable();
-}
-
-std::string ImgReaderGdal::getDriverDescription() const
-{
-  return m_gds->GetDriver()->GetDescription();
-}
-
-void ImgReaderGdal::getGeoTransform(double* gt) const{
-  m_gds->GetGeoTransform(gt);
-}
-
-// void ImgReaderGdal::getGeoTransform(double& ulx, double& uly, double& deltaX, double& deltaY, double& rot1, double& rot2) const
-// {
-//   double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };
-//   m_gds->GetGeoTransform(adfGeoTransform);
-//   ulx=adfGeoTransform[0];
-//   deltaX=adfGeoTransform[1];
-//   rot1=adfGeoTransform[2];
-//   uly=adfGeoTransform[3];
-//   rot2=adfGeoTransform[4];
-//   deltaY=-adfGeoTransform[5];//convention of GDAL!
-// }
-
-std::string ImgReaderGdal::getGeoTransform() const
-{
-  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
-  m_gds->GetGeoTransform(gt);
-  std::ostringstream s;
-  s << "[" << gt[0] << "," << gt[1] << "," << gt[2] << "," << gt[3] << "," << gt[4] << "," << gt[5] << "]";
-  return(s.str());
-  // if(!isGeoRef())
-  //   return("");
-  // else{
-  //   double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };
-  //   m_gds->GetGeoTransform(adfGeoTransform);
-  //   double ulx=adfGeoTransform[0];
-  //   double deltaX=adfGeoTransform[1];
-  //   double rot1=adfGeoTransform[2];
-  //   double uly=adfGeoTransform[3];
-  //   double rot2=adfGeoTransform[4];
-  //   double deltaY=-adfGeoTransform[5];//convention of GDAL!
-  //   std::ostringstream s;
-  //   s << "[" << ulx << "," << deltaX << "," << rot1 << "," << uly << "," << rot2 << "," << -deltaY << "]";
-  //   return(s.str());
-  // }
-}
-
-char** ImgReaderGdal::getMetadata()
-{
-  if(m_gds->GetMetadata()!=NULL)
-    return(m_gds->GetMetadata());
-  else
-    return (char**)"";
-}
-
-char** ImgReaderGdal::getMetadata() const
-{
-  if(m_gds->GetMetadata()!=NULL)
-    return(m_gds->GetMetadata());
-  else 
-    return (char**)"";
-}
-
-void ImgReaderGdal::getMetadata(std::list<std::string>& metadata) const
-{
-  char** cmetadata=m_gds->GetMetadata();
-  while(*cmetadata!=NULL){
-    metadata.push_back(*(cmetadata));
-    ++cmetadata;
-  }
-}
-
-std::string ImgReaderGdal::getDescription() const
-{
-  if(m_gds->GetDriver()->GetDescription()!=NULL)
-    return m_gds->GetDriver()->GetDescription();
-  else
-    return "";
-}
-
-std::string ImgReaderGdal::getMetadataItem() const 
-{
-  if(m_gds->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME )!=NULL)
-    return m_gds->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME );
-  else
-    return "";
-}
-std::string ImgReaderGdal::getImageDescription() const 
-{
-  if(m_gds->GetDriver()->GetMetadataItem("TIFFTAG_IMAGEDESCRIPTION")!=NULL)
-    return m_gds->GetDriver()->GetMetadataItem("TIFFTAG_IMAGEDESCRIPTION");
-  else
-    return "";
-}
-
-std::string ImgReaderGdal::getInterleave() const
-{
-  if(m_gds->GetMetadataItem( "INTERLEAVE", "IMAGE_STRUCTURE"))
-    return m_gds->GetMetadataItem( "INTERLEAVE", "IMAGE_STRUCTURE");
-  else
-    return("BAND");
-}
-
-std::string ImgReaderGdal::getCompression() const
-{
-  if(m_gds->GetMetadataItem( "COMPRESSION", "IMAGE_STRUCTURE"))
-    return m_gds->GetMetadataItem( "COMPRESSION", "IMAGE_STRUCTURE");
-  else
-    return("NONE");
-}
-
-bool ImgReaderGdal::getBoundingBox(double& ulx, double& uly, double& lrx, double& lry) const
-{
-  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
-  m_gds->GetGeoTransform(gt);
-
-  //assuming
-  //adfGeotransform[0]: ULX (upper left X coordinate)
-  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[3]: ULY (upper left Y coordinate)
-  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
-  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
-  ulx=gt[0];
-  uly=gt[3];
-  lrx=gt[0]+nrOfCol()*gt[1]+nrOfRow()*gt[2];
-  lry=gt[3]+nrOfCol()*gt[4]+nrOfRow()*gt[5];
-  if(isGeoRef()){
-    // ulx=m_ulx;
-    // uly=m_uly;
-    // lrx=ulx+nrOfCol()*m_delta_x;
-    // lry=uly-nrOfRow()*m_delta_y;
-    return true;
-  }
-  else{
-    // ulx=0;
-    // uly=nrOfRow()-1;
-    // lrx=nrOfCol()-1;
-    // lry=0;
-    return false;
-  }
-}
-
-bool ImgReaderGdal::getCenterPos(double& x, double& y) const
-{
-  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
-  m_gds->GetGeoTransform(gt);
-
-  //assuming
-  //adfGeotransform[0]: ULX (upper left X coordinate)
-  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[3]: ULY (upper left Y coordinate)
-  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
-  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
-  x=gt[0]+(nrOfCol()/2.0)*gt[1]+(nrOfRow()/2.0)*gt[2];
-  y=gt[3]+(nrOfCol()/2.0)*gt[4]+(nrOfRow()/2.0)*gt[5];
-  if(isGeoRef()){
-    // x=m_ulx+(nrOfCol()/2.0)*m_delta_x;
-    // y=m_uly-(nrOfRow()/2.0)*m_delta_y;
-    return true;
-  }
-  else{
-    // x=nrOfCol()/2.0;
-    // y=nrOfRow()/2.0;
-    return false;
-  }
-}
-
-//i and j represent fraction of pixels, return true if image is georeferenced
-bool ImgReaderGdal::geo2image(double x, double y, double& i, double& j) const
-{
-  //double values are returned, caller is responsible for interpolation step
-  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
-  m_gds->GetGeoTransform(gt);
-  //assuming
-  //adfGeotransform[0]: ULX (upper left X coordinate)
-  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[3]: ULY (upper left Y coordinate)
-  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
-  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
-
-  double denom=(gt[1]-gt[2]*gt[4]/gt[5]);
-  double eps=0.00001;
-  if(fabs(denom)>eps){
-    i=(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom;
-    j=(y-gt[3]-gt[4]*(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom)/gt[5];
-  }
-  if(isGeoRef()){
-    // double ulx=m_ulx;
-    // double uly=m_uly;
-    // i=(x-ulx)/m_delta_x;
-    // j=(uly-y)/m_delta_y;
-    return true;
-  }
-  else{
-    // i=x;
-    // j=nrOfRow()-y;
-    return false;
-  }
-}
-
-//x and y represent center of pixel, return true if image is georeferenced
-bool ImgReaderGdal::image2geo(double i, double j, double& x, double& y) const
-{
-  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
-  m_gds->GetGeoTransform(gt);
-
-  //assuming
-  //adfGeotransform[0]: ULX (upper left X coordinate)
-  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[3]: ULY (upper left Y coordinate)
-  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
-  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
-
-  x=gt[0]+(0.5+i)*gt[1]+(0.5+j)*gt[2];
-  y=gt[3]+(0.5+i)*gt[4]+(0.5+j)*gt[5];
-  if(isGeoRef()){
-    // x=m_ulx+(0.5+i)*m_delta_x;
-    // y=m_uly-(0.5+j)*m_delta_y;
-    return true;
-  }
-  else{
-    // x=0.5+i;
-    // y=nrOfRow()-(0.5+j);
-    return false;
-  }
-}
-
-bool ImgReaderGdal::covers(double x, double  y) const
-{
-  double theULX, theULY, theLRX, theLRY;
-  getBoundingBox(theULX,theULY,theLRX,theLRY);
-  return((x > theULX)&&
-         (x < theLRX)&&
-         (y < theULY)&&
-         (y >theLRY));
-}
-
-bool ImgReaderGdal::covers(double ulx, double  uly, double lrx, double lry) const
-{
-  double theULX, theULY, theLRX, theLRY;
-  getBoundingBox(theULX,theULY,theLRX,theLRY);
-  return((ulx < theLRX)&&(lrx > theULX)&&(lry < theULY)&&(uly > theLRY));
-}
 
 double ImgReaderGdal::getMin(int& x, int& y, int band) const{
   double minValue=0;
@@ -636,32 +351,6 @@ unsigned long int ImgReaderGdal::getNvalid(int band) const
     return(nrOfCol()*nrOfRow());
 }
 
-int ImgReaderGdal::getNoDataValues(std::vector<double>& noDataValues) const
-{
-  if(m_noDataValues.size()){
-    noDataValues=m_noDataValues;
-    return m_noDataValues.size();
-  }
-  else
-    return 0;
-}
-
-int ImgReaderGdal::pushNoDataValue(double noDataValue)
-{
-  if(find(m_noDataValues.begin(),m_noDataValues.end(),noDataValue)==m_noDataValues.end())
-    m_noDataValues.push_back(noDataValue);
-  return(m_noDataValues.size());
-}
-
-// bool ImgReaderGdal::setNoDataValue(double noDataValue,int band)
-// {
-//   GDALRasterBand  *poBand;
-//   poBand = m_gds->GetRasterBand(band+1);
-//   if(poBand->SetNoDataValue(noDataValue)!=CE_None)
-//     return false;
-//   else
-//     return true;
-// }
 
 void ImgReaderGdal::getRefPix(double& refX, double &refY, int band) const
 {
diff --git a/src/imageclasses/ImgReaderGdal.h b/src/imageclasses/ImgReaderGdal.h
index c44dc5e..519fe8b 100644
--- a/src/imageclasses/ImgReaderGdal.h
+++ b/src/imageclasses/ImgReaderGdal.h
@@ -20,6 +20,7 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 #ifndef _IMGREADERGDAL_H_
 #define _IMGREADERGDAL_H_
 
+#include "ImgRasterGdal.h"
 #include <assert.h>
 #include <fstream>
 #include <string>
@@ -27,37 +28,16 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 #include "gdal_priv.h"
 #include "base/Vector2d.h"
 
-enum RESAMPLE { NEAR = 0, BILINEAR = 1, BICUBIC = 2 };
-
 //--------------------------------------------------------------------------
-class ImgReaderGdal
+class ImgReaderGdal : public virtual ImgRasterGdal
 {
 public:
   ImgReaderGdal(void);
-  ImgReaderGdal(const std::string& filename){open(filename);};
+  ImgReaderGdal(const std::string& filename, const GDALAccess& readMode=GA_ReadOnly){open(filename, readMode);};
   ~ImgReaderGdal(void);
-  void open(const std::string& filename);//, double magicX=1, double magicY=1);
+  void open(const std::string& filename, const GDALAccess& readMode=GA_ReadOnly);
   void close(void);
-  std::string getFileName() const {return m_filename;};
-  int nrOfCol(void) const { return m_ncol;};
-  int nrOfRow(void) const { return m_nrow;};
-  int nrOfBand(void) const { return m_nband;};
-  bool isGeoRef() const {double gt[6];getGeoTransform(gt);if(gt[5]<0) return true;else return false;};
-  std::string getProjection(void) const;
-  std::string getProjectionRef(void) const;
-  std::string getGeoTransform() const;
-  void getGeoTransform(double* gt) const;
-  /* void getGeoTransform(double& ulx, double& uly, double& deltaX, double& deltaY, double& rot1, double& rot2) const; */
-  std::string getDescription() const;
-  std::string getMetadataItem() const;
-  std::string getImageDescription() const;
-  bool getBoundingBox (double& ulx, double& uly, double& lrx, double& lry) const;
-  bool getCenterPos(double& x, double& y) const;
-  double getUlx() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(ulx);};
-  double getUly() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(uly);};
-  double getLrx() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(lrx);};
-  double getLry() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(lry);};
-  // bool getMagicPixel(double& magicX, double& magicY) const {magicX=m_magic_x;magicY=m_magic_y;};
+
   void setScale(double theScale, int band=0){
     /* if(getRasterBand(band)->SetScale(theScale)==CE_Failure){ */
     if(m_scale.size()!=nrOfBand()){//initialize
@@ -78,17 +58,6 @@ public:
       m_offset[band]=theOffset;
     /* }; */
   }
-  int getNoDataValues(std::vector<double>& noDataValues) const;
-  bool isNoData(double value) const{if(m_noDataValues.empty()) return false;else return find(m_noDataValues.begin(),m_noDataValues.end(),value)!=m_noDataValues.end();};
-  int pushNoDataValue(double noDataValue);
-  int setNoData(const std::vector<double> nodata){m_noDataValues=nodata; return(m_noDataValues.size());};
-  CPLErr GDALSetNoDataValue(double noDataValue, int band=0) {return getRasterBand(band)->SetNoDataValue(noDataValue);};
-  bool covers(double x, double y) const;
-  bool covers(double ulx, double  uly, double lrx, double lry) const;
-  bool geo2image(double x, double y, double& i, double& j) const;
-  bool image2geo(double i, double j, double& x, double& y) const;
-  double getDeltaX(void) const {double gt[6];getGeoTransform(gt);return gt[1];};
-  double getDeltaY(void) const {double gt[6];getGeoTransform(gt);return -gt[5];};
   template<typename T> void readData(T& value, const GDALDataType& dataType, int col, int row, int band=0) const;
   template<typename T> void readData(std::vector<T>& buffer, const GDALDataType& dataType , int minCol, int maxCol, int row, int band=0) const;
   template<typename T> void readData(std::vector<T>& buffer, const GDALDataType& dataType , int minCol, int maxCol, double row, int band=0, RESAMPLE resample=NEAR) const;
@@ -104,34 +73,10 @@ public:
   void getRefPix(double& refX, double &refY, int band=0) const;
   void getRange(std::vector<short>& range, int Band=0) const;
   unsigned long int getNvalid(int band) const;
-  GDALDataType getDataType(int band=0) const;
-  GDALRasterBand* getRasterBand(int band=0);
-  GDALColorTable* getColorTable(int band=0) const;
-  std::string getDriverDescription() const;
-  std::string getImageType() const{return getDriverDescription();};
-//   std::string getImageType() const{return "GTiff";};
-  std::string getInterleave() const;
-  std::string getCompression() const;
-  GDALDataset* getDataset(){return m_gds;};
-  char** getMetadata();
-  char** getMetadata() const;
-  void getMetadata(std::list<std::string>& metadata) const;
 
 protected:
-  void setCodec();//double magicX, double magicY);
+  void setCodec(const GDALAccess& readMode=GA_ReadOnly);
 
-  std::string m_filename;
-  GDALDataset *m_gds;
-  int m_ncol;
-  int m_nrow;
-  int m_nband;
-  double m_gt[6];
-  /* double m_ulx; */
-  /* double m_uly; */
-  /* double m_delta_x; */
-  /* double m_delta_y; */
-  /* bool m_isGeoRef; */
-  std::vector<double> m_noDataValues;
   std::vector<double> m_scale;
   std::vector<double> m_offset;
 };
diff --git a/src/imageclasses/ImgReaderOgr.cc b/src/imageclasses/ImgReaderOgr.cc
index 5b6d23b..0b4316e 100644
--- a/src/imageclasses/ImgReaderOgr.cc
+++ b/src/imageclasses/ImgReaderOgr.cc
@@ -290,8 +290,15 @@ unsigned int ImgReaderOgr::readDataImageOgr(std::map<std::string,Vector2d<float>
 	  std::cout << *fit << " ";
       // size_t pos=(*fit).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ");
 	if((*fit).substr(0,1)=="B"||(*fit).substr(0,1)=="b"){
-	  if((*fit).substr(1).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){
-	    int theBand=atoi((*fit).substr(1).c_str());
+	  // if((*fit).substr(1).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){
+	  std::size_t digits=(*fit).substr(1,1).find_first_of("0123456789");
+	  std::size_t digite=(*fit).substr(1).find_first_not_of("0123456789");
+	  if((*fit)=="B" || (*fit)=="b" || (*fit)=="Band")//B is only band
+	    ++fit;
+	  else if(digits!=std::string::npos&&digite==std::string::npos){
+	    std::string digitString=(*fit).substr(digits);
+	    // int theBand=atoi((*fit).substr(1).c_str());
+	    int theBand=atoi(digitString.c_str());
 	    if(bands.size()){
 	      bool validBand=false;
 	      for(int iband=0;iband<bands.size();++iband){
@@ -306,8 +313,8 @@ unsigned int ImgReaderOgr::readDataImageOgr(std::map<std::string,Vector2d<float>
 	    else
 	      ++fit;
 	  }
-	  else if((*fit)=="B" || (*fit)=="b" || (*fit)=="Band")//B is only band
-	    ++fit;
+	  else
+	    fields.erase(fit);
 	}
 	else
 	  fields.erase(fit);
@@ -372,17 +379,23 @@ unsigned int ImgReaderOgr::readDataImageOgr(std::map<std::string,Vector2d<float>
       while(fit!=fields.end()){
 	if(verbose)
 	  std::cout << *fit << " ";
-	// size_t pos=(*fit).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ");
 	if((*fit).substr(0,1)=="B"||(*fit).substr(0,1)=="b"){
-	  if((*fit).substr(1).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){
-	    int iband=atoi((*fit).substr(1).c_str());
+	  // if((*fit).substr(1).find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ")!=std::string::npos){
+	  std::size_t digits=(*fit).substr(1,1).find_first_of("0123456789");
+	  std::size_t digite=(*fit).substr(1).find_first_not_of("0123456789");
+	  if(*fit=="B" || *fit=="b"|| *fit=="Band")
+	    ++fit;
+	  else if(digits!=std::string::npos&&digite==std::string::npos){
+	    std::string digitString=(*fit).substr(digits);
+	    int iband=atoi(digitString.c_str());
+	    // int iband=atoi((*fit).substr(1).c_str());
 	    if((start||end)&&(iband<start||iband>end))
 	      fields.erase(fit);
 	    else
 	      ++fit;
 	  }
-	  else if(*fit=="B" || *fit=="b"|| *fit=="Band")
-	    ++fit;
+	  else
+	    fields.erase(fit);
 	}
 	else
 	  fields.erase(fit);
diff --git a/src/imageclasses/ImgUpdaterGdal.cc b/src/imageclasses/ImgUpdaterGdal.cc
new file mode 100644
index 0000000..6887639
--- /dev/null
+++ b/src/imageclasses/ImgUpdaterGdal.cc
@@ -0,0 +1,45 @@
+/**********************************************************************
+ImgUpdaterGdal.cc: class to read raster files using GDAL API library
+Copyright (C) 2008-2012 Pieter Kempeneers
+
+This file is part of pktools
+
+pktools is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+pktools is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with pktools.  If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+#include <iostream>
+#include "ImgUpdaterGdal.h"
+
+ImgUpdaterGdal::ImgUpdaterGdal(void){};
+
+ImgUpdaterGdal::ImgUpdaterGdal(const std::string& filename, const GDALAccess& readMode){
+  open(filename,readMode);
+}
+
+ImgUpdaterGdal::~ImgUpdaterGdal(void)
+{
+  // delete m_gds;
+//   GDALDumpOpenDatasets(stderr);
+//   GDALDestroyDriverManager();//could be used by other objects...
+}
+
+//--------------------------------------------------------------------------
+
+void ImgUpdaterGdal::open(const std::string& filename, const GDALAccess& readMode)
+{
+  ImgReaderGdal::open(filename,readMode);
+}
+void ImgUpdaterGdal::close(void)
+{
+  ImgRasterGdal::close();
+}
diff --git a/src/imageclasses/ImgUpdaterGdal.h b/src/imageclasses/ImgUpdaterGdal.h
new file mode 100644
index 0000000..0737656
--- /dev/null
+++ b/src/imageclasses/ImgUpdaterGdal.h
@@ -0,0 +1,39 @@
+/**********************************************************************
+ImgUpdaterGdal.h: class to read raster files using GDAL API library
+Copyright (C) 2008-2012 Pieter Kempeneers
+
+This file is part of pktools
+
+pktools is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+pktools is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with pktools.  If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+#ifndef _IMGUPDATERGDAL_H_
+#define _IMGUPDATERGDAL_H_
+
+#include "ImgReaderGdal.h"
+#include "ImgWriterGdal.h"
+
+//--------------------------------------------------------------------------
+class ImgUpdaterGdal : public ImgReaderGdal, public ImgWriterGdal
+{
+public:
+  ImgUpdaterGdal(void);
+  ImgUpdaterGdal(const std::string& filename, const GDALAccess& readMode=GA_Update);
+  ~ImgUpdaterGdal(void);
+  void open(const std::string& filename, const GDALAccess& readMode=GA_Update);
+  void close(void);
+
+protected:
+};
+
+#endif // _IMGUPDATERGDAL_H_
diff --git a/src/imageclasses/ImgWriterGdal.cc b/src/imageclasses/ImgWriterGdal.cc
index 035b3a8..226b823 100644
--- a/src/imageclasses/ImgWriterGdal.cc
+++ b/src/imageclasses/ImgWriterGdal.cc
@@ -32,14 +32,13 @@ extern "C" {
 #endif
 
 //---------------------------------------------------------------------------
-ImgWriterGdal::ImgWriterGdal(void)
-  : m_gds(NULL), m_ncol(0), m_nrow(0), m_nband(0)
-{}
 
 // ImgWriterGdal::ImgWriterGdal(void)
 //   : m_gds(NULL), m_magic_x(1), m_magic_y(1), m_isGeoRef(false), m_ncol(0), m_nrow(0), m_nband(0), m_interleave("BAND"), m_compression("LZW")
 // {}
 
+ImgWriterGdal::ImgWriterGdal(void){};
+
 ImgWriterGdal::~ImgWriterGdal(void)
 {
   // delete m_gds;
@@ -55,7 +54,7 @@ void ImgWriterGdal::open(const std::string& filename, const ImgReaderGdal& imgSr
   m_ncol=imgSrc.nrOfCol();
   m_nrow=imgSrc.nrOfRow();
   m_nband=imgSrc.nrOfBand();
-  m_type=imgSrc.getDataType();
+  // m_type=imgSrc.getDataType();
   m_options=options;
   // m_interleave=imgSrc.getInterleave();
   // m_compression=imgSrc.getCompression();
@@ -85,23 +84,24 @@ void ImgWriterGdal::open(const std::string& filename, int ncol, int nrow, int nb
   m_ncol = ncol;
   m_nrow = nrow;
   m_nband = nband;
-  m_type=dataType;
+  // m_type=dataType;
   // m_interleave = interleave;
   // m_compression=compression;
   m_options=options;
   // m_magic_x=magicX;
   // m_magic_y=magicY;
-  setCodec(imageType);
+  setCodec(dataType,imageType);
 }
 
 //---------------------------------------------------------------------------
 void ImgWriterGdal::close(void)
 {
-  GDALClose(m_gds);
+  ImgRasterGdal::close();
   char **papszOptions=NULL;
   for(std::vector<std::string>::const_iterator optionIt=m_options.begin();optionIt!=m_options.end();++optionIt)
     papszOptions=CSLAddString(papszOptions,optionIt->c_str());
-  CSLDestroy(papszOptions);
+  if(papszOptions)
+    CSLDestroy(papszOptions);
 }
 
 //---------------------------------------------------------------------------
@@ -127,7 +127,7 @@ void ImgWriterGdal::setCodec(const ImgReaderGdal& imgSrc){
   // std::ostringstream interleaveList;
   // interleaveList << "INTERLEAVE=" << m_interleave;
   // papszOptions = CSLAddString(papszOptions,(interleaveList.str()).c_str());
-  m_gds=poDriver->Create(m_filename.c_str(),m_ncol,m_nrow,m_nband,m_type,papszOptions);
+  m_gds=poDriver->Create(m_filename.c_str(),m_ncol,m_nrow,m_nband,imgSrc.getDataType(),papszOptions);
   // if(imgSrc.isGeoRef()){
     setProjection(imgSrc.getProjection());
     double gt[6];
@@ -182,7 +182,7 @@ void ImgWriterGdal::setCodec(const ImgReaderGdal& imgSrc){
     setColorTable(imgSrc.getColorTable());
 }
 
-void ImgWriterGdal::setCodec(const std::string& imageType)
+void ImgWriterGdal::setCodec(const GDALDataType& dataType, const std::string& imageType)
 {
   GDALAllRegister();
   GDALDriver *poDriver;
@@ -205,7 +205,7 @@ void ImgWriterGdal::setCodec(const std::string& imageType)
   // std::ostringstream interleaveList;
   // interleaveList << "INTERLEAVE=" << m_interleave;
   // papszOptions = CSLAddString(papszOptions,(interleaveList.str()).c_str());
-  m_gds=poDriver->Create(m_filename.c_str(),m_ncol,m_nrow,m_nband,m_type,papszOptions);
+  m_gds=poDriver->Create(m_filename.c_str(),m_ncol,m_nrow,m_nband,dataType,papszOptions);
 
   // m_gds->SetMetadataItem( "INTERLEAVE", m_interleave.c_str(), "IMAGE_STRUCTURE" );
   // m_gds->SetMetadataItem( "COMPRESSION", m_compression.c_str(), "IMAGE_STRUCTURE" );
@@ -252,19 +252,6 @@ void ImgWriterGdal::setMetadata(char** metadata)
   m_gds->SetMetadata(metadata); 
 }
 
-std::string ImgWriterGdal::getProjection(void) const 
-{
-  assert(m_gds);
-  std::string theProjection=m_gds->GetProjectionRef();
-  //due to error in Gdal? AUTHORITY fields do not seem to work!
-  // size_t startpos,endpos;
-  // while((startpos=theProjection.find(",AUTHORITY"))!=string::npos){
-  //   endpos=theProjection.find("]",startpos+1,1)+1;
-  //   theProjection.erase(startpos,endpos-startpos);
-  // }
-  return theProjection;
-}
-
 //---------------------------------------------------------------------------
 void ImgWriterGdal::setGeoTransform(double* gt){
   // m_isGeoRef=true;
@@ -353,221 +340,24 @@ void ImgWriterGdal::setProjection(const std::string& projection)
 }
 
 //default projection: ETSR-LAEA
-std::string ImgWriterGdal::setProjection(void)
-{
-  std::string theProjection;
-  OGRSpatialReference oSRS;
-  char *pszSRS_WKT = NULL;
-  //// oSRS.importFromEPSG(3035);
-  oSRS.SetGeogCS("ETRS89","European_Terrestrial_Reference_System_1989","GRS 1980",6378137,298.2572221010042,"Greenwich",0,"degree",0.0174532925199433);
-  // cout << setprecision(16) << "major axis: " << oSRS.GetSemiMajor(NULL) << endl;//notice that major axis can be set to a different value than the default to the well known standard corresponding to the name (European_Terrestrial_Reference_System_1989), but that new value, while recognized by GetSemiMajor, will not be written in the geotiff tag!
-  oSRS.SetProjCS( "ETRS89 / ETRS-LAEA" );
-  oSRS.SetLAEA(52,10,4321000,3210000);
-  oSRS.exportToWkt( &pszSRS_WKT );
-  theProjection=pszSRS_WKT;
-  CPLFree( pszSRS_WKT );
-  assert(m_gds);
-  m_gds->SetProjection(theProjection.c_str());
-  return(theProjection);
-}
-
-bool ImgWriterGdal::getBoundingBox(double& ulx, double& uly, double& lrx, double& lry) const
-{
-  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
-  m_gds->GetGeoTransform(gt);
-
-  //assuming
-  //adfGeotransform[0]: ULX (upper left X coordinate)
-  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[3]: ULY (upper left Y coordinate)
-  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
-  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
-
-  ulx=gt[0];
-  uly=gt[3];
-  lrx=gt[0]+nrOfCol()*gt[1]+nrOfRow()*gt[2];
-  lry=gt[3]+nrOfCol()*gt[4]+nrOfRow()*gt[5];
-  if(isGeoRef()){
-    // ulx=m_ulx;
-    // uly=m_uly;
-    // lrx=ulx+nrOfCol()*m_delta_x;
-    // lry=uly-nrOfRow()*m_delta_y;
-    return true;
-  }
-  else{
-    // ulx=0;
-    // uly=nrOfRow()-1;
-    // lrx=nrOfCol()-1;
-    // lry=0;
-    return false;
-  }
-}
-
-bool ImgWriterGdal::getCentrePos(double& x, double& y) const
-{
-  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
-  m_gds->GetGeoTransform(gt);
-
-  //assuming
-  //adfGeotransform[0]: ULX (upper left X coordinate)
-  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[3]: ULY (upper left Y coordinate)
-  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
-  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
-  x=gt[0]+(nrOfCol()/2.0)*gt[1]+(nrOfRow()/2.0)*gt[2];
-  y=gt[3]+(nrOfCol()/2.0)*gt[4]+(nrOfRow()/2.0)*gt[5];
-  if(isGeoRef()){
-    // x=m_ulx+nrOfCol()/2.0*m_delta_x;
-    // y=m_uly-nrOfRow()/2.0*m_delta_y;
-    return true;
-  }
-  else
-    return false;
-}
-
-bool ImgWriterGdal::geo2image(double x, double y, double& i, double& j) const
-{
-  //double values are returned, caller is responsible for interpolation step
-  //double values are returned, caller is responsible for interpolation step
-  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
-  m_gds->GetGeoTransform(gt);
-  //assuming
-  //adfGeotransform[0]: ULX (upper left X coordinate)
-  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[3]: ULY (upper left Y coordinate)
-  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
-  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
-  double denom=(gt[1]-gt[2]*gt[4]/gt[5]);
-  double eps=0.00001;
-  if(fabs(denom)>eps){
-    i=(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom;
-    j=(y-gt[3]-gt[4]*(x-gt[0]-gt[2]/gt[5]*(y-gt[3]))/denom)/gt[5];
-  }
-  if(isGeoRef()){
-    // double ulx=m_ulx;
-    // double uly=m_uly;
-    // i=(x-ulx)/m_delta_x;
-    // j=(uly-y)/m_delta_y;
-    return true;
-  }
-  else{
-    // i=x;
-    // j=nrOfRow()-y;
-    return false;
-  }
-}
-
-//centre of pixel is always returned (regardless of magic pixel reference)!
-bool ImgWriterGdal::image2geo(double i, double j, double& x, double& y) const
-{
-  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
-  m_gds->GetGeoTransform(gt);
-
-  //assuming
-  //adfGeotransform[0]: ULX (upper left X coordinate)
-  //adfGeotransform[1]: $cos(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[2]: $-sin(\alpha)\cdot\textrm{Xres}$
-  //adfGeotransform[3]: ULY (upper left Y coordinate)
-  //adfGeotransform[4]: $-sin(\alpha)\cdot\textrm{Yres}$
-  //adfGeotransform[5]: $-cos(\alpha)\cdot\textrm{Yres}$
-
-  x=gt[0]+(0.5+i)*gt[1]+(0.5+j)*gt[2];
-  y=gt[3]+(0.5+i)*gt[4]+(0.5+j)*gt[5];
-
-  if(isGeoRef()){
-    // x=m_ulx+(0.5+i)*m_delta_x;
-    // y=m_uly-(0.5+j)*m_delta_y;
-    return true;
-  }
-  else
-    return false;
-}
-
-bool ImgWriterGdal::covers(double x, double  y) const
-{
-  double theULX, theULY, theLRX, theLRY;
-  getBoundingBox(theULX,theULY,theLRX,theLRY);
-  return((x > theULX)&&
-	 (x < theLRX)&&
-	 (y < theULY)&&
-	 (y >theLRY));
-}
-
-bool ImgWriterGdal::covers(double ulx, double  uly, double lrx, double lry) const
-{
-  double theULX, theULY, theLRX, theLRY;
-  getBoundingBox(theULX,theULY,theLRX,theLRY);
-  return((ulx < theLRX)&&(lrx > theULX)&&(lry < theULY)&&(uly > theLRY));
-}
-
-std::string ImgWriterGdal::getGeoTransform() const
-{
-  double gt[6];// { 444720, 30, 0, 3751320, 0, -30 };
-  if(m_gds)
-    m_gds->GetGeoTransform(gt);
-  else{//virtual writer
-    gt[0]=m_gt[0];
-    gt[1]=m_gt[1];
-    gt[2]=m_gt[2];
-    gt[3]=m_gt[3];
-    gt[4]=m_gt[4];
-    gt[5]=m_gt[5];
-  }
-  std::ostringstream s;
-  s << "[" << gt[0] << "," << gt[1] << "," << gt[2] << "," << gt[3] << "," << gt[4] << "," << gt[5] << "]";
-  return(s.str());
-}
-
-void ImgWriterGdal::getGeoTransform(double* gt) const{
-  if(m_gds)
-    m_gds->GetGeoTransform(gt);
-  else{//virtual writer
-    gt[0]=m_gt[0];
-    gt[1]=m_gt[1];
-    gt[2]=m_gt[2];
-    gt[3]=m_gt[3];
-    gt[4]=m_gt[4];
-    gt[5]=m_gt[5];
-  }
-}
-
-// void ImgWriterGdal::getGeoTransform(double& ulx, double& uly, double& deltaX, double& deltaY, double& rot1, double& rot2) const
+// std::string ImgWriterGdal::setProjection(void)
 // {
-//   if(m_gds){
-//     double adfGeoTransform[6];// { 444720, 30, 0, 3751320, 0, -30 };
-//     m_gds->GetGeoTransform(adfGeoTransform);
-//     ulx=adfGeoTransform[0];
-//     deltaX=adfGeoTransform[1];
-//     rot1=adfGeoTransform[2];
-//     uly=adfGeoTransform[3];
-//     rot2=adfGeoTransform[4];
-//     deltaY=-adfGeoTransform[5];//convention of GDAL!
-//   }
-//   else{//virtual writer
-//     ulx=m_ulx;
-//     uly=m_uly;
-//     deltaX=m_delta_x;
-//     deltaY=m_delta_y;
-//     rot1=0;
-//     rot2=0;
-//   }
+//   std::string theProjection;
+//   OGRSpatialReference oSRS;
+//   char *pszSRS_WKT = NULL;
+//   //// oSRS.importFromEPSG(3035);
+//   oSRS.SetGeogCS("ETRS89","European_Terrestrial_Reference_System_1989","GRS 1980",6378137,298.2572221010042,"Greenwich",0,"degree",0.0174532925199433);
+//   // cout << setprecision(16) << "major axis: " << oSRS.GetSemiMajor(NULL) << endl;//notice that major axis can be set to a different value than the default to the well known standard corresponding to the name (European_Terrestrial_Reference_System_1989), but that new value, while recognized by GetSemiMajor, will not be written in the geotiff tag!
+//   oSRS.SetProjCS( "ETRS89 / ETRS-LAEA" );
+//   oSRS.SetLAEA(52,10,4321000,3210000);
+//   oSRS.exportToWkt( &pszSRS_WKT );
+//   theProjection=pszSRS_WKT;
+//   CPLFree( pszSRS_WKT );
+//   assert(m_gds);
+//   m_gds->SetProjection(theProjection.c_str());
+//   return(theProjection);
 // }
 
-GDALDataType ImgWriterGdal::getDataType(int band) const
-{
-  assert(band<m_nband+1);
-  return (m_gds->GetRasterBand(band+1))->GetRasterDataType();
-}
-
-GDALRasterBand* ImgWriterGdal::getRasterBand(int band)
-{
-  assert(band<m_nband+1);
-  return (m_gds->GetRasterBand(band+1));
-}
-
 //filename is ascii file containing 5 columns: index R G B ALFA (0:transparent, 255:solid)
 void ImgWriterGdal::setColorTable(const std::string& filename, int band)
 {
diff --git a/src/imageclasses/ImgWriterGdal.h b/src/imageclasses/ImgWriterGdal.h
index 01ef60d..9c7fcd0 100644
--- a/src/imageclasses/ImgWriterGdal.h
+++ b/src/imageclasses/ImgWriterGdal.h
@@ -25,46 +25,28 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 #include <string>
 #include <sstream>
 #include "gdal_priv.h"
+#include "ImgRasterGdal.h"
 #include "ImgReaderGdal.h"
 #include "ImgReaderOgr.h"
 
 //--------------------------------------------------------------------------
-class ImgWriterGdal
+class ImgWriterGdal : public virtual ImgRasterGdal
 {
 public:
   ImgWriterGdal(void);
   ~ImgWriterGdal(void);
   void open(const std::string& filename);
   void open(const std::string& filename, const ImgReaderGdal& imgSrc, const std::vector<std::string>& options=std::vector<std::string>());
-  // void open(const std::string& filename, int ncol, int nrow, int nband, const GDALDataType& dataType, const std::string& imageType="GTiff", const std::string& interleave="BAND", const std::string& compression="LZW", int magicX=1, int magicY=1);
   void open(const std::string& filename, int ncol, int nrow, int nband, const GDALDataType& dataType, const std::string& imageType, const std::vector<std::string>& options=std::vector<std::string>());
   void close(void);
-  std::string getFileName() const {return m_filename;};
-  int nrOfCol(void) const { return m_ncol;};
-  int nrOfRow(void) const { return m_nrow;};
-  int nrOfBand(void) const { return m_nband;};
+
   void copyGeoTransform(const ImgReaderGdal& imgSrc);
-  std::string setProjection(void);//set (and return) default projection ETSR-LAEA
   void setProjection(const std::string& projection);
   std::string setProjectionProj4(const std::string& projection);
+
   void setImageDescription(const std::string& imageDescription){m_gds->SetMetadataItem( "TIFFTAG_IMAGEDESCRIPTION",imageDescription.c_str());};
-  CPLErr GDALSetNoDataValue(double noDataValue, int band=0) {return getRasterBand(band)->SetNoDataValue(noDataValue);};
-  std::string getProjection(void) const;
-  std::string getGeoTransform() const;
-  void getGeoTransform(double* gt) const;
   void setGeoTransform(double* gt);
-  /* void setGeoTransform(double ulx, double uly, double deltaX, double deltaY, double rot1=0, double rot2=0); */
-  /* void getGeoTransform(double& ulx, double& uly, double& deltaX, double& deltaY, double& rot1, double& rot2) const; */
-  bool getBoundingBox(double& ulx, double& uly, double& lrx, double& lry) const;
-  bool getCentrePos(double& x, double& y) const;
-  bool covers(double x, double y) const;
-  bool covers(double ulx, double  uly, double lrx, double lry) const;
-  bool geo2image(double x, double y, double& i, double& j) const;
-  bool image2geo(double i, double j, double& x, double& y) const;
-  bool isGeoRef() const {double gt[6];getGeoTransform(gt);if(gt[5]<0) return true;else return false;};
-  // void getMagicPixel(double& x, double& y) const {x=m_magic_x;y=m_magic_y;};
-  double getDeltaX(void) const {double gt[6];getGeoTransform(gt);return gt[1];};
-  double getDeltaY(void) const {double gt[6];getGeoTransform(gt);return -gt[5];};
+
   template<typename T> bool writeData(T& value, const GDALDataType& dataType, int col, int row, int band=0) const;
   template<typename T> bool writeData(std::vector<T>& buffer, const GDALDataType& dataType , int minCol, int maxCol, int row, int band=0) const;
   template<typename T> bool writeData(std::vector<T>& buffer, const GDALDataType& dataType, int row, int band=0) const;
@@ -72,24 +54,15 @@ public:
   template<typename T> bool writeDataBlock(Vector2d<T>& buffer, const GDALDataType& dataType , int minCol, int maxCol, int minRow, int maxRow, int band=0) const;
   // std::string getInterleave(){return m_interleave;};
   // std::string getCompression(){return m_compression;};
-  GDALDataType getDataType(int band=0) const;
-  GDALRasterBand* getRasterBand(int band);
   void setColorTable(const std::string& filename, int band=0);
   void setColorTable(GDALColorTable* colorTable, int band=0);
   void setMetadata(char** metadata);
   void rasterizeOgr(ImgReaderOgr& ogrReader, const std::vector<double>& burnValues=std::vector<double>(), const std::vector<std::string>& layernames=std::vector<std::string>());
 
 protected:
-  void setCodec(const std::string& imageType);
+  void setCodec(const GDALDataType& dataType, const std::string& imageType);
   void setCodec(const ImgReaderGdal& ImgSrc);
 
-  std::string m_filename;
-  GDALDataset *m_gds;
-  int m_ncol;
-  int m_nrow;
-  int m_nband;
-  GDALDataType m_type;
-  double m_gt[6];
   /* double m_ulx; */
   /* double m_uly; */
   /* double m_delta_x; */
diff --git a/src/imageclasses/Makefile.am b/src/imageclasses/Makefile.am
index 216c7d2..d241f80 100644
--- a/src/imageclasses/Makefile.am
+++ b/src/imageclasses/Makefile.am
@@ -18,8 +18,8 @@ libimageClasses_ladir = $(includedir)/pktools/imageclasses
 libimageClasses_la_LDFLAGS = -version-info $(PKTOOLS_SO_VERSION) $(AM_LDFLAGS) -lgsl
 
 # the list of header files that belong to the library (to be installed later)
-libimageClasses_la_HEADERS = ImgReaderGdal.h  ImgReaderOgr.h  ImgWriterGdal.h  ImgWriterOgr.h
+libimageClasses_la_HEADERS = ImgRasterGdal.h ImgReaderGdal.h  ImgReaderOgr.h  ImgWriterGdal.h  ImgWriterOgr.h ImgUpdaterGdal.h
 
 # the sources to add to the library and to add to the source distribution
-libimageClasses_la_SOURCES = $(libimageClasses_la_HEADERS) ImgReaderGdal.cc  ImgReaderOgr.cc  ImgWriterGdal.cc  ImgWriterOgr.cc
+libimageClasses_la_SOURCES = $(libimageClasses_la_HEADERS) ImgRasterGdal.cc ImgReaderGdal.cc  ImgReaderOgr.cc  ImgWriterGdal.cc  ImgWriterOgr.cc ImgUpdaterGdal.cc
 ###############################################################################
diff --git a/src/imageclasses/Makefile.in b/src/imageclasses/Makefile.in
index 1a61779..5d94d33 100644
--- a/src/imageclasses/Makefile.in
+++ b/src/imageclasses/Makefile.in
@@ -125,8 +125,9 @@ am__installdirs = "$(DESTDIR)$(libdir)" \
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libimageClasses_la_LIBADD =
 am__objects_1 =
-am_libimageClasses_la_OBJECTS = $(am__objects_1) ImgReaderGdal.lo \
-	ImgReaderOgr.lo ImgWriterGdal.lo ImgWriterOgr.lo
+am_libimageClasses_la_OBJECTS = $(am__objects_1) ImgRasterGdal.lo \
+	ImgReaderGdal.lo ImgReaderOgr.lo ImgWriterGdal.lo \
+	ImgWriterOgr.lo ImgUpdaterGdal.lo
 libimageClasses_la_OBJECTS = $(am_libimageClasses_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
@@ -371,10 +372,10 @@ libimageClasses_ladir = $(includedir)/pktools/imageclasses
 libimageClasses_la_LDFLAGS = -version-info $(PKTOOLS_SO_VERSION) $(AM_LDFLAGS) -lgsl
 
 # the list of header files that belong to the library (to be installed later)
-libimageClasses_la_HEADERS = ImgReaderGdal.h  ImgReaderOgr.h  ImgWriterGdal.h  ImgWriterOgr.h
+libimageClasses_la_HEADERS = ImgRasterGdal.h ImgReaderGdal.h  ImgReaderOgr.h  ImgWriterGdal.h  ImgWriterOgr.h ImgUpdaterGdal.h
 
 # the sources to add to the library and to add to the source distribution
-libimageClasses_la_SOURCES = $(libimageClasses_la_HEADERS) ImgReaderGdal.cc  ImgReaderOgr.cc  ImgWriterGdal.cc  ImgWriterOgr.cc
+libimageClasses_la_SOURCES = $(libimageClasses_la_HEADERS) ImgRasterGdal.cc ImgReaderGdal.cc  ImgReaderOgr.cc  ImgWriterGdal.cc  ImgWriterOgr.cc ImgUpdaterGdal.cc
 all: all-am
 
 .SUFFIXES:
@@ -454,8 +455,10 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ImgRasterGdal.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ImgReaderGdal.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ImgReaderOgr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ImgUpdaterGdal.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ImgWriterGdal.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ImgWriterOgr.Plo at am__quote@
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pktools.git



More information about the Pkg-grass-devel mailing list